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

如何用Python自动化从批量PDF发票提取指定值并写入Excel?

批量PDF发票提取数据至Excel的Python实现

完全可以用Python实现这个自动化任务,尤其适合处理上百份PDF发票的场景。下面是一套可落地的实现方案,核心用到pdfplumber(精准提取PDF文本)和pandas(高效处理并写入Excel)两个库。

前置准备

先安装依赖库:

pip install pdfplumber pandas

完整代码实现

import os
import re
import pdfplumber
import pandas as pd

def extract_invoice_data(pdf_path):
    """从单份PDF发票中提取目标数据"""
    invoice_data = {
        "发票编号": "",
        "开票日期": "",
        "总金额": "",
        "供应商名称": ""
    }
    
    with pdfplumber.open(pdf_path) as pdf:
        # 读取第一页(多数发票核心信息在第一页)
        first_page = pdf.pages[0]
        text = first_page.extract_text()
        
        # 用正则匹配目标字段,需根据你的发票格式调整正则表达式
        # 示例:匹配发票编号(格式如"发票编号: 12345678")
        inv_num_match = re.search(r"发票编号:\s*(\w+)", text)
        if inv_num_match:
            invoice_data["发票编号"] = inv_num_match.group(1)
        
        # 匹配开票日期(格式如"开票日期: 2024-05-20")
        date_match = re.search(r"开票日期:\s*(\d{4}-\d{2}-\d{2})", text)
        if date_match:
            invoice_data["开票日期"] = date_match.group(1)
        
        # 匹配总金额(格式如"总金额: ¥1234.56")
        total_match = re.search(r"总金额:\s*¥(\d+\.\d{2})", text)
        if total_match:
            invoice_data["总金额"] = float(total_match.group(1))
        
        # 匹配供应商名称(格式如"供应商: XX科技有限公司")
        vendor_match = re.search(r"供应商:\s*(.+)", text)
        if vendor_match:
            invoice_data["供应商名称"] = vendor_match.group(1)
    
    return invoice_data

def batch_process_invoices(folder_path, output_excel):
    """批量处理指定文件夹下的所有PDF发票"""
    all_invoice_data = []
    
    # 遍历文件夹下的所有PDF文件
    for filename in os.listdir(folder_path):
        if filename.endswith(".pdf"):
            pdf_full_path = os.path.join(folder_path, filename)
            print(f"正在处理: {filename}")
            data = extract_invoice_data(pdf_full_path)
            data["文件名"] = filename  # 保留原文件名便于核对
            all_invoice_data.append(data)
    
    # 将数据转换为DataFrame并写入Excel
    df = pd.DataFrame(all_invoice_data)
    df.to_excel(output_excel, index=False, encoding="utf-8")
    print(f"处理完成!结果已保存至: {output_excel}")

# 主程序入口
if __name__ == "__main__":
    # 替换为你的PDF发票文件夹路径
    INVOICE_FOLDER = "./invoices"
    # 替换为输出Excel的路径
    OUTPUT_EXCEL = "./发票汇总.xlsx"
    
    batch_process_invoices(INVOICE_FOLDER, OUTPUT_EXCEL)

关键说明

  • 正则表达式调整:代码中的正则是通用示例,实际要根据你的发票具体格式修改(比如有些发票的字段名是"发票号码"而不是"发票编号",金额符号可能是"$")。可以先提取单份发票的文本,打印出来后针对性编写正则。
  • 复杂PDF处理:如果遇到扫描版PDF(图片转的PDF),pdfplumber无法提取文本,需要结合OCR工具如pytesseract,先将PDF转图片再识别文本。
  • 测试先行:批量处理前,先拿1-2份发票测试extract_invoice_data函数,确保能正确提取数据后再跑批量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:40:36