标签:Python与Excel,PyPDF4
下面是应用场景:
我曾经收到一份20页的PDF银行对账单,需要将其中的3页转发给另一方,但我不想发送整个文件,因为有些页面包含我不愿意共享的个人信息。因此,我需要一种分割PDF文件的方法。虽然Adobe Acrobat Pro DC允许拆分和合并PDF文件,但需要付费。
Python就能够实现,谁不喜欢免费的解决方案呢?
安装Python库并将PDF文件装载到Python中
我们将使用PyPDF4库来处理PDF文件。先使用pip安装来安装这个库:
pip install PyPDF4
我们将创建一个PdfileReader对象来表示PDF文件。稍后,我们需要实例化一个PdfielWriter对象来保存PDF文件。
from PyPDF4 import PdfFileReader,PdfFileWriter
pdf =PdfFileReader(r'D:\data-1.pdf')
现在我们有一个名为pdf的对象来表示实际的pdf文件,可以访问PDF中包含的信息。在本例中,使用的示例名为data-1.pdf(有兴趣的朋友可以到知识星球完美Excel社群中下载该文件,也可以自己制作一个用于演示的文件)。
提取有关PDF文件的基本信息
让我们检查一些关于这个PDF文件的基本信息。看起来作者是使用MS Word创建了这个12页的文档,然后将其转换为PDF。
图1:使用Python提取PDF文件基本信息
为了演示,我将从文件中随机提取一些页面,假设我只想获得第1-3、5、6和11-12页。因此,我们可以构造一个列表来存储页码:[1,2,3,4,5,11,12]。
从PDF文件中获取页面
我们可以使用pdf.getPage()从pdf对象获取特定页面。记住,Python索引从0开始,而不是1,因此许多Python库都遵循此约定。getPage(0)是pdf文件的第一页,pdf.getPage(11)是最后一页。调用pdf.getPage(12)将抛出“索引超出范围”错误,因为这意味着正试图访问12页文件中的第13页。不要介意pdf.getPage(0)中显示的所有乱七八糟的内容,只要知道这个对象是第一个页面。.getPage()方法允许我们将PDF文件拆分为单独的页面,以便我们可以选择,然后使用Python将它们合并到一个文件中。
图2:使用Python从PDF文件中获取页面
创建并保存PDF文件
现在我们已经成功地从PDF中提取了一个页面。要将其保存为单独的文件,我们需要创建一个PdfielWriter()对象,将页面添加到该对象中,然后将其保存到计算机。
按照上述步骤编写代码如下。注意,open()函数中的”wb”指的是”write binary”。
pdf_writer = PdfFileWriter()
pdf_writer.addPage(pdf.getPage(0))
with open(r'D:\page_1.pdf', 'wb') asf:
pdf_writer.write(f)
将多个页面合并到同一个PDF文件中
我们现在可以继续从PDF中获取所有需要的页面,并将它们合并到一个文件中。之前,我们已经创建了要提取的页码列表:pages=[1,2,3,4,5,11,12]。由于Python基于0的索引,我们需要将每个数字移位1。只要把所有的数字循环一遍,然后从每个数字中减去一个。很简单!Python的方法称为列表解析,或者有时在Python中称为“执行循环的一行程序”。
pages = [i-1 for i in pages]
图3:Python列表解析
现在我们有了正确的页面索引,就可以完成PDF合并过程。
pdf_writer = PdfFileWriter()
pages = [1,2,3,4,5,11,12]
pages = [i-1 for i in pages]
for p in pages:
pdf_writer.addPage(pdf.getPage(p))
withopen(r'D:\select_pages.pdf','wb') as f:
pdf_writer.write(f)
有时,运行上述代码,我们会得到一条奇怪的错误消息AttributeError:“PdfileWriter”对象没有属性“stream”。结果表明PyPDF4库中有一个bug,每次保存完PDF文件并想保存另一个文件时,都必须重新创建PdfileReader()对象。这里,我们看到这个错误是因为之前保存了一个一页的PDF文件。因此,在运行PdfielWriter().write()方法之前,不要忘记总要创建一个新的PdfielReader()对象。
如果想合并多个PDF文件呢?
过程和上文讲述的是一样的,所以不会在这里重复。提示:
1.循环遍历要合并的PDF文件。
2.在每个PDF文件中,遍历页面,并将每个页面添加到PdfielWriter对象中。
3.通过调用PdfFileWriter.write()方法保存新PDF。
将上述代码放到一起
下面是允许你使用Python拆分和合并PDF文件的完整代码:
from PyPDF4 import PdfFileReader,PdfFileWriter
pdf =PdfFileReader(r'D:\data-1.pdf')
pdf_writer = PdfFileWriter()
pdf.numPages
pdf.getDocumentInfo()
pages = [1,2,3,4,5,11,12]
pages = [i-1 for i in pages]
for p in pages:
pdf_writer.addPage(pdf.getPage(p))
withopen(r'D:\select_pages.pdf','wb') as f:
pdf_writer.write(f)
小结
我们已经介绍了如何使用Python处理PDF文件:
1.获取有关PDF文件的基本信息。
2.通过提取单个页面来拆分PDF文件。
3.将页面合并到新的PDF文件中。
注:本文学习整理自pythoninoffice.com。
联系客服