pypdf2 的 pdfmerger 是 v3.x 中合并 pdf 最可靠方式,替代已弃用的 pdffilemerger;需逐个创建 pdfreader 实例并调用 append(),不可直接传路径列表;遇加密 pdf 会抛异常,应提前捕获;大文件合并时宜复用 merger 实例并避免单页插入。

PyPDF2 的 PdfMerger 是当前合并 PDF 最可靠、最直接的方式;PdfFileMerger 已在 3.0+ 版本中被弃用,继续用会报 AttributeError: module 'PyPDF2' has no attribute 'PdfFileMerger'。
用 PdfMerger 合并多个 PDF 文件(推荐)
这是 PyPDF2 v3.x 的标准做法,支持追加、插入、页码范围裁剪,且内存友好(不一次性加载全部内容到内存)。
常见错误:直接传入文件路径列表给 merge() —— 它只接受单个 PdfReader 实例或文件对象。
正确步骤:
- 为每个 PDF 创建
PdfReader实例(必须显式打开) - 调用
merger.append(reader)逐个追加 - 写入前确保输出目录存在,且文件后缀是
.pdf
from PyPDF2 import PdfMerger, PdfReader
merger = PdfMerger()
for pdf_path in ["a.pdf", "b.pdf", "c.pdf"]:
with open(pdf_path, "rb") as f:
merger.append(PdfReader(f))
with open("merged.pdf", "wb") as output:
merger.write(output)
合并时跳过加密 PDF 或处理权限错误
遇到 PyPDF2.errors.FileNotDecryptedError 或 NotImplementedError: only algorithm code 1 and 2 are supported,说明 PDF 含强加密(如 AES-256),PyPDF2 无法解密。
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
此时不能跳过或自动忽略——append() 会直接抛异常中断流程。
稳妥做法:
- 提前用
PdfReader尝试打开,捕获异常并记录文件名 - 不建议用空密码硬试(
reader.decrypt("")效果有限且慢) - 若必须处理加密 PDF,换用
pymupdf(即fitz)更可靠
合并大文件时的内存与性能注意点
PdfMerger 默认边读边写,但若合并上百页 PDF 或含大量图像/字体嵌入,可能触发 MemoryError 或写入缓慢。
可优化项:
- 避免在循环里重复创建
PdfMerger实例(应复用一个) - 不要用
merge(page=...)插入单页——它比append()开销大得多 - 如果源 PDF 有冗余对象(如重复字体),合并后体积可能激增;需后续用
qpdf --optimize压缩
真正容易被忽略的是:PyPDF2 对某些 PDF 特性(如表单域、JavaScript、透明度混合)支持有限,合并后这些元素可能丢失或失效——这不是 bug,是库的设计边界。需要保全交互功能时,得换工具链。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










