基础示例

from PyPDF2 import PdfWriter

merger = PdfWriter()

for pdf in ["file1.pdf", "file2.pdf", "file3.pdf"]:
    merger.append(pdf)

merger.write("merged-pdf.pdf")
merger.close()

有关详细信息,请参阅 Paul Rooney 在 StackOverflow 上的出色回答。

显示更多合并选项

from PyPDF2 import PdfWriter

merger = PdfWriter()

input1 = open("document1.pdf", "rb")
input2 = open("document2.pdf", "rb")
input3 = open("document3.pdf", "rb")

# add the first 3 pages of input1 document to output
merger.append(fileobj=input1, pages=(0, 3))

# insert the first page of input2 into the output beginning after the second page
merger.merge(position=2, fileobj=input2, pages=(0, 1))

# append entire input3 document to the end of the output document
merger.append(input3)

# Write to an output PDF document
output = open("document-output.pdf", "wb")
merger.write(output)

# Close File Descriptors
merger.close()
output.close()

append

append​ 在 ​PdfWriter​ 中得到了轻微的扩展。

参数:

fileobj:要合并的 PdfReader 或文件名

outline_item:指向插入文件开头的大纲/书签字符串。如果没有或省略,则不会添加书签。

pages:要合并的页面;您还可以提供要合并的页面列表 None(默认)意味着将合并整个文档。 

import_outline:从源中导入/忽略相关轮廓(默认为 True) 

excluded_fields:导入对象要忽略的键列表;如果“/Annots”是列表的一部分,注释将被忽略如果“/B”是列表的一部分,文章将被忽略

示例:

writer.append("source.pdf",(0,10))  # append the first 10 pages of source.pdf

writer.append(reader,"page 1 and 10",[0,9]) #append first and 10th page from reader and create an outline)

在合并过程中,相关的命名目的地也将被导入。

如果你想在目的地中间插入页面,使用merge(它提供(插入)位置)

您现在可以多次插入同一页。您还可以使用列表一次多次插入同一页面:

例如: writer.append(reader,[0,1,0,2,0]) 将插入第 (1)、(2) 页,第 (0) 页之前、中间和之后

add_page / insert_page

建议改用​append​或​merge

reset_translation

在克隆过程中,如果一个对象已经被克隆过,则不会再次克隆它,返回一个这个之前克隆过的对象的指针。因此,如果您添加/合并一个已经添加的页面,相同的对象将被第二次添加。如果以后修改这两个页面中的任何一个,两个页面都可以独立修改。

要重置,请调用 ​writer.reset_translation(reader)

Advanced cloning

为了防止页面/对象之间的副作用,对象和所有链接的对象在合并期间被链接。

如果您使用 PdfWriter.append/merge/add_page/insert_page,此过程将自动应用。如果您想在“手动”附加对象之前克隆一个对象,请使用任何 PdfObject 的克隆函数:例如:

cloned_object = object.clone(writer)

如果你尝试克隆一个已经属于 writer 的对象,它会返回相同的对象

cloned_object == object.clone(writer)  # -> returns True

同样,如果您尝试克隆一个对象两次,它将返回先前克隆的对象

object.clone(writer) == object.clone(writer)  # -> returns True

另外请注意,如果您克隆一个对象,您将克隆下面的所有对象,包括 IndirectObject 指向的对象。因为如果你克隆一个包含一些文章(“/B”)的页面,那么不仅是第一篇文章,还有所有链接的文章,以及可以阅读这些文章的页面都会被复制。这意味着您可以复制很多对象,这些对象将保存在输出 pdf 中。

为了防止,您可以提供要忽略的字典中已定义字段的列表:

例如: new_page  = writer.add_page(reader.pages[0],excluded_fields=["/B"])