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

如何将单PDF处理脚本改造为遍历目录中多PDF文件执行

改造单PDF处理脚本为批量遍历指定目录处理所有PDF

你现有的脚本可以改造为批量处理指定目录下的所有PDF文件,核心思路是将原单文件处理逻辑封装为可复用的函数,再遍历目标目录中的PDF文件循环调用该函数即可。

原脚本中指定单个PDF的代码片段

# Select the Master PDF Path. Located in "INPUT" folder
masterPDF_path = r"C:\Users\rohitpandey\Downloads\OneDrive_1_1-25-2023\CLAIMS Analysis\Format 2(Wire)"
master_pdf_document = 'Payment# 79724.pdf'

改造后的完整批量处理脚本

import PyPDF2
from PyPDF2 import PdfFileWriter, PdfFileReader
import fitz
import os

# 输入目录:存放所有待处理的PDF文件
INPUT_DIR = r"C:\Users\rohitpandey\Downloads\OneDrive_1_1-25-2023\CLAIMS Analysis\Format 2(Wire)"
# 输出目录:存放拆分后的PDF文件
OUTPUT_DIR = r"C:\Users\rohitpandey\Downloads\OneDrive_1_1-25-2023\New folder"

# 确保输出目录存在,不存在则创建
os.makedirs(OUTPUT_DIR, exist_ok=True)

def process_single_pdf(pdf_full_path, output_dir):
    """处理单个PDF文件的核心逻辑"""
    target_string = "WIRE TRANSFER/ACH RECORD VOUCHER"
    page_range = {}
    pdf_start_page = 0

    # 用fitz加载PDF并获取总页数
    doc = fitz.open(pdf_full_path)
    total_pages = doc.page_count

    # 解析页面拆分范围
    for page_idx in range(total_pages):
        page = doc.load_page(page_idx)
        page_text = page.get_text('text')
        current_page_num = page_idx + 1
        if target_string in page_text:
            page_range.update({pdf_start_page: current_page_num})
            pdf_start_page = current_page_num

    # 生成拆分后的文件名列表
    pdf_filename = os.path.basename(pdf_full_path)
    invoice_list = []
    for page_idx in range(total_pages):
        page = doc.load_page(page_idx)
        page_text = page.get_text('text')
        if target_string in page_text:
            invoice_name = f"PAYMENT_WIRE_BANK STATEMENT_STEP_1_{pdf_filename}"
            invoice_list.append(invoice_name)

    # 准备拆分参数
    page_range_list = [(start, end) for start, end in page_range.items()]

    # 执行PDF拆分并保存
    pdf_reader = PyPDF2.PdfFileReader(pdf_full_path)
    for idx in range(len(invoice_list)):
        start_page = page_range_list[idx][0]
        end_page = page_range_list[idx][1]
        output_path = os.path.join(output_dir, invoice_list[idx])

        try:
            assert start_page < pdf_reader.numPages
            pdf_writer = PdfFileWriter()
            for page_num in range(start_page, end_page):
                pdf_writer.addPage(pdf_reader.getPage(page_num))

            with open(output_path, 'wb') as out_file:
                pdf_writer.write(out_file)
            print(f"已完成拆分:{output_path}")
        except AssertionError:
            print(f"错误:文件 {pdf_filename} 页数不足,无法完成指定范围拆分!")

# 遍历输入目录中的所有PDF文件并处理
for filename in os.listdir(INPUT_DIR):
    if filename.lower().endswith('.pdf'):
        full_pdf_path = os.path.join(INPUT_DIR, filename)
        print(f"开始处理文件:{full_pdf_path}")
        process_single_pdf(full_pdf_path, OUTPUT_DIR)

print("所有PDF文件处理完成!")

关键改动说明

  • 封装核心逻辑:将原单PDF处理代码封装为process_single_pdf函数,接收单个PDF路径和输出目录作为参数,实现逻辑复用。
  • 遍历目录文件:使用os.listdir遍历输入目录,筛选出所有PDF文件(不区分大小写后缀)。
  • 目录自动创建:添加os.makedirs确保输出目录存在,避免因目录不存在导致的写入错误。
  • 简化冗余逻辑:移除原脚本中不必要的列表拆分代码(按列表长度拆分无实际意义),直接使用原始列表。
  • 路径处理优化:统一使用os.path.join拼接路径,避免手动拼接斜杠引发的跨平台兼容性问题。
  • 进度日志输出:添加处理过程的打印信息,方便跟踪进度和排查问题。

内容的提问来源于stack exchange,提问作者Rohit Pandey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:10:23