Python操作PDF文件

PDF 是 Portable Document Format 的缩写,这类文件通常使用.pdf作为其扩展名。在日常开发工作中,最容易遇到的就是从 PDF 中读取文本内容以及用已有的内容生成PDF文档这两个任务。

从PDF中提取文本

在 Python 中,可以使用名为PyPDF2的三方库来读取 PDF 文件,可以使用下面的命令来安装它。

Bash pip install PyPDF2

PyPDF2没有办法从 PDF 文档中提取图像、图表或其他媒体,但它可以提取文本,并将其返回为 Python 字符串。

```python import PyPDF2

reader = PyPDF2.PdfReader('test.pdf') for page in reader.pages: print(page.extract_text()) ```

提示:本章代码使用到的 PDF 文件都可以通过下面的百度云盘地址进行获取,链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g,提取码:e7b4。

当然,PyPDF2并不是什么样的 PDF 文档都能提取出文字来,这个问题就我所知并没有什么特别好的解决方法,尤其是在提取中文的时候。网上也有很多讲解从 PDF 中提取文字的文章,推荐大家自行阅读《三大神器助力Python提取pdf文档信息》一文进行了解。

要从 PDF 文件中提取文本也可以直接使用三方的命令行工具,具体的做法如下所示。

Bash pip install pdfminer.six pdf2text.py test.pdf

旋转和叠加页面

上面的代码中通过创建PdfFileReader对象的方式来读取 PDF 文档,该对象的getPage方法可以获得PDF文档的指定页并得到一个PageObject对象,通过PageObject对象的rotateClockwiserotateCounterClockwise方法可以实现页面的顺时针和逆时针方向旋转,通过PageObject对象的addBlankPage方法可以添加一个新的空白页,代码如下所示。

```python reader = PyPDF2.PdfReader('XGBoost.pdf') writer = PyPDF2.PdfWriter()

for no, page in enumerate(reader.pages): if no % 2 == 0: new_page = page.rotate(-90) else: new_page = page.rotate(90) writer.add_page(new_page)

with open('temp.pdf', 'wb') as file_obj: writer.write(file_obj) ```

加密PDF文件

使用PyPDF2中的PdfFileWrite对象可以为PDF文档加密,如果需要给一系列的PDF文档设置统一的访问口令,使用Python程序来处理就会非常的方便。

```python import PyPDF2

reader = PyPDF2.PdfReader('XGBoost.pdf') writer = PyPDF2.PdfWriter()

for page in reader.pages: writer.add_page(page)

writer.encrypt('foobared')

with open('temp.pdf', 'wb') as file_obj: writer.write(file_obj) ```

批量添加水印

上面提到的PageObject对象还有一个名为mergePage的方法,可以两个 PDF 页面进行叠加,通过这个操作,我们很容易实现给PDF文件添加水印的功能。例如要给上面的“XGBoost.pdf”文件添加一个水印,我们可以先准备好一个提供水印页面的 PDF 文件,然后将包含水印的PageObject读取出来,然后再循环遍历“XGBoost.pdf”文件的每个页,获取到PageObject对象,然后通过mergePage方法实现水印页和原始页的合并,代码如下所示。

```python reader1 = PyPDF2.PdfReader('XGBoost.pdf') reader2 = PyPDF2.PdfReader('watermark.pdf') writer = PyPDF2.PdfWriter() watermark_page = reader2.pages[0]

for page in reader1.pages: page.merge_page(watermark_page) writer.add_page(page)

with open('temp.pdf', 'wb') as file_obj: writer.write(file_obj) ```

如果愿意,还可以让奇数页和偶数页使用不同的水印,大家可以自己思考下应该怎么做。

创建PDF文件

创建 PDF 文档需要三方库reportlab的支持,安装的方法如下所示。

Bash pip install reportlab

下面通过一个例子为大家展示reportlab的用法。

```python from reportlab.lib.pagesizes import A4 from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfgen import canvas

pdf_canvas = canvas.Canvas('resources/demo.pdf', pagesize=A4) width, height = A4

绘图

image = canvas.ImageReader('resources/guido.jpg') pdf_canvas.drawImage(image, 20, height - 395, 250, 375)

显示当前页

pdf_canvas.showPage()

注册字体文件

pdfmetrics.registerFont(TTFont('Font1', 'resources/fonts/Vera.ttf')) pdfmetrics.registerFont(TTFont('Font2', 'resources/fonts/青呱石头体.ttf'))

写字

pdf_canvas.setFont('Font2', 40) pdf_canvas.setFillColorRGB(0.9, 0.5, 0.3, 1) pdf_canvas.drawString(width // 2 - 120, height // 2, '你好,世界!') pdf_canvas.setFont('Font1', 40) pdf_canvas.setFillColorRGB(0, 1, 0, 0.5) pdf_canvas.rotate(18) pdf_canvas.drawString(250, 250, 'hello, world!')

保存

pdf_canvas.save() ```

上面的代码如果不太理解也没有关系,等真正需要用 Python 创建 PDF 文档的时候,再好好研读一下reportlab官方文档就可以了。

提示:上面代码中用到的图片和字体可以通过下面的百度云盘链接获取,链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g,提取码:e7b4。

总结

在学习完上面的内容之后,相信大家已经知道像合并多个 PDF 文件这样的工作应该如何用 Python 代码来处理了,赶紧自己动手试一试吧。