Python实现PDF每两页拆分并按首页文本命名文件
解决PDF按两页拆分并提取文件名的Python方案
你的原代码存在几个关键问题导致无法正常运行,这里给出修正后的完整可行方案:
原代码的问题点
- 页面添加逻辑错误:循环里重复添加了第i页,且未处理索引越界的情况
- 属性调用错误:PyPDF2的
PdfReader没有numPages属性,需用len(reader.pages)获取总页数 - 缺少异常处理:正则匹配不到目标文本时会直接报错,文件操作未用上下文管理器可能导致资源泄漏
- 目录切换风险:
os.chdir(output_dir)会改变当前工作目录,后续操作容易出问题
修正后的代码
from PyPDF2 import PdfReader, PdfWriter import re import argparse import os # 创建输出目录(已存在则跳过) output_dir = os.path.join(os.getcwd(), 'output') os.makedirs(output_dir, exist_ok=True) def get_arguments(): parser = argparse.ArgumentParser(description='按两页一组拆分PDF,并从页面文本提取文件名') parser.add_argument("-p", "--pdf", dest="pdf", required=True, help="待处理的PDF文件路径") parser.add_argument("-r", "--regex", dest="regex", required=True, help="匹配文件名的正则表达式,需包含捕获组") return parser.parse_args() def split_pdf(file_path, regex): reader = PdfReader(file_path) total_pages = len(reader.pages) # 按每2页一组遍历 for i in range(0, total_pages, 2): writer = PdfWriter() # 添加当前组的页面(处理最后一页不足2页的情况) for page_idx in range(i, min(i+2, total_pages)): writer.add_page(reader.pages[page_idx]) # 从组内第一页提取文本并匹配文件名 page_text = reader.pages[i].extract_text() match = re.search(regex, page_text) if not match: print(f"第{i+1}-{min(i+2, total_pages)}页未匹配到文件名,跳过") continue # 处理文件名:替换空格为下划线,避免非法字符 file_name = match.group(1).replace(" ", "_") + ".pdf" output_path = os.path.join(output_dir, file_name) # 用上下文管理器写入文件,避免资源泄漏 with open(output_path, "wb") as output_stream: writer.write(output_stream) print(f"已生成文件:{output_path}") if __name__ == "__main__": args = get_arguments() split_pdf(args.pdf, args.regex)
使用说明
- 先安装依赖:
pip install PyPDF2
- 针对你提到的"Dear Miles Wood"格式,运行命令时指定正则表达式:
python your_script.py -p your_file.pdf -r "Dear (\w+ \w+)"
- 正则
"Dear (\w+ \w+)"会捕获"Dear "后面的姓名,比如匹配到"Miles Wood" - 如果姓名格式特殊(比如带中间名),可以调整正则,例如
"Dear (.+?)\b"(根据实际文本格式灵活修改)
额外说明
- 代码会自动处理总页数为奇数的情况,最后一组只保留剩余的1页
- 若某组页面匹配不到文件名,会打印提示并跳过,不会中断整个程序
- 文件名中的空格会被替换为下划线,避免操作系统路径问题
内容的提问来源于stack exchange,提问作者Normad68
相关产品推荐
相关产品推荐

