PyPDF2 库,用于在 Python 中处理 PDF 文件
PDF 是可移植文档格式 (Portable Document Format) 的缩写,文件扩展名为 .pdf。用户主要使用此格式进行文档共享,因为它保留了原始格式,确保文档在各种平台上(无论使用何种硬件、软件或操作系统)都能保持一致。这种一致性使 PDF 成为在全球范围内分发、查看和确保文档完整性的首选格式。
PDF 最初由 Adobe 开发,现已超越其专有属性,成为受国际标准化组织 (ISO) 管理的开放标准。向 ISO 标准的过渡进一步巩固了 PDF 作为数字文档管理基石的地位,并促进了其在学术出版和商业通信等广泛领域的应用。
在本文中,云朵君将和大家一起学习如何使用 Python 处理 PDF 文件。涵盖以下主题:
如何从 PDF 文件中提取文本。 如何旋转 PDF 文件的页面。 如何从 PDF 文件中提取文档信息。 如何从 PDF 文件中拆分页面。 如何加密 PDF 文件。 如何向 PDF 文件添加水印。
Python 中一些常用的 PDF 库
有许多可以免费使用 PDF 的库:
PDFMiner:这是一个从 PDF 中提取文本的开源工具。它用于对数据进行分析。它也可以用作 PDF 转换器或 PDF 解析器。 PDFQuery:它是 PDFMiner、Ixml 和 PyQuery 的轻量级 Python 包装器。它是一个快速、用户友好的 PDF 抓取库。 Tabula.py :它是tabula.java的 Python 包装器。它将 PDF 文件转换为 Pandas 数据框,允许您对数据框执行所有数据操作。 Xpdf:它允许将 PDF 转换为文本。 pdflib:它是 poppler 库的扩展,其中包含 python 绑定。 Slate:它是一个基于 PDFMiner 的 Python 包,用于从 PDF 中提取文本。 PyPDF2:这个 Python 库主要处理 PDF 文件,例如提取文档特定信息、合并 PDF 文件、拆分 PDF 页面、为文件添加水印以及加密或解密 PDF 文件。本文将使用 PyPDF2 库。它是一个纯 Python 库,因此可以在任何平台上运行,无需依赖任何平台相关的外部库。
PyPDF2 库入门
PyPDF2 是一个功能全面的 Python 库,专为 PDF 文件操作而设计。它允许用户创建、修改和提取 PDF 文档中的内容。PyPDF2 完全由 Python 构建,不依赖任何外部模块,使其成为 Python 开发人员易于使用的工具。
该库提供双 API 系统,以满足不同的编程需求。低级 API 受 Pygments 启发,能够编写高效生成或操作文档的程序。而高级 API 则受 ReportLab 的影响,简化了复杂文档(从表单到整本书籍或杂志)的创建,并且只需极少的编码工作。
主要特点
将 PDF 转换为 PNG 或 JPEG 等图像格式,以及转换为文本文件。 从头开始生成新的 PDF 文档。 通过添加、删除或更改页面来修改现有的 PDF。 高级编辑功能,如页面旋转、添加水印、调整字体等。 只要有必要的证书,就可以使用数字签名来保护文档。
PyPDF2 专为高效而设计,利用原生 C 代码执行解析等密集型操作,确保最佳性能,同时又不牺牲其 Pythonic 接口的简洁性。此外,该库是线程安全的,内存占用适中,与 Python 自身大小(约 1MB)相当,对于希望在项目中管理 PDF 文档的开发人员来说,它既强大又轻量。
PyPDF2 的用例
PyPDF2 的灵活性和命令行界面使其成为将 PDF 处理集成到您的工作流程或 Python 项目的理想选择。以下是 PyPDF2 的一些实际应用:
PDF 转换为 Word 或其他格式
传统上,将 PDF 转换为 Word 或其他文件格式需要针对每种转换类型专门的软件,这可能效率低下,尤其是在处理多个文档时。PyPDF2 提供了一种简化的替代方案,使用户能够在 Python 脚本中或通过命令行指令自动执行转换过程,从而显著简化了将 PDF 文件转换为所需格式的任务。
合并多个 PDF 文档
无论您要编写报告、合并书籍章节还是合并财务报表,PyPDF2 都能简化将多个 PDF 文件合并为单个文档的流程。此功能对于从不同来源创建统一的文档、增强组织性和可访问性至关重要。
修改 PDF 文档内容
PyPDF2 的功能远不止基本的文件操作,它还允许对 PDF 文档进行精细的修改。用户可以添加或删除页面、提取文本进行分析,甚至可以将图像或其他对象插入到现有的 PDF 中。这种级别的控制能力使 PyPDF2 成为一款多功能工具,可根据特定需求定制文档。
将 PDF 拆分成更小的部分
大型 PDF 文档可能难以处理,难以共享或处理。PyPDF2 提供了强大的工具,可将单个大型文档拆分为多个更易于管理的小文件,从而解决了这一难题。无论您需要按页码、按固定间隔(每 n 页)还是根据文档元数据(例如作者或标题)拆分文档,PyPDF2 都能为您提供必要的功能。
增强功能和其他用例
提取和分析 PDF 内容:PyPDF2 可用于文本挖掘和分析,从 PDF 中提取文本以用于数据分析项目、自然语言处理或内容聚合。 自动生成报告:通过将数据和文本编译成专业格式的 PDF(并动态添加图形、表格和文本)来自动创建报告。 保护 PDF:通过加密 PDF、设置权限或添加数字签名来实施安全措施,以保护敏感信息。 自定义 PDF 创建:使用 PyPDF2 以编程方式创建符合精确布局和内容规范的文档,从零开始生成自定义 PDF。总而言之,PyPDF2 不仅仅是一个用于操作 PDF 文件的库;它还是一套功能全面的工具集,可处理各种 PDF 相关任务,从文档转换和合并到复杂的修改和自动报告生成。其强大的功能使其成为专业人士、开发人员和业余爱好者寻求简化文档管理流程的必备资源。
安装 PyPDF2 库
要安装 PyPDF2,请在命令提示符中复制以下命令并运行:
pip install PyPDF2
获取文档详细信息
PyPDF2 提供 PDF 文档的元数据。这些信息可能与 PDF 文件有关,例如文档的作者、标题、制作者、主题等,均可直接获取。
要提取上述信息,请运行以下代码:
from PyPDF2 import PdfFileReader
pdf_path=r"Tesseractexample.pdf"
with open(pdf_path, 'rb') as f:
pdf = PdfFileReader(f)
information = pdf.getDocumentInfo()
number_of_pages = pdf.getNumPages()
print(information)
格式化输出:
print("Author" +': ' + information.author)
print("Creator" +': ' + information.creator)
print("Producer" +': ' + information.producer)
从 PDF 中提取文本
由于 PyPDF2 的文本提取功能有限,使用 PyPDF2 从 PDF 中提取文本可能颇具挑战性。代码生成的输出格式可能不太好,经常会因为 PyPDF2 的文本提取支持受限而导致输出内容杂乱,充斥着换行符。
为了提取文本,我们将读取文件并创建该文件的 PDF 对象。
# creating a pdf file object
pdfFileObject = open(pdf_path, 'rb')
然后我们将创建一个 PDFReader 类对象并将 PDF 文件对象传递给它。
创建 pdf 阅读器对象
pdfReader = PyPDF2.PdfFileReader(pdfFileObject)
最后,我们将提取每个页面并连接每个页面的文本。
text=''
for i in range(0,pdfReader.numPages):
# creating a page object
pageObj = pdfReader.getPage(i)
# extracting text from page
text=text+pageObj.extractText()
print(text)
输出文本如下:
旋转 PDF 页面
要旋转 PDF 文件的某一页并将其保存到另一个文件,请复制以下代码并运行它。
pdf_read = PdfFileReader(r"C:UsersDellDesktopstory.pdf")
pdf_write = PdfFileWriter()
# Rotate page 90 degrees to the right
page1 = pdf_read.getPage(0).rotateClockwise(90)
pdf_write.addPage(page1)
with open(r'C:UsersDellDesktoprotate_pages.pdf', 'wb') as fh:
pdf_write.write(fh)
使用 Python 合并 PDF 文件
我们还可以使用以下命令合并两个或多个 PDF 文件:
pdf_read = PdfFileReader(r”C:UsersDellDesktopstory.pdf”)pdf_write = PdfFileWriter()
# Rotate page 90 degrees to the right
page1 = pdf_read.getPage(0).rotateClockwise(90)
pdf_write.addPage(page1)
with open(r'C:UsersDellDesktoprotate_pages.pdf', 'wb') as fh:
pdf_write.write(fh)
输出的PDF如下所示:
拆分 PDF 页面
我们可以将 PDF 拆分成单独的页面,然后将它们再次保存为 PDF。
fname = os.path.splitext(os.path.basename(pdf_path))[0]
for page in range(pdf.getNumPages()):
pdfwrite = PdfFileWriter()
pdfwrite.addPage(pdf.getPage(page))
outputfilename = '{}_page_{}.pdf'.format(
fname, page+1)
with open(outputfilename, 'wb') as out:
pdfwrite.write(out)
print('Created: {}'.format(outputfilename))
pdf = PdfFileReader(pdf_path)
加密PDF文件
PDF 文件的加密意味着为文件添加密码。每次打开文件时,系统都会提示输入文件密码。这样就可以对内容进行密码保护。此时会弹出以下窗口:
我们可以使用以下代码来实现相同的目的:
for page in range(pdf.getNumPages()):
pdfwrite.addPage(pdf.getPage(page))
pdfwrite.encrypt(user_pwd=password, owner_pwd=None,
use_128bit=True)
with open(outputpdf, 'wb') as fh:
pdfwrite.write(fh)
向 PDF 文件添加水印
水印是出现在每个页面上的识别图像或图案。它可以是公司徽标,也可以是任何要在每页上体现的醒目信息。要为 PDF 的每个页面添加水印,请复制以下代码并运行。
originalfile = r"C:UsersDellDesktopTesting Tesseractexample.pdf"
watermark = r"C:UsersDellDesktopTesting Tesseractwatermark.pdf"
watermarkedfile = r"C:UsersDellDesktopTesting Tesseractwatermarkedfile.pdf"
watermark = PdfFileReader(watermark)
watermarkpage = watermark.getPage(0)
pdf = PdfFileReader(originalfile)
pdfwrite = PdfFileWriter()
for page in range(pdf.getNumPages()):
pdfpage = pdf.getPage(page)
pdfpage.mergePage(watermarkpage)
pdfwrite.addPage(pdfpage)
with open(watermarkedfile, 'wb') as fh:
pdfwrite.write(fh)
上述代码读取两个文件——输入文件和水印。读取每一页后,它会将水印附加到每一页,并将新文件保存在同一位置。
写在最后
PyPDF2 是一款高度便捷的 PDF 文件转换解决方案,以其开源特性和强大的集成功能而备受赞誉。其托管在 GitHub 上的全面在线文档,确保即使是时间紧迫的用户也能快速完成设置和执行,并通过条理清晰的文档和示例简化学习曲线。如果您需要进一步帮助或希望做出贡献,GitHub 上的 PyPDF2 社区欢迎您的咨询和贡献,从而营造一个支持和持续改进的环境。
该库不仅用户友好,而且在设计时充分考虑了自动化和集成,使其成为希望将 PDF 操作融入其工作流程或应用程序的开发人员的首选。由于 PyPDF2 可在 PyPI 上获取,因此对于任何 Python 项目来说,安装它都非常简单。此外,它与 HTML 和其他格式的兼容性增强了其处理各种文档转换任务的多功能性。
PyPDF2 除了 Python 之外无需依赖其他任何组件,因此在不同操作系统之间具有出色的可移植性,确保开发人员可以在各种环境中部署它,而不会出现兼容性问题。PyPDF2 采用 BSD 风格的许可证,允许开发人员将其包含在商业软件包中,而无需担心法律问题。
本质上,PyPDF2 对于想要自动化 PDF 操作的 Python 开发者来说是一款非常宝贵的工具,它兼具易用性、效率和适应性。无论您是生成报告、转换文档,还是将 PDF 功能集成到更大的系统中,PyPDF2 强大的功能集和强大的社区支持都使其成为备受推荐的资源。
🏴☠️宝藏级🏴☠️ 原创公众号『数据STUDIO』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括可戳👉Python|MySQL|数据分析|数据可视化|机器学习与数据挖掘|爬虫等,从入门到进阶!
长按👇关注- 数据STUDIO -设为星标,干货速递