Portable Document Format(可移植文档格式),或者PDF是一种文件格式,可以用于跨操作系统的呈现和文档交换。尽管PDF最初是由Adobe发明的,但它现在是由国际标准化组织(ISO)维护的开放标准。你可以通过使用PyPDF2包在Python中处理已先存在的PDF。
PyPDF2是一个纯Python包,可用于许多不同类型的PDF操作。
本文将带你了解如何执行以下操作:
从Python中提取PDF中的文档信息
- 旋转页面
- 合并PDF
- 拆分PDF
- 添加水印
- 加密PDF
一、pyPdf,PyPDF2和PyPDF4的历史
最初的pyPdf软件包于2005年发布。pyPdf的最后一个正式版本是在2010年。大约一年后,一家名为Phasit的公司赞助了一个名为PyPDF2的pyPdf分支。该代码编写为向后与原始代码兼容,并且用了好多年,效果一直很好,其最后一个版本是在2016年。
有一个名为PyPDF3的软件包简短系列版本,然后该项目被重命名为PyPDF4。所有这些项目都完全相同,但pyPdf和PyPDF2 +之间的最大区别在于后者版本增加了Python 3支持。Python 3的原始pyPdf有一个不同的Python 3分支,但是这个分支已经多年没有维护了。
虽然最近放弃了PyPDF2,但新的PyPDF4与PyPDF2没有完全的向后兼容性。本文中的大多数示例都可以与PyPDF4完美配合,但也有一些不能,这就是为什么PyPDF4在本文中没有更多的特色。随意用PyPDF4替换PyPDF2的导入,看看它是如何工作的。
二、pdfrw:一个替代的PDF操作包
Patrick Maupin创建了一个名为pdfrw的软件包,它可以完成许多与PyPDF2相同的工作。除了加密的特殊情况外,本文后面提到PyPDF2的所有操作,pdfrw均可以实现。
pdfrw的最大区别在于它与ReportLab软件包集成,因此你可以使用一些或所有预先存在的PDF构建一个新的PDF。
三、PyPDF2的安装
如果使用Anaconda而不是常规Python,可以使用pip或conda安装PyPDF2。以下是使用pip安装PyPDF2的方法:
$ pip install pypdf2
由于PyPDF2没有任何依赖,因此安装非常快。
四、如何从Python中提取PDF文档信息
我们可以使用PyPDF2从PDF中提取元数据和一些文本,尤其是当在预先存在的PDF文件上执行某些类型的自动化时是非常有用的。
以下是当前可以提取的数据类型:
- Author
- Creator
- Producer
- Subject
- Title
- Number of page
可以在自己的电脑上随便找一个PDF文件进行尝试操作。下面是使用该PDF编写一些代码,并了解如何访问这些属性:
from PyPDF2 import PdfFileReader
def extract_information(pdf_path):
with open(pdf_path, 'rb') as f:
pdf = PdfFileReader(f)
information = pdf.getDocumentInfo()
number_of_pages = pdf.getNumPages()
txt = f"""
Information about {pdf_path}:
Author: {information.author}
Creator: {information.creator}
Producer: {information.producer}
Subject: {information.subject}
Title: {information.title}
Number of pages: {number_of_pages}
"""
print(txt)
return information
if __name__ == '__main__':
path = 'xxxx.pdf'
extract_information(path)
首先从PyPDF2包导入PdfFileReader。PdfFileReader是一个具有多种与PDF文件交互的方法的类。在此示例中,我们调用了.getDocumentInfo(), 它将返回DocumentInformation 的实例,包含了我们感兴趣的大部分信息。我们还可以在reader对象上调用.getNumPages(),让它返回文档中的页数。
information这个变量具有多个实例属性,可以使用这些属性从文档中获取所需的其余元数据。我们可以打印出该信息并将其返回以备将来使用。
虽然PyPDF2具有.extractText(),可以在其页面对象上使用提取文本(本例中未显示),但它的效果不是很好。有些PDF会返回文本,有些会返回空字符串。如果要从PDF中提取文本,建议应该看一下PDFMiner项目。PDFMiner更加强大,专门用于从PDF中提取文本。
五、如何旋转页面?
有时候PDF是横向模式而不是纵向模式,甚至是颠倒的。当有人扫描文档为PDF或电子邮件时,很可能会发生这种情况。我们可以打印出文档并阅读纸质版本,也可以使用Python的强大功能来旋转有问题的页面。
下面看一下如何使用PyPDF2旋转文章的一些页面:
from PyPDF2 import PdfFileReader, PdfFileWriter
def rotate_pages(pdf_path):
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(path)
# 顺时针旋转90度
page_1 = pdf_reader.getPage(0).rotateCl将watermark_page覆盖在当前页面的顶部,然后再将新合并的页面添加到pdf_writer对象中。遍历完成后,最后将新加水印的PDF写入磁盘。
九、如何加密PDF?
PyPDF2目前仅支持将用户密码和所有者密码添加到预先存在的PDF。在PDF版本中,所有者密码会提供PDF的管理员权限,并允许设置文档的权限,而用户密码只允许打开文档。
实际上,PyPDF2是不允许设置文档的任何权限的,即使它允许设置所有者密码的情况下。但无论如何,这是可以加密的方式,也将固有地加密PDF:
from PyPDF2 import PdfFileWriter, PdfFileReader
def add_encryption(input_pdf, output_pdf, password):
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(input_pdf)
for page in range(pdf_reader.getNumPages()):
pdf_writer.addPage(pdf_reader.getPage(page))
pdf_writer.encrypt(user_pwd=password, owner_pwd=None,
use_128bit=True)
with open(output_pdf, 'wb') as fh:
pdf_writer.write(fh)
if __name__ == '__main__':
add_encryption(input_pdf='reportlab-sample.pdf',
output_pdf='reportlab-encrypted.pdf',
password='twofish')
add_encryption以输入输出PDF路径和要添加到PDF的密码为参数。由于需要加密整个输入PDF,因此需要遍历其所有页面并将其添加到writer编写器。最后一步是调用.encrypt(),以用户密码,所有者密码以及是否应该添加128位加密为参数。默认情况下,要启用128位加密。如果将其设置为False,则将应用40位加密。
结论
PyPDF2包非常有用,可以使用PyPDF2自动执行脚本完成PDF文档的批量操作。本文介绍了如何从PDF中提取元数据,旋转页面,合并和拆分PDF,添加水印,以及添加加密的操作。
同时,还要关注较新的PyPDF4包,因为它很快就会取代PyPDF2。也可以看看pdfrw包,它也可以执行许多与PyPDF2相同的操作。
以上所述是小编给大家介绍的Python玩转PDF的各种骚操作,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对社区网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢! |