发票 OCR 识别 API 实战:自动识别增值税发票信息(完整接入指南)
本文从真实业务场景出发,讲清发票 OCR 的实现方式,并给出可直接落地的 API 接入方案。
在企业系统中,有一个非常高频但低效的场景:
👉 发票信息录入
常见问题:
- 人工录入慢(1张发票 30s+)
- 容易出错(金额 / 税号 / 日期)
- 批量处理困难
因此,越来越多系统开始引入:
👉 发票 OCR 自动识别
一、发票 OCR 能识别哪些内容?
以增值税发票为例,通常可以自动提取:
- 发票代码
- 发票号码
- 开票日期
- 金额 / 税额
- 购买方信息
- 销售方信息
👉 这些字段可以直接用于:
- 财务系统
- 报销系统
- ERP 系统
二、技术实现流程(工程视角)
完整流程如下:
上传发票图片
↓
图像预处理(去噪 / 矫正)
↓
OCR 文本检测 + 识别
↓
字段结构化解析
↓
返回 JSON 数据
⭐ 核心难点
发票 OCR 比普通 OCR 更难:
- 表格结构复杂
- 字段位置不固定
- 发票种类多
- 易受光照 / 折痕影响
👉 这也是为什么不建议自己从 0 做。
三、发票 OCR API 接入实战
Step 1:准备图片
支持:
- 手机拍照
- 扫描件
- PDF 转图片
Step 2:调用发票 OCR API
如果你正在做系统集成,建议直接参考接口文档(包含多语言示例),可以快速跑通。
👉 接口文档: market.shiliuai.com/doc/invoice…
示例代码\👇
# Python 示例
# API 文档:https://market.shiliuai.com/doc/invoice-ocr
# -*- coding: utf-8 -*-
import requests
import base64
import json
# 请求接口
URL = "https://ocr-api.shiliuai.com/api/invoice_ocr/v1"
# 图片转base64
def get_base64(file_path):
with open(file_path, 'rb') as f:
data = f.read()
b64 = base64.b64encode(data).decode('utf8')
return b64
def demo(appcode, file_path):
# 请求头
headers = {
'Authorization': 'APPCODE %s' % appcode,
'Content-Type': 'application/json'
}
# 请求体
b64 = get_base64(file_path)
data = {"file_base64": b64}
# 请求
response = requests.post(url=URL, headers=headers, json=data)
content = json.loads(response.content)
print(content)
if __name__=="__main__":
appcode = "你的APPCODE"
file_path = "本地文件路径"
demo(appcode, file_path)
// JS 示例
// API 文档:https://market.shiliuai.com/doc/invoice-ocr
// 需 Node.js 18+(内置 fetch)
const fs = require('fs');
const apiUrl = 'https://ocr-api.shiliuai.com/api/invoice_ocr/v1';
const appcode = '你的APPCODE';
const filePath = '本地文件路径';
async function main() {
const fileBase64 = fs.readFileSync(filePath).toString('base64');
const res = await fetch(apiUrl, {
method: 'POST',
headers: {
Authorization: 'APPCODE ' + appcode,
'Content-Type': 'application/json'
},
body: JSON.stringify({ file_base64: fileBase64 })
});
const text = await res.text();
if (!res.ok) {
console.error('Http code:', res.status, text);
return;
}
console.log(JSON.stringify(JSON.parse(text), null, 2));
}
main().catch(console.error);
Step 3:解析返回结果
典型返回:
{
'code': 200,
'msg': 'OK',
'msg_cn': '成功',
'success': True,
'file_id': file id,
'request_id': request id,
'data': data
}
data = {
"n": 发票数量,
"content": [
{
"标题": "浙江增值税电子普通发票",// 以下格式均为string
"发票号码": "12345678",
"开票日期": "2023-05-18",
"购买方名称": "低价买入有限责任公司",
"销售方名称": "高价卖出有限责任公司",
"购买方纳税人识别号": "440123456789451",
"销售方纳税人识别号": "550123456789451",
"购买方地址电话": "翻斗大街翻斗花园2号楼1001室-12345678911",
"销售方地址电话": "翻斗大街翻斗花园2号楼1101室-98745612326",
"购买方开户行及账号": "努力存钱A大银行",
"销售方开户行及账号": "努力存钱B大银行",
"大写金额": "捌拾玖万肆仟伍佰陆拾壹",
"小写金额": "894561.00",
"项目": [
{
"项目名称": "糊涂兔笔记本",
"规格型号": "糊涂兔",
"单位": "台",
"数量": "88",
"单价": "3888",
"金额": "342144",
"税率": "17%",
"税额": "58164.48"
}
],
"开票人": "张三",
"收款人": "李四",
"复核人": "王五",
"page_no": 1 // int, 该内容在文件的第几页(从1开始)
}
]
}
👉 可以直接入库或进入业务流程。
四、真实项目中的坑
❗ 坑 1:发票拍照不规范
问题:
- 倾斜
- 反光
- 遮挡
👉 建议前端增加拍照引导。
❗ 坑 2:不同发票类型混用
例如:
- 普票
- 专票
- 电子发票
👉 建议区分接口或做自动识别。
❗ 坑 3:字段解析不稳定
如果用通用 OCR + 正则:
- 极易出错
- 维护成本高
👉 建议直接用结构化 OCR。
五、在线工具 vs API 接入
✅ 在线工具适合
- 人工使用
- 少量处理
- 快速验证
👉 在线体验: market.shiliuai.com/tools/invoi…
✅ API 更适合
- 自动报销系统
- 企业 SaaS
- 批量处理
六、一个真实落地建议
很多团队的正确路径是:
1️⃣ 先用在线工具验证效果
2️⃣ 再接入 API
3️⃣ 最后做自动化流程
👉 这样风险最低。
七、总结
发票 OCR 的核心价值在于:
- 提高效率
- 降低错误率
- 支持自动化
如果你的系统涉及:
- 财务
- 报销
- 企业管理
👉 强烈建议尽早接入。