你有没有过这种经历:领导甩来几十个 PDF,让你合并成一个、按规则重命名、再拆分成单页。你一个一个打开、另存为、改名字,两小时过去了,眼睛都花了。
今天这篇是 Python PDF 自动化系列的第一篇,我们从最基础的环境搭建开始,搞定职场最高频的三个操作:PDF 合并、PDF 拆分、批量重命名。全程保姆级,复制代码就能跑。
01 环境搭建:三个库搞定 90% 的 PDF 需求
Python 处理 PDF 的库有很多,但职场常用的就三个,各有分工:
PyPDF2:PDF 基础操作之王。合并、拆分、旋转、加密解密,全靠它。轻量、稳定、文档全。
pdfplumber:文本和表格提取神器。尤其是表格提取,比 PyPDF2 强一个量级。后面第③篇专门讲。
reportlab:PDF 生成工具。从零创建 PDF、画表格、插图表,第⑤篇详细讲。
先打开终端,一次性安装:
pip install PyPDF2 pdfplumber reportlab
安装完成后,验证一下:
python -c "import PyPDF2; import pdfplumber; import reportlab; print('全部安装成功')"
看到 "全部安装成功" 就说明环境 OK 了。建议使用 Python 3.8 及以上版本,兼容性最好。
02 PDF 合并:把多个文件拼成一个
场景:你有 10 个章节的 PDF 报告,需要合并成一份完整文档提交。
PyPDF2 的 PdfMerger 类专门干这个。直接上代码:
from PyPDF2 import PdfMergerimport os# 要合并的PDF文件夹pdf_dir = "./pdf_files"# 输出文件名output_file = "merged_result.pdf"# 获取文件夹下所有PDF,按文件名排序pdf_files = sorted([ f for f in os.listdir(pdf_dir) if f.endswith(".pdf")])merger = PdfMerger()for pdf in pdf_files: file_path = os.path.join(pdf_dir, pdf) merger.append(file_path) print(f"已合并: {pdf}")merger.write(output_file)merger.close()print(f"合并完成!输出文件: {output_file}")
关键说明:
sorted() 很重要,保证按文件名顺序合并。如果你的文件是 "1.pdf、2.pdf、10.pdf" 这种数字命名,sorted 会按字符串排序导致 10 排在 2 前面,需要用自然排序。PdfMerger 还支持只合并部分页面,比如 merger.append(file, pages=(0, 5))只合并前 5 页。- 合并大文件时注意内存,几百个文件合并建议分批处理。
03 PDF 拆分:一个文件拆成多个
场景:一份 50 页的合同,需要每页单独存成一个文件;或者按章节拆分。
方案一:每页拆成单独文件
from PyPDF2 import PdfReader, PdfWriterinput_pdf = "big_document.pdf"reader = PdfReader(input_pdf)for page_num in range(len(reader.pages)): writer = PdfWriter() writer.add_page(reader.pages[page_num]) output_file = f"page_{page_num + 1}.pdf" with open(output_file, "wb") as f: writer.write(f) print(f"已拆分: {output_file}")print("拆分完成!")
方案二:按页码范围拆分(比如每 10 页一个文件)
from PyPDF2 import PdfReader, PdfWriterinput_pdf = "big_document.pdf"reader = PdfReader(input_pdf)total_pages = len(reader.pages)pages_per_file = 10 # 每个文件10页for start in range(0, total_pages, pages_per_file): end = min(start + pages_per_file, total_pages) writer = PdfWriter() for page_num in range(start, end): writer.add_page(reader.pages[page_num]) output_file = f"pages_{start + 1}_to_{end}.pdf" with open(output_file, "wb") as f: writer.write(f) print(f"已生成: {output_file}")print("批量拆分完成!")
04 批量重命名:一秒改完上百个文件名
场景:下载的 PDF 文件名乱七八糟,需要统一改成 "日期_类型_编号.pdf" 的格式。
纯 Python 的 os 模块就能搞定,不需要 PDF 库:
import ospdf_dir = "./pdf_files"# 获取所有PDF文件pdf_files = [f for f in os.listdir(pdf_dir) if f.endswith(".pdf")]for index, old_name in enumerate(pdf_files, start=1): # 新文件名规则:report_001.pdf new_name = f"report_{index:03d}.pdf" old_path = os.path.join(pdf_dir, old_name) new_path = os.path.join(pdf_dir, new_name) os.rename(old_path, new_path) print(f"{old_name} → {new_name}")print("批量重命名完成!")
进阶:根据 PDF 内容自动命名
如果想根据 PDF 第一页的标题自动命名,可以结合 pdfplumber 提取文本:
import pdfplumberimport ospdf_dir = "./pdf_files"for filename in os.listdir(pdf_dir): if not filename.endswith(".pdf"): continue filepath = os.path.join(pdf_dir, filename) with pdfplumber.open(filepath) as pdf: first_page = pdf.pages[0] text = first_page.extract_text() # 取第一行作为标题 title = text.split("\n")[0].strip() # 清理文件名中的非法字符 safe_title = "".join(c for c in title if c not in r'\/:*?"<>|') new_name = f"{safe_title}.pdf" new_path = os.path.join(pdf_dir, new_name) os.rename(filepath, new_path) print(f"{filename} → {new_name}")
05 常见坑与避坑指南
坑 1:加密的 PDF 无法操作
如果 PDF 有密码保护,PyPDF2 会报错。需要先解密,第④篇会详细讲加密解密。
坑 2:合并后书签丢失
PdfMerger 默认不会保留原 PDF 的书签(outline)。如果需要保留,可以用 merger.append(file, import_outline=True)。
坑 3:中文文件名乱码
Windows 系统下偶尔出现中文文件名编码问题,建议在脚本开头加上:
import syssys.stdout.reconfigure(encoding="utf-8")
坑 4:扫描版 PDF 无法提取文本
扫描件本质是图片,pdfplumber 提取不到文字。需要 OCR 处理,后面的文章会涉及。
写在最后
这一篇我们搞定了 PDF 自动化的基础三件套:合并、拆分、重命名。这些操作看起来简单,但在真实工作中,一次处理上百个文件时,Python 能帮你省下几小时的重复劳动。