分享

使用Python拆分和合并PDF文件

 hercules028 2022-02-16

标签:PythonExcel,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-35611-12页。因此,我们可以构造一个列表来存储页码:[1,2,3,4,5,11,12]

PDF文件中获取页面

我们可以使用pdf.getPage()pdf对象获取特定页面。记住,Python索引从0开始,而不是1,因此许多Python库都遵循此约定。getPage(0)pdf文件的第一页,pdf.getPage(11)是最后一页。调用pdf.getPage12)将抛出“索引超出范围”错误,因为这意味着正试图访问12页文件中的第13页。不要介意pdf.getPage(0)中显示的所有乱七八糟的内容,只要知道这个对象是第一个页面。.getPage()方法允许我们将PDF文件拆分为单独的页面,以便我们可以选择,然后使用Python将它们合并到一个文件中。

图片

2:使用PythonPDF文件中获取页面

创建并保存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]

图片

3Python列表解析

现在我们有了正确的页面索引,就可以完成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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多