Python PyPDF2合并多个PDF 一键合成教程
用Python+PyPDF2把多个PDF按顺序合并成一个文件,支持自定义文件顺序、自动跳过损坏文件,告别手动拼接。
场景痛点
做项目汇总、合同装订、资料归档时,经常需要把十几个PDF按顺序拼成一个大文件。手动在Adobe里打开、拖拽、保存,十分钟都未必搞定,顺序还容易搞错。用Python脚本一次执行,几十秒就能把指定目录下所有PDF按文件名排序合并成一个,还能自动跳过打不开的坏文件。
用到的库
pip install PyPDF2
完整代码
# -*- coding: utf-8 -*-
"""
使用 PyPDF2 合并多个 PDF 文件
"""
import os
from PyPDF2 import PdfMerger
def merge_pdfs(pdf_list, output_path: str) -> None:
"""
把多个 PDF 合并成一个
:param pdf_list: 待合并的 PDF 路径列表(按合并顺序排列)
:param output_path: 输出合并后的 PDF 路径
"""
merger = PdfMerger()
for pdf_path in pdf_list:
if not os.path.exists(pdf_path):
print(f"跳过不存在的文件: {pdf_path}")
continue
try:
# append 把整个文件追加到 merger 末尾
merger.append(fileobj=open(pdf_path, "rb"))
print(f"已加入: {pdf_path}")
except Exception as e:
print(f"跳过损坏或加密文件 {pdf_path}: {e}")
# 写出合并后的 PDF
merger.write(output_path)
merger.close()
print(f"合并完成,输出文件: {output_path}")
if __name__ == "__main__":
# 方式一:手动指定文件顺序
files = [
"01_封面.pdf",
"02_目录.pdf",
"03_正文.pdf",
]
# 方式二:自动读取某个目录下所有 pdf,并按文件名排序
folder = "./待合并"
if os.path.isdir(folder):
files = sorted(
[os.path.join(folder, f) for f in os.listdir(folder) if f.lower().endswith(".pdf")]
)
merge_pdfs(files, "merged.pdf")
代码讲解
PdfMerger是 PyPDF2 提供的合并器,调用append()逐个把 PDF 追加进来。- 用
sorted()对文件名排序,避免合并顺序乱掉;如果你的文件名本身带序号(01、02、03),按字符串排序就正好。 - 每个文件用
with思路的 try/except 包起来,单个文件损坏或加密不会让整个流程崩掉。 merger.write()写出最终文件,merger.close()释放句柄。
运行结果
控制台逐个打印加入的文件名,最后在当前目录生成 merged.pdf。打开后按你传入的顺序排列所有页面,总页数等于各文件页数之和。
注意事项
- PyPDF2 合并是页面对象级拷贝,不会重新渲染,所以速度极快、几乎无损。
- 加密的 PDF 不能直接合并,需要先解密。
- 不同 PDF 自带的书签(大纲)合并后可能丢失,需要用专门的书签处理方案。
- 新版 PyPDF2(3.x 之后)API 从
PdfFileMerger改为PdfMerger,老代码要注意升级。

更新时间:2026-09-14 21:36:05