本日,可移植文档格式(PDF)属于最常用的数据格式。 1990年,Adobe定义了PDF文档格式。 PDF格式背后的想法是传输的数据/文档对付通信过程中涉及的双方——创建者,作者或发送者和吸收者来说看起来完备相同。 PDF是PostScript格式的后续版本,标准化为ISO 32000-2:2017。
处理PDF文档
对付Linux,有很多可用的命令行工具,如pdftk和pdfgrep来操作pdf。 作为开拓职员,您可以构建自己的基于Python的软件,并利用免费供应的PDF库。

本文是一个小系列的开头,将先容这些有用的Python库。 在第一部分中,我们将重点先容现有PDF的操作。 您将学习如何阅读和提取内容(文本和图像),旋转单个页面以及将文档拆分为单独的页面。 第二部分将先容如何根据叠加层添加水印。 第三部分将专注于编写/创建PDF,还将包括删除和重新组合单个页面到新文档。
工具和库
Python干系的PDF工具,模块和库的可用办理方案范围有点令人困惑,须要花一点韶光来弄清楚什么是什么,以及哪些项目是持续掩护的。 根据我们的研究,这些是目前最新的方案:
PyPDF2:这是一个Python库,用于提取文档信息和内容,逐页拆分文档,合并文档,裁剪页面和添加水印。 PyPDF2支持未加密和加密的文档。
PDFMiner:完备用Python编写,适用于Python 2.4。对付Python 3,请利用克隆包PDFMiner.six。这两个包都许可您解析,剖析和转换PDF文档。包括对PDF 1.7以及CJK措辞(中文,日文和韩文)以及各种字体类型(Type1,TrueType,Type3和CID)的支持。
PDFQuery:它将自己描述为“一个快速且友好的PDF抓取库”,它作为PDFMiner,lxml和pyquery的包装器实现。它的设计目标是“用尽可能少的代码可靠地从PDF凑集中提取数据。”
tabula-py:它是tabula-java的大略Python包装器,可以从PDF中读取表并将它们转换为Pandas DataFrames。它还许可您将PDF文件转换为CSV / TSV / JSON文件。
pdflib for Python:Poppler库的扩展,为它供应Python绑定。它许可您解析,剖析和转换PDF文档。不要与其同名的商业吊坠相稠浊。
PyFPDF:用于在Python下天生PDF文档的库。从FPDF PHP库移植,一个众所周知的PDFlib扩展更换,包含许多示例,脚本和衍生产品。
PDFTables:一种商业做事,供应从PDF文档中提取的表格。供应API以便PDFTable可以用作SAAS。
PyX - Python图形包:PyX是一个用于创建PostScript,PDF和SVG文件的Python包。它结合了PostScript绘图模型的抽象和TeX / LaTeX接口。这些基元构建了繁芜的任务,例如以发布就绪质量创建2D和3D图。
ReportLab:一个年夜志勃勃的工业级图书馆,紧张致力于精确创建PDF文档。可作为开源版本以及名为ReportLab PLUS的商业增强版本免费供应。
PyMuPDF(别号“fitz”):MuPDF的Python绑定,它是一个轻量级的PDF和XPS查看器。该库可以访问PDF,XPS,OpenXPS,epub,漫画和小说书籍格式的文件,并以其顶级性能和高渲染质量而有名。
pdfrw:一种基于Python的纯PDF解析器,用于读写PDF。它虔诚地再现了矢量格式而没有光栅化。与ReportLab结合利用,有助于在利用ReportLab创建的新PDF中重复利用现有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。
利用PyMuPDF提取文本
PyMuPDF可从PyPi网站得到,您可以在终端中利用以下命令安装包:
显示文档信息,打印页数和提取PDF文档的文本的办法与PyPDF2类似(拜会清单2)。 要导入的模块名为fitz,并返回到PyMuPDF的先前名称。
PyMuPDF的优点在于它保持原始文档构造的完全性 - 带有换行符的全体段落保留在PDF文档中。
利用PyMuPDF从PDF中提取图像
PyMuPDF利用getPageImageList()方法简化了从PDF文档中提取图像的过程。下面的代码来源于PyMuPDF wiki页面的示例,并逐页提取并保存PDF中的所有图像作为PNG文件。 如果图像具有CMYK颜色空间,则首先将其转换为RGB。
在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()方法将提取的页面保存到磁盘。
查找包含文本的所有页面
这个功能非常实用,与pdfgrep类似。 利用PyMuPDF,脚本将返回包含给定搜索字符串的所有页码。 页面一个接一个地加载,并且在searchFor()方法的帮助下,检测到搜索字符串的所有涌现。 如果匹配,则在stdout上打印相应的。
结论:
这里讲解的方法非常强大。 利用相对较少数量的代码行,可以轻松得到结果。 更多功能在第二部分(即将推出!
)中进行了研究,个中包括为PDF添加水印.