标签: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。
|
|
来自: hercules028 > 《Python and AI》