如何使用 PyPDF2 将文件正确附加到 PDF?

问题描述 投票:0回答:1

我正在尝试将文件附加到 PDF 文件,但遇到了一些问题。我不确定我是否做错了什么或者 PyPDF2 中是否存在错误。我为此使用 Python 3.10.2,并通过 pip 下载了 PyPDF2 的最新包。

这是我尝试使用的 3 个版本的代码,但每个版本都有自己的问题。

  1. 此代码可以正确复制 PDF,但附件会默默失败。我可以确认失败,因为文件大小没有增长。
pdfFile = open("input.pdf", "rb")
reader = PdfReader(pdfFile)
writer = PdfWriter()
writer.clone_document_from_reader(reader) # this line is different
pdfFile.close()

with open("image.png", "rb") as file:
    writer.add_attachment("image", file.read())
with open("output.pdf", "wb") as file:
    writer.write(file)
  1. 此代码与之前的代码略有不同,但也无法附加文件。
pdfFile = open("input.pdf", "rb")
reader = PdfReader(pdfFile)
writer = PdfWriter()
writer.clone_reader_document_root(reader) # this line is different
writer.append_pages_from_reader(reader) # this line is different
pdfFile.close()

with open("image.png", "rb") as file:
    writer.add_attachment("image", file.read())
with open("output.pdf", "wb") as file:
    writer.write(file)
  1. 此代码实际上确实附加了文件,但在 Adobe Acrobat 中打开文件时,我收到错误:“打开此文档时出错。根对象丢失或无效。”我没有看到任何在 PyPDF2 中手动创建根对象的 API 调用。
pdfFile = open("input.pdf", "rb")
reader = PdfReader(pdfFile)
writer = PdfWriter()
writer.append_pages_from_reader(reader) # this line is different
pdfFile.close()

with open("image.png", "rb") as file:
    writer.add_attachment("image", file.read())
with open("output.pdf", "wb") as file:
    writer.write(file)

有趣的是,如果我运行代码的第三个版本而不附加文件,我不会收到错误。然后它就像前两个版本一样工作。

python pdf attachment pypdf
1个回答
2
投票

升级到 PyPDF2 库的最新版本。从版本 3 开始,它现在称为 pypdf,并使用 3.9.1(截至 2023 年 6 月 09 日的最新版本),这应该会生成一个带有附件的工作 PDF(至少对我来说是这样)。

from pypdf import PdfReader, PdfWriter

reader = PdfReader("input.pdf")
writer = PdfWriter()
writer.append_pages_from_reader(reader) 

with open("image.png", "rb") as file:
    writer.add_attachment("image.png", file.read())
with open("output.pdf", "wb") as file:
    writer.write(file)

希望有帮助!


编辑:在进一步测试中,即使使用最新版本的 pypdf,我在将文件附加到 pdf 时也遇到一些困难。 (虽然您抱怨的错误似乎已修复,但我偶尔会收到未正确附加的文件,即它们似乎已附加,但在 pdf 中单击时实际上不会打开)。

我已切换为使用 pikepdf 进行附加,并且运行良好。

© www.soinside.com 2019 - 2024. All rights reserved.