You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

使用说明

  1. 先安装依赖:
pip install PyPDF2
  1. 针对你提到的"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:40:22