基于OpenAI API实现PDF发票信息提取
1. 引言
在日常办公中,企业和个人经常需要处理大量的发票数据,包括提取发票代码、发票号码、开票日期、金额等关键信息。手动录入这些信息费时费力,因此自动化发票信息提取成为刚需。
本文将介绍如何利用 OpenAI API
和 PyMuPDF
(即 fitz
) 实现 PDF 发票的自动信息提取。代码将解析 PDF 文件内容,并通过 AI 模型精准提取相关字段。
2. 依赖环境
在实现该功能之前,需要安装以下 Python 依赖库:
pip install openai pymupdf
此外,需要在 config.py
中配置 API Key
及 PDF 文件路径
。
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
发票的完整流程,包括:
- 使用 PyMuPDF 解析 PDF 文本
- 构造 AI 提示词,让大模型精准提取发票信息
- 调用 OpenAI API 并解析返回 JSON 结果
这一方案可以广泛应用于财务报销、企业票据管理等场景,极大提高工作效率。如果你有更复杂的需求,可以尝试调整 prompt
或使用更强大的 LLM
模型。