上面的操作就是从一个文档读取某些页面,然后将这些页面保存为一个新的文档,这种做法完全可以满足合并或者分割文档的需求。要合并或者分割哪些页面,就读取哪些页面,逻辑清晰操作简单,读者可以自己试一下。
如果要按照顺序合并几个PDF文档的全部页面而不是部分页面,这里再补充一个合并PDF文档的方式,那就是使用pypdf2提供的PdfMerger对象,它有一个append()方法,参数是要合并的PDF的路径,然后该对象还提供了一个write()方法用于保存合并后的文档,代码如下:
from PyPDF2 import PdfMerger
merger = PdfMerger()
merger.append("./pdf_ files/测试文档1.pdf")
merger.append("./pdf_ files/测试文档2.pdf")
merger.append("./pdf_ files/测试文档3.pdf")
merger.write("./pdf_ files/合并文档.pdf")
merger.close()
上面的代码会把“测试文档1.pdf”“测试文档2.pdf”和“测试文档3.pdf”这三个文档合并为一个“合并文档.pdf”。要合并多少个文档就调用多少次append()方法,过程中不需要手动创建PdfWriter对象,也不需要分别读取和遍历每个文档,代码会变得非常简洁明了。最后别忘了手动调用PdfMerger对象的close()方法释放内存。
学习了上面的合并操作之后,别以为PdfMerger就真的这么不灵活,如果非要使用PdfMerger合并某些指定的页面,也是可以实现的。PdfMerger对象的append()方法用于合并整个PDF文档,而它的merge()方法用于指定合并哪个文档的哪个页面,并且可以指定插入位置。
merge()方法有好几个参数:position表示要插入的位置(下标从0开始);fileobj表示要合并哪个文档,我们给它传入一个文件操作符即可;pages表示要合并哪些页面,我们给它传入一个表示页面索引的元组即可,代码演示如下:
from PyPDF2 import PdfMerger
merger = PdfMerger()
pdf2 = open("./pdf_ files/测试文档2.pdf","rb")
pdf3 = open("./pdf_ files/测试文档3.pdf","rb")
merger.append("./pdf_ files/测试文档1.pdf")
merger.merge(position=0,fileobj=pdf2,pages=(0,3))
merger.merge(position=1,fileobj=pdf3,pages=(1,2))
merger.write("./pdf_ files/合并文档.pdf")
merger.close()
上面的代码中,首先实例化一个PdfMerger对象表示一个新的合并文档,然后使用PdfMerger对象的append()方法把“测试文档1.pdf”整个文档添加到PdfMerger对象。
接下来再把“测试文档2.pdf”的第0页、第1页、第2页插入到合并文档的第0个位置,也就是合并文档的首页,最后再把“测试文档3.pdf”的第1页插入到合并文档的第1个位置,即插入到“测试文档2.pdf”的第0页和第1页之间。
所以最后的顺序是,第二个文档的第0页->第三个文档的第1页->第二个文档的第1页->第二个文档的第2页->第一个文档的全部页。最终效果如图9-1所示。