2026-10-02 · 喵窝资源铺
报销要把发票 PDF 拼一起、申报材料要按编号合并、老师收作业要汇总几十份——在线合并网站要么限文件数要么让你传隐私文件。这篇给一个 15 行、本地运行 的 Python 脚本:把一个文件夹里的所有 PDF 按文件名顺序合并成一个。本文代码实跑验证,真实输出见下。
先 pip install pypdf,脚本保存为 merge_pdfs.py,在 PDF 文件夹里运行 python merge_pdfs.py . all.pdf(第一个参数是目录,第二个是输出文件名):
"""批量合并PDF:按文件名排序合并目录下所有PDF。用法:python merge_pdfs.py [目录] [输出文件]"""
import os, sys
from pypdf import PdfWriter
FOLDER = sys.argv[1] if len(sys.argv) > 1 else "."
OUT = sys.argv[2] if len(sys.argv) > 2 else "merged.pdf"
files = sorted(f for f in os.listdir(FOLDER)
if f.lower().endswith(".pdf") and f != OUT)
w = PdfWriter()
for f in files:
w.append(os.path.join(FOLDER, f))
with open(os.path.join(FOLDER, OUT), "wb") as fh:
w.write(fh)
print(f"合并了 {len(files)} 个PDF -> {OUT}")
for f in files:
print(" +", f)
我造了 5 个测试 PDF(part01~part05),跑一遍的输出:
合并了 5 个PDF -> all.pdf + part01.pdf + part02.pdf + part03.pdf + part04.pdf + part05.pdf
验证产物:合并出的 all.pdf 共 5 页(每个源文件 1 页,页数对得上)。再跑一遍验证幂等:
合并了 5 个PDF -> all.pdf
第二次运行合并的还是 5 个源文件——输出文件 all.pdf 自己没有被并进去。
and f != OUT 这一句——写的时候就把它堵上了。sorted() 是按字符串排的,发票1、发票10、发票2 会排成 1、10、2。想按数字顺序,先把文件重命名成补零格式(发票01、发票02…),或参考我们另一篇 批量重命名脚本 先处理一遍。脚本处理的是"一个文件夹按名字顺序拼"。如果你要的是「每个 PDF 中间插一页空白分隔」「按部门子文件夹分别合并」「合并后加书签/目录页」——逻辑要再包一层,可以直接找我们代写(见下)。
相关阅读:批量重命名 · 批量压缩图片 · Python 自动化能帮你做什么