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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 03:24:56