多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文件名,方便后续核对
使用注意事项
- 必须根据你的PDF实际排版,调整
field_rules里的in_bbox坐标。可以通过执行pdf.tree.write('pdf结构.html')生成可视化页面,查看对应文本的坐标范围 - 先安装依赖包:
pip install pdfquery pandas - 如果PDF是扫描件(纯图片),pdfquery无法提取文本,需要先用OCR工具(如pytesseract)转成可编辑文本再处理
内容的提问来源于stack exchange,提问作者Paulzzz
相关产品推荐
相关产品推荐

