什么是基于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。

| 处理方式 | 年成本 | 年处理发票数量 | 单张发票成本 |
|---|---|---|---|
| 人工 | $30,000 | 12,000 | $2.50 |
| FlowHunt | $162 | 12,000 | $0.013 |
| FlowHunt($30,000预算) | $30,000 | 2,250,000 | $0.0133 |
可以说,FlowHunt的效率高出极大幅度。
OCR实施中的常见问题
虽然OCR非常有用,但也面临一些挑战:
- 图像质量: OCR准确率高度依赖图像质量。模糊或低分辨率图片会导致识别结果差。
- 格式复杂: 含有复杂布局、混合字体或表格的文档可能需要高级OCR处理能力。
- 语言与字符集: 部分OCR软件的语言支持有限,遇到非拉丁字符时需特殊模型。
- 错误率: 没有任何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
json、os、re、time负责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输出结果,保存到本地。
运行脚本与输出测试
执行流程如下:
- 将PDF文件放入
data/文件夹。 - 用您的FlowHunt账号信息替换
<FLOW_ID_HERE>和<API_KEY_HERE>。 - 运行脚本即可完成PDF转图片、图片上传OCR、下载结构化CSV结果的自动处理。
总结
本Python脚本为大规模OCR流程提供高效解决方案,适用于高文档处理需求的行业。结合FlowHunt API,轻松实现文档到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
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)

