PDF 文档格式

今天,可移植文档格式(PDF)属于最常用的数据格式。 1990年,Adobe定义了PDF文档格式。 PDF格式背后的想法是传输的数据/文档对于通信过程中涉及的双方——创建者,作者或发送者和接收者来说看起来完全相同。 PDF是PostScript格式的后续版本,标准化为ISO 32000-2:2017。

处理PDF文档

对于Linux,有很多可用的命令行工具,如pdftk和pdfgrep来操作pdf。 作为开发人员,您可以构建自己的基于Python的软件,并使用免费提供的PDF库。

本文是一个小系列的开头,将介绍这些有用的Python库。 在第一部分中,我们将重点介绍现有PDF的操作。 您将学习如何阅读和提取内容(文本和图像),旋转单个页面以及将文档拆分为单独的页面。 第二部分将介绍如何根据叠加层添加水印。 第三部分将专注于编写/创建PDF,还将包括删除和重新组合单个页面到新文档。

工具和库

Python相关的PDF工具,模块和库的可用解决方案范围有点令人困惑,需要花一点时间来弄清楚什么是什么,以及哪些项目是持续维护的。 根据我们的研究,这些是目前最新的方案:

下面我们将重点介绍PyPDF2和PyMuPDF,并解释如何以最简单的方式提取文本和图像。 为了理解PyPDF2的用法,官方文档和其他资源提供的大量示例的组合。 相比之下,官方的PyMuPDF文档更清晰,使用库的速度要快得多。

用PyPDF2提取文档

PyPDF2可以作为常规软件包安装,也可以使用pip3(适用于Python3)安装。 这里的测试基于即将推出的Debian GNU / Linux版本10“Buster”的软件包。 Debian软件包的名称是python3-pypdf2。

下面的代码首先导入PdfFilereader 类,然后适用这个类打开文件,用getDocumentInfo() 方法来提取文档信息,包括页数和首页内容。

请注意PyPDF2页码计数从0开始,这也是为什么pdf.getPage(0) 函数可以获取文件的第一页。最终,提取到的信息被打印到了stdout

python编辑pdf内容(在Python中使用PDF阅读和拆分)(1)

使用PyMuPDF提取文本

PyMuPDF可从PyPi网站获得,您可以在终端中使用以下命令安装包:

python编辑pdf内容(在Python中使用PDF阅读和拆分)(2)

显示文档信息,打印页数和提取PDF文档的文本的方式与PyPDF2类似(参见清单2)。 要导入的模块名为fitz,并返回到PyMuPDF的先前名称。

python编辑pdf内容(在Python中使用PDF阅读和拆分)(3)

PyMuPDF的优点在于它保持原始文档结构的完整性 - 带有换行符的整个段落保留在PDF文档中。

使用PyMuPDF从PDF中提取图像

PyMuPDF使用getPageImageList()方法简化了从PDF文档中提取图像的过程。下面的代码来源于PyMuPDF wiki页面的示例,并逐页提取并保存PDF中的所有图像作为PNG文件。 如果图像具有CMYK颜色空间,则首先将其转换为RGB。

python编辑pdf内容(在Python中使用PDF阅读和拆分)(4)

在400页PDF上运行这个Python脚本,它在不到3秒的时间内提取了117个图像,这是惊人的。 各个图像以PNG格式存储。 为了保持原始图像格式和大小,而不是转换为PNG,请查看PyMuPDF wiki中脚本的扩展版本。

使用PyPDF2将PDF拆分为页面

对于此示例,首先需要导入PdfFileReader和PdfFileWriter类。 然后我们打开PDF文件,创建一个reader对象,并使用reader对象的getNumPages方法遍历所有页面。

在for循环中,我们创建了一个新的PdfFileWriter实例,它不包含任何页面。 然后,我们使用pdfWriter.addPage()方法将当前页面添加到writer对象。 此方法接受页面对象,我们使用PdfFileReader.getPage()方法获取该页面对象。

下一步是创建一个唯一的文件名,我们使用原始文件名加上“page”一词加上页码。 我们在当前页码中加1,因为PyPDF2计算从零开始的页码。

最后,我们以“write binary”模式(模式wb)打开新文件名,并使用pdfWriter类的write()方法将提取的页面保存到磁盘。

python编辑pdf内容(在Python中使用PDF阅读和拆分)(5)

查找包含文本的所有页面

这个功能非常实用,与pdfgrep类似。 使用PyMuPDF,脚本将返回包含给定搜索字符串的所有页码。 页面一个接一个地加载,并且在searchFor()方法的帮助下,检测到搜索字符串的所有出现。 如果匹配,则在stdout上打印相应的消息。

python编辑pdf内容(在Python中使用PDF阅读和拆分)(6)

结论:

这里讲解的方法非常强大。 使用相对较少数量的代码行,可以轻松获得结果。 更多功能在第二部分(即将推出!)中进行了研究,其中包括为PDF添加水印.

,