合并 PDF 文件

基本示例

from pypdf 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 pypdf import PdfWriter

merger = PdfWriter()

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

# 将输入1文档的前3页添加到输出文档
merger.append(fileobj=input1, pages=(0, 3))

# 将输入2的第一页插入到输出文档的第二页之后
merger.merge(position=2, fileobj=input2, pages=(0, 1))

# 将整个输入3文档附加到输出文档的末尾
merger.append(input3)

# 将结果写入输出 PDF 文档
output = open("document-output.pdf", "wb")
merger.write(output)

# 关闭文件描述符
merger.close()
output.close()

append

appendPdfWriter 中稍作扩展。有关更多详细信息,请参阅 append()

示例

# 附加 source.pdf 的前10页
writer.append("source.pdf", (0, 10))

# 附加 reader 的第一页和第10页,并创建大纲
writer.append(reader, "page 1 and 10", [0, 9])

在合并过程中,相应的命名目标也会被导入。

如果您希望将页面插入到目标的中间位置,可以使用 merge(它提供了插入位置)。 如果需要,您还可以多次插入相同的页面,甚至可以使用基于列表的语法:

# 插入第2页和第3页,并在其前后插入第1页
writer.append(reader, [0, 1, 0, 2, 0])

add_page / insert_page

推荐使用 appendmerge 代替。

合并表单

在合并表单时,一些表单字段可能具有相同的名称,这会阻止访问某些数据。

在添加源 PDF 之前,应添加一个分组字段,以防止这种情况发生。 原始字段将通过添加组名来识别。

例如,在调用 reader.add_form_topname("form1") 之后,之前名为 field1 的字段现在在调用 reader.get_form_text_fields(True)reader.get_fields() 时会被识别为 form1.field1

之后,您可以使用 writer.appendwriter.merge 完整或部分地附加输入 PDF。如果您插入一组页面,则只会列出那些字段。

reset_translation

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

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

高级克隆

为了防止页面/对象之间的副作用,所有链接的对象在合并时都会进行克隆。

如果您使用 PdfWriter.append/merge/add_page/insert_page,此过程将自动应用。 如果您想在“手动”附加对象之前克隆一个对象,可以使用任何 PdfObjectclone 方法:

cloned_object = object.clone(writer)

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

assert cloned_object == object.clone(writer)

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

assert object.clone(writer) == object.clone(writer)

请注意,如果您克隆一个对象,您也会克隆其下的所有对象,包括 IndirectObject 指向的对象。因此,如果您克隆一个包含一些条目的页面(例如 "/B"),不仅是第一个条目,所有链式条目和这些条目可以被读取的页面也会被复制。这意味着您可能会复制许多对象,这些对象将被保存在输出 PDF 中。

为了防止这种情况,您可以提供一个要忽略的字段列表:

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

合并旋转页面

如果您正在处理旋转的页面,您可能希望在合并之前调用 transfer_rotation_to_content() 来避免错误的旋转结果:

for page in writer.pages:
    if page.rotation != 0:
        page.transfer_rotation_to_content()
    page.merge_page(background, over=False)