【Python】基于OpenAI API实现PDF发票信息提取

发布于:2025-03-28 ⋅ 阅读:(30) ⋅ 点赞:(0)

基于OpenAI API实现PDF发票信息提取

1. 引言

在日常办公中,企业和个人经常需要处理大量的发票数据,包括提取发票代码、发票号码、开票日期、金额等关键信息。手动录入这些信息费时费力,因此自动化发票信息提取成为刚需。

本文将介绍如何利用 OpenAI APIPyMuPDF (即 fitz) 实现 PDF 发票的自动信息提取。代码将解析 PDF 文件内容,并通过 AI 模型精准提取相关字段。


2. 依赖环境

在实现该功能之前,需要安装以下 Python 依赖库:

pip install openai pymupdf

此外,需要在 config.py 中配置 API KeyPDF 文件路径


3. 代码实现

3.1 完整代码

from openai import OpenAI
import fitz  # PyMuPDF
import config  # 需要配置API Key和PDF路径

def get_pdf_text(pdf_path):
    doc = fitz.open(pdf_path)
    markdown_text = ""
    for page_num in range(len(doc)):
        page = doc[page_num]
        blocks = page.get_text("dict")["blocks"]

        for block in blocks:
            if "lines" in block:
                for line in block["lines"]:
                    for span in line["spans"]:
                        text = span["text"]
                        markdown_text += f"{text}"
                markdown_text += "\n"
    return markdown_text

def create_invoice_extraction_prompt(invoice_text):
    prompt = f"""
请分析以下发票文本,准确提取以下信息:
1. 发票代码
2. 发票号码
3. 开票日期
4. 价税合计的小写金额
5. 销售方名称
6. 消费类型(如:餐饮、交通、办公用品、通讯等)

请务必仔细分析商品或服务内容,据此判断消费类型。
如果无法确定某项信息,请标注为"未找到"。

发票文本:
{invoice_text}

请以 JSON 格式返回结果:
{{
  "发票代码": "",
  "发票号码": "",
  "开票日期": "",
  "价税合计": "",
  "销售方名称": "",
  "消费类型": ""
}}
"""
    return prompt

# 初始化 OpenAI 客户端
client = OpenAI(
    api_key=config.DASHSCOPE_API_KEY,
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

sample_invoice_text = get_pdf_text(config.PDF_PATH)

# 创建聊天完成请求
completion = client.chat.completions.create(
    model="qwq-32b",  # 可按需更换模型名称
    messages=[
        {"role": "user", "content": create_invoice_extraction_prompt(sample_invoice_text)}
    ],
    stream=True,
)

reasoning_content = ""  # 记录思考过程
answer_content = ""     # 记录最终答案
is_answering = False   # 标记是否已进入回复阶段

print("\n" + "=" * 20 + "思考过程" + "=" * 20 + "\n")

for chunk in completion:
    if not chunk.choices:
        print("\nUsage:")
        print(chunk.usage)
    else:
        delta = chunk.choices[0].delta
        if hasattr(delta, 'reasoning_content') and delta.reasoning_content:
            print(delta.reasoning_content, end='', flush=True)
            reasoning_content += delta.reasoning_content
        else:
            if delta.content and not is_answering:
                print("\n" + "=" * 20 + "完整回复" + "=" * 20 + "\n")
                is_answering = True
            print(delta.content, end='', flush=True)
            answer_content += delta.content

print("\n\n" + "=" * 50)
print("提取结果:")
print(answer_content)

4. 运行示例

在这里插入图片描述


5. 总结

通过本文的介绍,我们实现了一个基于 OpenAI API 解析 PDF 发票的完整流程,包括:

  1. 使用 PyMuPDF 解析 PDF 文本
  2. 构造 AI 提示词,让大模型精准提取发票信息
  3. 调用 OpenAI API 并解析返回 JSON 结果

这一方案可以广泛应用于财务报销、企业票据管理等场景,极大提高工作效率。如果你有更复杂的需求,可以尝试调整 prompt 或使用更强大的 LLM 模型。