如何用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
相关产品推荐
相关产品推荐

