如何将单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
相关产品推荐
相关产品推荐

