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

多PDF文件指定字段提取至CSV的Python实现求助

批量提取PDF指定字段到CSV的Python方案

核心思路

前7项字段集中在PDF首页,第8、9项分布在其他页面,所以代码会先提取首页的前7项,再遍历所有页面定位剩余两个字段,找到后立即停止以提升效率,最后批量处理文件夹内所有PDF并将结果导出为CSV。

完整代码

import os
import pandas as pd
from pdfquery import PDFQuery

def extract_pdf_fields(pdf_path):
    pdf = PDFQuery(pdf_path)
    pdf.load()
    
    # 按你的PDF实际布局调整xpath定位规则
    field_rules = {
        "Exporter/supplier Name": 'LTTextLineHorizontal:in_bbox("100, 700, 500, 750")',
        "Customs Reference No": 'LTTextLineHorizontal:in_bbox("100, 650, 500, 700")',
        "Country of Origin": 'LTTextLineHorizontal:in_bbox("100, 600, 500, 650")',
        "Item Description": 'LTTextLineHorizontal:in_bbox("100, 500, 500, 600")',
        "Invoice No": 'LTTextLineHorizontal:in_bbox("100, 450, 500, 500")',
        "Assessment Date": 'LTTextLineHorizontal:in_bbox("100, 400, 500, 450")',
        "Import/Registration Date": 'LTTextLineHorizontal:in_bbox("100, 350, 500, 400")',
        "Taxable Value": 'LTTextLineHorizontal:in_bbox("100, 200, 500, 250")',
        "Total VAT": 'LTTextLineHorizontal:in_bbox("100, 150, 500, 200")'
    }
    
    extracted_data = {field: "N/A" for field in field_rules.keys()}
    
    # 提取首页的前7项
    for field in list(field_rules.keys())[:7]:
        elements = pdf.pq(field_rules[field])
        if elements:
            extracted_data[field] = elements.text()
    
    # 遍历所有页面找第8、9项
    total_pages = len(pdf.pq('LTPage'))
    for page_num in range(1, total_pages + 1):
        pdf.load(page_num)
        # 查找应税价值
        if extracted_data["Taxable Value"] == "N/A":
            elements = pdf.pq(field_rules["Taxable Value"])
            if elements:
                extracted_data["Taxable Value"] = elements.text()
        # 查找总增值税
        if extracted_data["Total VAT"] == "N/A":
            elements = pdf.pq(field_rules["Total VAT"])
            if elements:
                extracted_data["Total VAT"] = elements.text()
        # 找到目标字段后提前终止循环
        if extracted_data["Taxable Value"] != "N/A" and extracted_data["Total VAT"] != "N/A":
            break
    
    return extracted_data

def batch_process_pdfs(folder_path, output_csv):
    all_data = []
    # 遍历文件夹内所有PDF文件
    for filename in os.listdir(folder_path):
        if filename.lower().endswith(".pdf"):
            pdf_path = os.path.join(folder_path, filename)
            print(f"处理文件: {filename}")
            data = extract_pdf_fields(pdf_path)
            data["PDF文件名"] = filename  # 添加文件名方便核对原始文件
            all_data.append(data)
    
    # 导出为CSV
    df = pd.DataFrame(all_data)
    df.to_csv(output_csv, index=False, encoding="utf-8-sig")
    print(f"所有PDF处理完成,结果已保存到 {output_csv}")

# 调用示例(替换为你的文件夹路径和输出路径)
if __name__ == "__main__":
    target_folder = "./你的PDF文件夹路径"
    output_file = "./提取结果.csv"
    batch_process_pdfs(target_folder, output_file)

关键调整说明

  • 跨页检索:不再局限于首页,自动遍历所有页面查找第8、9项,找到后立即停止循环,避免无效遍历
  • 批量处理:自动识别文件夹内所有PDF,无需手动逐个处理
  • 容错机制:字段找不到时标记为"N/A",避免代码崩溃
  • 溯源标记:在结果中添加原始PDF文件名,方便后续核对

使用注意事项

  1. 必须根据你的PDF实际排版,调整field_rules里的in_bbox坐标。可以通过执行pdf.tree.write('pdf结构.html')生成可视化页面,查看对应文本的坐标范围
  2. 先安装依赖包:pip install pdfquery pandas
  3. 如果PDF是扫描件(纯图片),pdfquery无法提取文本,需要先用OCR工具(如pytesseract)转成可编辑文本再处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:42:46