合并PDF别再傻傻充会员了!这个Python脚本一键搞定(附代码)
“
收了十几个PDF文件要合在一起,网上找的工具不是限制页数就是上传下载慢。今天分享一个Python脚本,把要合并的PDF放进一个文件夹,运行脚本自动合并,想合多少合多少,完全免费,本地处理不泄露隐私。
一键合并所有PDF,想合多少合多少,完全免费,本地处理绝不泄露。
一、先看效果:运行脚本,选个文件夹,所有PDF瞬间合并
你只需要:
-
把所有要合并的PDF放进一个文件夹(比如“合同扫描件”) -
运行脚本,输入文件夹路径(或者直接把文件夹拖进窗口) -
脚本自动按文件名顺序合并,生成一个“合并文件.pdf”
运行界面长这样:

二、完整代码
import osimport sysimport PyPDF2print("=== PDF合并免费工具 ===")folder = input("请输入PDF文件夹路径(可直接拖拽文件夹进来):").strip()folder = folder.strip('"').strip("'")# 检查路径if not os.path.isdir(folder):print(f"❌ 文件夹不存在:{folder}") input("按回车键退出...") sys.exit()# 获取所有PDF文件pdf_list = [f for f in os.listdir(folder) if f.lower().endswith('.pdf')]if not pdf_list:print("❌ 该文件夹中没有PDF文件") input("按回车键退出...") sys.exit()pdf_list.sort() # 按文件名排序print(f"✅ 共找到 {len(pdf_list)} 个PDF文件,开始合并...")# 创建合并器merger = PyPDF2.PdfMerger()# 逐个合并total_pages = 0for i, filename in enumerate(pdf_list, 1):print(f"正在合并:第{i}/{len(pdf_list)}个 - {filename}") filepath = os.path.join(folder, filename) merger.append(filepath)# 可选:统计页数(需要读取页数,稍微慢一点) with open(filepath, 'rb') as f: reader = PyPDF2.PdfReader(f) total_pages += len(reader.pages)# 生成输出文件名(放在上一级目录,避免覆盖)parent_name = os.path.basename(os.path.normpath(folder))output_path = os.path.join(os.path.dirname(folder), parent_name + "合并.pdf")# 保存合并文件merger.write(output_path)merger.close()print(f"\n✅ 合并完成!PDF已保存为:{output_path}")print(f"共合并 {len(pdf_list)} 个文件,总计 {total_pages} 页")input("按回车键退出...")
三、逐行解释
import osimport sysimport PyPDF2
os和sys是Python自带的,用来处理路径和退出。
PyPDF2是PDF处理库,需要安装:pip install PyPDF2(装一次即可)。
folder = input("请输入PDF文件夹路径:").strip()folder = folder.strip('"').strip("'")
input() 让用户输入路径。
如果用户拖拽文件夹,路径会自带引号,去掉它们。
if not os.path.isdir(folder):print("文件夹不存在") sys.exit()
检查路径是否存在,不存在就退出。
pdf_list = [f for f in os.listdir(folder) if f.lower().endswith('.pdf')]
列出文件夹里所有文件,筛选出后缀是 .pdf 的(不区分大小写)。
pdf_list.sort()
按文件名排序,保证合并顺序和文件名一致(比如按数字1,2,3)。
merger = PyPDF2.PdfMerger()
创建一个PDF合并器对象。
merger.append(filepath)
把一个PDF文件添加到合并器里。
# 统计页数with open(filepath, 'rb') as f: reader = PyPDF2.PdfReader(f) total_pages += len(reader.pages)
打开每个PDF,获取页数累加。
parent_name = os.path.basename(os.path.normpath(folder))output_path = os.path.join(os.path.dirname(folder), parent_name + "合并.pdf")
用文件夹的名字生成输出文件名,放在上一级目录,避免在原文件夹里乱掉。
merger.write(output_path)merger.close()
写入合并文件,关闭合并器。
四、踩过的坑
坑1:安装PyPDF2报错
如果 pip install PyPDF2 失败,试试:
pip install pypdf2 --user
或者用管理员身份运行命令行。
坑2:有些PDF加密了
如果有密码保护的PDF,合并时会报错。可以先解密再合并,或者跳过这类文件。代码里没处理加密,遇到会报错,可以在循环里加 try...except 跳过。
坑3:文件名顺序不对
如果你希望按修改时间排序,把 pdf_list.sort() 换成:
pdf_list.sort(key=lambda f: os.path.getmtime(os.path.join(folder, f)))
坑4:合并后页序混乱
检查是不是 sort() 排序不符合预期,可以手动指定顺序,比如在文件名前加01、02前缀。
坑5:内存不够(文件太多太大)
PdfMerger 不会一次性把所有文件读进内存,所以一般不用担心。但如果文件真的超大,可以考虑分批次合并。
五、扩展功能:添加书签或页码
如果你想让合并后的PDF自动添加书签(对应原文件名),可以用下面代码替换 merger.append(filepath):
merger.append(filepath, bookmark=filename)
这样在PDF阅读器里会显示书签,方便跳转。
如果想在每页添加页码,那就复杂一些,需要用到 PyPDF2 的页面操作,以后再单独讲。
六、为什么用Python而不是在线工具
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
七、今日挑战
把你手头需要合并的PDF文件放进一个文件夹,用这个脚本试试。如果有任何问题,评论区告诉我,我会帮你看看。
如果你已经用上了,欢迎分享你合并了多少个文件、多少页,用时多久。
八、下期写什么?
你想用Python解决什么日常麻烦?比如:
-
批量提取PDF里的图片? -
给PDF添加水印? -
拆分PDF为单个文件? -
批量压缩图片大小?
在评论区留下你的需求,点赞最高的需求,下期小编就写那个脚本!保证免费、好用、带详细解释。
九、下期预告
评论区见!高赞需求就是下期内容。
回复「Py脚本」获取本文完整代码
往期精选:
夜雨聆风
