使用Python脚本按文本拆分PDF时出现文件重复问题
解决PDF拆分时重复生成文件的问题
问题分析
你遇到的重复生成文件问题,大概率是因为process_all_pdfs函数用os.walk遍历输入目录时,把输出文件夹也包含进去了——如果你的输出文件夹是输入文件夹的子目录,脚本会处理刚生成的PDF文件,进而重复生成新的文件。另外,当前代码也没有检查输出文件是否已存在,多次运行脚本会重复生成同名文件。
修复后的代码
import os import fitz # PyMuPDF def split_pdf_by_text(pdf_path, keyword, output_folder): if not os.path.isfile(pdf_path): print(f"错误: '{pdf_path}' 不是有效文件。") return if not os.path.exists(output_folder): os.makedirs(output_folder) print(f"处理PDF: {pdf_path}") pdf_document = fitz.open(pdf_path) processed_pages = set() for page_number in range(len(pdf_document)): if page_number in processed_pages: continue page = pdf_document.load_page(page_number) text = page.get_text() if keyword in text: output_file_name = f"{os.path.splitext(os.path.basename(pdf_path))[0]}_page_{page_number + 1}.pdf" output_path = os.path.join(output_folder, output_file_name) # 检查文件是否已存在,避免重复生成 if os.path.exists(output_path): print(f"文件已存在,跳过: {output_path}") processed_pages.add(page_number) continue new_pdf = fitz.open() new_pdf.insert_pdf(pdf_document, from_page=page_number, to_page=page_number) new_pdf.save(output_path) print(f"页面 {page_number + 1} 已保存至: {output_path}") new_pdf.close() processed_pages.add(page_number) pdf_document.close() def process_all_pdfs(input_folder, keyword, output_folder): # 把输出文件夹的绝对路径存起来,避免处理里面的文件 output_abs_path = os.path.abspath(output_folder) for root, _, files in os.walk(input_folder): # 如果当前遍历的目录是输出文件夹,直接跳过 if os.path.abspath(root) == output_abs_path: continue for file in files: if file.endswith(".pdf"): pdf_path = os.path.join(root, file) # 额外检查:如果当前文件在输出文件夹里,跳过 if os.path.abspath(pdf_path).startswith(output_abs_path + os.sep): continue split_pdf_by_text(pdf_path, keyword, output_folder)
关键改动说明
- 跳过输出目录的遍历:在
process_all_pdfs里,先获取输出文件夹的绝对路径,遍历到该目录时直接跳过,避免处理刚生成的PDF文件。 - 检查输出文件是否存在:在生成新PDF前,先判断目标文件是否已存在,存在则跳过,避免重复生成。
- 中文提示优化:把英文提示改成中文,更直观。
内容的提问来源于stack exchange,提问作者Abdul Wasay
相关产品推荐
相关产品推荐

