使用简单的Python脚本实现AI OCR发票数据提取

使用简单的Python脚本实现AI OCR发票数据提取

学习如何结合FlowHunt API,使用基于AI的OCR与Python自动提取发票数据,实现快速、准确且可扩展的文档处理。

什么是基于AI的OCR?

AI驱动的OCR超越了传统OCR的能力,它利用人工智能理解文档上下文,能处理多种布局类型,即使是最复杂的文档也能高质量提取结构化数据。传统OCR只能处理固定格式文本,而AI OCR则适用于发票及各类商业文档中常见的多种布局和配置。

基于AI的OCR的主要特性

  • 上下文理解: AI OCR使用NLP理解文档语境。当“总金额”、“发票日期”、“客户名称”等字段出现在不同位置时,都能准确识别。
  • 灵活性: 传统OCR遇到不规则布局容易出错;AI OCR则具备极高的灵活性,能轻松从各种发票格式中提取信息。
  • 数据结构化: AI OCR通常直接输出结构化结果,便于后续处理,而传统OCR仅输出原始文本。

为什么要用AI OCR处理发票?

无论是财务、物流还是采购部门,发票都需高效且高精度地处理。AI OCR自动提取数据,优化流程,提高数据准确性。

AI OCR处理发票的优势

  • 速度与效率: 利用AI OCR,可在极短时间内批量处理大量发票,节省人力和资源。
  • 提高准确率: 经过多种文档格式训练的AI模型,减少了人工录入带来的错误。
  • 数据管理更流畅: 数据已结构化,可便捷导入数据库、分析系统,甚至ERP系统。
  • 可扩展性: AI OCR无需增加人手即可处理海量文档,适用于大型企业或快速扩张的公司。

使用FlowHunt AI OCR工具的投资回报率(ROI)

大多数传统企业仍通过人工方式手动从发票中提取数据,这既耗时又成本高。税务、法律、金融等众多领域和公司都可以自动化这项工作。

该流程仅需5到15秒,费用为0.01–0.02积分,而人工处理同样任务的时薪通常为$15–$30。

OCR Cost Comparison
处理方式年成本年处理发票数量单张发票成本
人工$30,00012,000$2.50
FlowHunt$16212,000$0.013
FlowHunt($30,000预算)$30,0002,250,000$0.0133

可以说,FlowHunt的效率高出极大幅度。

OCR实施中的常见问题

虽然OCR非常有用,但也面临一些挑战:

  1. 图像质量: OCR准确率高度依赖图像质量。模糊或低分辨率图片会导致识别结果差。
  2. 格式复杂: 含有复杂布局、混合字体或表格的文档可能需要高级OCR处理能力。
  3. 语言与字符集: 部分OCR软件的语言支持有限,遇到非拉丁字符时需特殊模型。
  4. 错误率: 没有任何OCR软件能做到100%准确,尤其是花体或不规则字体,可能导致输出出错。

为应对这些挑战,必须选用强大灵活的OCR工具。FlowHunt API可处理复杂文档结构,是大规模OCR项目的理想选择。

Python OCR脚本环境配置

为了自动化流程,需安装以下Python库:

pip install requests pdf2image git+https://github.com/QualityUnit/flowhunt-python-sdk.git

该命令会安装:

  • requests: 用于向FlowHunt API发送HTTP请求、下载OCR结果。
  • pdf2image: 将PDF页面转换为图片。
  • flowhunt: FlowHunt官方Python SDK,简化与OCR API的交互。

代码分步详解

本代码会将PDF转为图片,逐页发送至FlowHunt进行OCR处理,并将结果保存为CSV。

导入依赖库

import json
import os
import re
import time
import requests
import flowhunt
from flowhunt.rest import ApiException
from pprint import pprint
from pdf2image import convert_from_path
  • jsonosretime 负责JSON处理、文件管理、正则表达式和时间间隔。
  • requests:用于处理HTTP请求,如下载OCR结果。
  • flowhunt:FlowHunt SDK,用于鉴权及与OCR API通信。
  • pdf2image:将PDF每页转为图片,便于逐页OCR。

PDF转图片函数

def convert_pdf_to_image(path: str) -> None:
    """
    Convert a PDF file to images, storing each page as a JPEG.
    """
    images = convert_from_path(path)
    for i in range(len(images)):
        images[i].save('data/images/' + 'page' + str(i) + '.jpg', 'JPEG')
  • convert_from_path:将PDF每页转为一张图片。
  • images[i].save:保存每页为独立JPEG图片,便于后续OCR。

提取OCR输出文件URL的函数

def extract_attachment_url(data_string):
    pattern = r'```flowhunt\n({.*})\n```'
    match = re.search(pattern, data_string, re.DOTALL)
    if match:
        json_string = match.group(1)
        try:
            json_data = json.loads(json_string)
            return json_data.get('download_link', None)
        except json.JSONDecodeError:
            print("Error: Failed to decode JSON.")
            return None
    return None
  • 该函数用于提取OCR输出文件的下载链接。
  • 利用正则表达式查找包含下载链接的JSON对象。

API配置及鉴权

convert_pdf_to_image("data/test.pdf")
FLOW_ID = "<FLOW_ID_HERE>"

configuration = flowhunt.Configuration(
    host="https://api.flowhunt.io",
    api_key={"APIKeyHeader": "<API_KEY_HERE>"}
)
  • 将PDF转为图片。
  • 使用FlowHunt账号信息配置API访问。

初始化API客户端

with flowhunt.ApiClient(configuration) as api_client:
    auth_api = flowhunt.AuthApi(api_client)
    api_response = auth_api.get_user()
    workspace_id = api_response.api_key_workspace_id
  • 完成认证,获取workspace_id,后续API调用需用到。

启动流程会话(Flow Session)

flows_api = flowhunt.FlowsApi(api_client)
from_flow_create_session_req = flowhunt.FlowSessionCreateFromFlowRequest(flow_id=FLOW_ID)
create_session_rsp = flows_api.create_flow_session(workspace_id, from_flow_create_session_req)
  • 创建会话,便于上传图片并处理OCR。

上传图片进行OCR处理

for image in os.listdir("data/images"):
    image_name, image_extension = os.path.splitext(image)
    with open("data/images/" + image, "rb") as file:
        try:
            flow_sess_attachment = flows_api.upload_attachments(
                create_session_rsp.session_id,
                file.read()
            )
  • 将每张图片上传到会话中,供OCR处理。

触发OCR处理并轮询结果

invoke_rsp = flows_api.invoke_flow_response(
    create_session_rsp.session_id, 
    flowhunt.FlowSessionInvokeRequest(message="")
)
while True:
    get_flow_rsp = flows_api.poll_flow_response(
        create_session_rsp.session_id, invoke_rsp.message_id
    )
    print("Flow response: ", get_flow_rsp)
    if get_flow_rsp.response_status == "S":
        print("done OCR")
        break
    time.sleep(3)
  • 触发OCR处理,并每3秒轮询一次直到处理完成。

下载并保存OCR输出

attachment_url = extract_attachment_url(get_flow_rsp.final_response[0])
if attachment_url:
    response = requests.get(attachment_url)
    with open("data/results/" + image_name + ".csv", "wb") as file:
        file.write(response.content)
  • 下载CSV输出结果,保存到本地。

运行脚本与输出测试

执行流程如下:

  1. 将PDF文件放入data/文件夹。
  2. 用您的FlowHunt账号信息替换<FLOW_ID_HERE><API_KEY_HERE>
  3. 运行脚本即可完成PDF转图片、图片上传OCR、下载结构化CSV结果的自动处理。

总结

本Python脚本为大规模OCR流程提供高效解决方案,适用于高文档处理需求的行业。结合FlowHunt API,轻松实现文档到CSV的转换,优化流程、提升生产力。

完整代码一览

点此查看Gist版本

import json
import os
import re
import time
import requests
import flowhunt
from flowhunt.rest import ApiException
from pprint import pprint
from pdf2image import convert_from_path

def convert_pdf_to_image(path: str) -> None:
    """
    Convert a pdf file to an image
    :return:
    """
    images = convert_from_path(path)
    for i in range(len(images)):
        images[i].save('data/images/' + 'page'+ str(i) +'.jpg', 'JPEG')

def extract_attachment_url(data_string):
    pattern = r'```flowhunt\n({.*})\n```'
    match = re.search(pattern, data_string, re.DOTALL)
    if match:
        json_string = match.group(1)
        try:
            json_data = json.loads(json_string)
            return json_data.get('download_link', None)
        except json.JSONDecodeError:
            print("Error: Failed to decode JSON.")
            return None
    return None

convert_pdf_to_image("data/test.pdf")
FLOW_ID = "<FLOW_ID_HERE>"

configuration = flowhunt.Configuration(host = "https://api.flowhunt.io",
                                       api_key = {"APIKeyHeader": "<API_KEY_HERE>"})

with flowhunt.ApiClient(configuration) as api_client:
    auth_api = flowhunt.AuthApi(api_client)
    api_response = auth_api.get_user()
    workspace_id = api_response.api_key_workspace_id

    flows_api = flowhunt.FlowsApi(api_client)
    from_flow_create_session_req = flowhunt.FlowSessionCreateFromFlowRequest(
        flow_id=FLOW_ID
    )
    create_session_rsp = flows_api.create_flow_session(workspace_id, from_flow_create_session_req)

    for image in os.listdir("data/images"):
        image_name, image_extension = os.path.splitext(image)
        with open("data/images/" + image, "rb") as file:
            try:
                flow_sess_attachment = flows_api.upload_attachments(
                    create_session_rsp.session_id,
                    file.read()
                )
                invoke_rsp = flows_api.invoke_flow_response(create_session_rsp.session_id, flowhunt.FlowSessionInvokeRequest(
                    message="",
                ))
                while True:
                    get_flow_rsp = flows_api.poll_flow_response(create_session_rsp.session_id, invoke_rsp.message_id)
                    print("Flow response: ", get_flow_rsp)
                    if get_flow_rsp.response_status == "S":
                        print("done OCR")
                        attachment_url = extract_attachment_url(get_flow_rsp.final_response[0])
                        if attachment_url:
                            print("Attachment URL: ", attachment_url, "\n Downloading the file...")
                            response = requests.get(attachment_url)
                            with open("data/results/" + image_name + ".csv", "wb") as file:
                                file.write(response.content)
                        break
                    time.sleep(3)
            except ApiException as e:
                print("error for file ", image)
                print(e)

常见问题

什么是基于AI的OCR?它与传统OCR有何不同?

基于AI的OCR利用机器学习和自然语言处理理解文档上下文,处理复杂布局,从发票中提取结构化数据;而传统OCR依赖固定格式识别文本。

使用AI OCR处理发票的主要优势有哪些?

AI OCR具备速度快、准确率高、易扩展并能输出结构化数据的优势,减少人工操作和错误,实现与企业系统的无缝集成。

如何用Python和FlowHunt实现发票OCR自动化?

通过使用FlowHunt的Python SDK,可将PDF转为图片,发送至API进行OCR并获取CSV格式的结构化数据,实现全流程自动化提取。

OCR处理过程中存在哪些挑战,FlowHunt如何应对?

常见挑战包括图像质量差、文档布局复杂、语言多样等。FlowHunt API通过先进AI模型和灵活处理能力,有效应对这些问题。

用FlowHunt自动提取发票数据的投资回报率(ROI)如何?

FlowHunt的AI OCR能以极低的人力成本在数秒内处理发票,大幅提升效率,实现企业大规模扩展。

阿尔西亚是 FlowHunt 的一名 AI 工作流程工程师。拥有计算机科学背景并热衷于人工智能,他专注于创建高效的工作流程,将 AI 工具整合到日常任务中,从而提升生产力和创造力。

阿尔西亚·卡哈尼
阿尔西亚·卡哈尼
AI 工作流程工程师

试用FlowHunt的AI发票OCR工具

借助FlowHunt强大的AI OCR自动提取发票数据。节省时间,减少错误,秒级将PDF转为结构化数据,优化您的工作流程。

了解更多

发票数据提取器
发票数据提取器

发票数据提取器

了解发票数据提取器OCR流程如何通过自动化提取和整理发票数据来优化您的财务流程。了解其功能、优势,以及它如何提升各类企业的效率与准确性。更多精彩内容尽在FlowHunt。...

1 分钟阅读
OCR Invoice Automation +3
AI发票OCR与数据提取机器人
AI发票OCR与数据提取机器人

AI发票OCR与数据提取机器人

通过上传发票图片并提取关键发票数据(如发票号码、类型、语言、项目、价格和总金额)来实现发票处理自动化。结果以markdown表格和结构化CSV文件输出,助力高效的财务工作流程。...

1 分钟阅读
用AI解决OCR任务
用AI解决OCR任务

用AI解决OCR任务

了解由AI驱动的OCR如何变革数据提取,自动化文档处理,并在金融、医疗和零售等行业提升效率。探索OCR的发展历程、实际应用案例,以及OpenAI Sora等前沿解决方案。...

1 分钟阅读
AI OCR +5