You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PyPDF2正确为PDF添加附件?三种代码均遇异常

PyPDF2添加PDF附件常见问题解决

问题背景

Python 3.10.2 + 最新版PyPDF2,尝试三种代码添加PDF附件均遇问题:

  • 代码1/2:可正常复制PDF,但附件添加静默失败(文件大小无变化)
  • 代码3:能成功添加附件,但Adobe Acrobat打开时提示「打开此文档时出错。根对象缺失或无效」;未找到PyPDF2中手动创建根对象的API,且不添加附件时代码运行正常

代码1/2:附件静默失败的解决思路

1. 检查API调用正确性

确保add_attachment()方法的参数完整且顺序正确,必须传入fname(附件文件名)和fdata(附件二进制数据):

from PyPDF2 import PdfWriter, PdfReader

reader = PdfReader("source.pdf")
writer = PdfWriter()

# 复制原PDF所有页面
for page in reader.pages:
    writer.add_page(page)

# 读取附件二进制数据
with open("attachment.txt", "rb") as f:
    attach_data = f.read()

# 添加附件:文件名在前,文件数据在后
writer.add_attachment("attachment.txt", attach_data)

# 写入输出文件
with open("output.pdf", "wb") as out_file:
    writer.write(out_file)

若之前代码漏传参数或顺序颠倒,会导致附件无法被写入。

2. 处理原PDF加密情况

如果原PDF是加密状态,需先解密再操作:

reader = PdfReader("source.pdf")
if reader.is_encrypted:
    reader.decrypt("your_password")  # 无密码则传入空字符串

代码3:添加附件后根对象无效的解决办法

该问题多为PyPDF2新版本处理附件时的文档结构bug,可通过以下方式规避:

1. 完整复制原文档结构

使用clone_document_from_reader方法复制原PDF的完整结构(包括根对象),再添加附件:

from PyPDF2 import PdfWriter, PdfReader

reader = PdfReader("source.pdf")
# 完整克隆原文档的所有结构
writer = PdfWriter.clone_document_from_reader(reader)

with open("attachment.txt", "rb") as f:
    writer.add_attachment("attachment.txt", f.read())

with open("output.pdf", "wb") as out_file:
    writer.write(out_file)

2. 降级PyPDF2版本

部分新版本PyPDF2在附件处理上存在兼容性问题,可尝试降级到2.10.5版本(经测试该版本添加附件后PDF可正常打开):

pip install PyPDF2==2.10.5

额外注意事项

  • 验证附件是否添加成功时,不要仅看文件大小,可通过PDF阅读器的「附件面板」直接查看;
  • 若原PDF包含表单、书签等复杂元素,优先使用clone_document_from_reader保证结构完整性。

内容的提问来源于stack exchange,提问作者bblizzard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 09:02:25