PDF 批量合并:一个文件夹合成一个 PDF

2026-10-05 · 本脚本已实跑验证(3个中文文件名 PDF → 合并成 3 页输出,复核通过)

投标文件、报销单、每人的合同各自一个 PDF,交上去要合成一个——Adobe 的"合并"按钮要么收费要么限制次数。这里给纯 Python 版,pip install pypdf 就够,免装任何办公软件。

脚本(实跑通过)

import os, re, sys
from pypdf import PdfReader, PdfWriter

src, out = sys.argv[1], sys.argv[2]
files = [f for f in os.listdir(src) if f.lower().endswith('.pdf')]
# 自然排序:说明10.pdf 排在 说明2.pdf 后面,而不是前面
files.sort(key=lambda s: [int(t) if t.isdigit() else t
                          for t in re.split(r'(\d+)', s)])
w = PdfWriter()
for fn in files:
    try:
        r = PdfReader(os.path.join(src, fn))
        for p in r.pages:
            w.add_page(p)
        print(f'合并 {fn}({len(r.pages)}页)')
    except Exception as e:
        print(f'跳过 {fn}:{type(e).__name__}')
with open(out, 'wb') as f:
    w.write(f)
print(f'完成:{out},共 {len(w.pages)} 页')

实跑:三个中文文件名的 PDF(合同-甲 / 合同-乙 / 说明)合并输出 3 页,逐页复核全部在。

实跑复现的坑

坑1:字符串排序把"说明10.pdf"排在"说明2.pdf"前面

sorted() 按字符逐位比,"1" < "2",于是 10 号排在 2 号前面——合并顺序直接错页。必须用上面的自然排序 key(把数字段转成 int 再比)。这是 PDF 合并出"页序乱"最常见的原因,而且不报错。

坑2:加密 PDF——decrypt('') "成功"了,读页还是崩

实测最阴的一处:对一份加密 PDF 调 reader.decrypt(""),返回值是"成功"(不是异常),但紧接着读 pages 仍抛 FileNotDecryptedError。也就是说不能只凭 decrypt 没报错就认为能读,必须把"读页"本身也放进 try 里,坏文件跳过继续合并剩下的(脚本里已经是这个结构)。加密文件(比如对方发来的加密合同)单独拎出来告诉用户,比整个任务崩掉强得多。

坑3:输出文件放进输入目录,下次重跑把自己合并进去

第一次跑 python merge.py . all.pdf 没问题;第二次重跑时 all.pdf 已经躺在目录里,被当输入再合并一遍,页数翻倍。输出文件名要么放别的目录,要么脚本里把 os.path.abspath(out) 从文件列表里排除。

需要现成的?

懒得装 Python 环境?喵窝提供文档/表格代做服务(¥19.9):把你的 PDF 文件夹发给我们,交付合并好的成品+可复用脚本,包免费重做(虚拟物品交付后不退款;未达承诺免费重做)。
👉 喵窝资源铺 · 服务下单 | 免费资源清单

← 更多干货