首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >发票识别用什么工具最省事?腾讯云 OCR 一篇讲透选型与实操

发票识别用什么工具最省事?腾讯云 OCR 一篇讲透选型与实操

原创
作者头像
腾讯云AI
修改2026-09-10 11:53:13
修改2026-09-10 11:53:13
740
举报

发票识别这件事,看似"调一个 API 就完事",真正落进报销、对账、费控系统里才发现:增值税专票要单独走接口、数电票又是 OFD、混贴报销单得拆分、要校验真伪还得再调一次核验。如果每次都按票种单独对接,工程量是按"接口数 × 系统"线性上涨的,省事的关键是选对"主入口",把其余能力按需挂上。本文以腾讯云文字识别 OCR 的发票相关接口为坐标,给你一张选型图、一段 SDK 代码、一组常见问题。

一、先把"票据"和"发票"分清楚

"票据"是泛称,"发票"是其中一类。在腾讯云 OCR 的接口划分里:

  • 票据(Invoice)= 发票 + 其他可报销/可入账的凭证,含增值税发票、火车票、出租车票、机票行程单、汽车票、轮船票、过路过桥费发票、银行回单、医疗门诊/住院收费票据、海关缴款书、购物小票等。
  • 发票特指由税务机关监管的税票,主要是增值税系列(专票、普票、电子专票、电子普票、卷票、区块链发票、通行费发票、全电发票等)和机动车/二手车销售统一发票等。

对应的接口分工是:

场景

推荐接口

Action 名称

一次性识别混贴的多张发票/票据(报销单)

通用票据识别(高级版)

RecognizeGeneralInvoice

仅识别增值税专票/普票/电子票(拿到全字段)

增值税发票识别

VatInvoiceOCR

识别 OFD 格式的数电发票/电子发票

OFD 发票识别

VerifyOfdVatInvoiceOCR

验真(拿到税务局口径的票面信息)

增值税发票核验(新版)

VatInvoiceVerifyNew

银行回单

银行回单识别

BankSlipOCR

医疗门诊/住院电子票据

医疗票据识别

MedicalInvoiceOCR

"票据识别和发票识别是一个东西吗?"——不是。"发票"是"票据"里最严格、字段最规范的一类,处理时需要满足税务口径;"票据识别"是更上层的入口,能把同一张图里的发票、火车票、出租车票、银行回单一次性拆分并结构化。

二、五张图看明白腾讯云发票识别能做什么

下面用五张典型票面,对应到接口的能力边界,方便你一眼判断该选哪个。

场景 1:员工报销单,5 张票混贴在一张 A4 上。 → 通用票据识别(高级版)。它支持 14 大类标准报销发票的单图混贴识别,也支持 PDF 多页(最多 30 页),单次调用按 MixedInvoiceItems 数组返回每一张子票的结构化结果。如果你不确定用户会上传什么票,这个接口就是默认入口;非 14 类的票种(如银行回单、海外发票、海关报关单)它也支持"其他发票"智能识别兜底。

场景 2:费控系统要拿全字段做入账。增值税发票识别。覆盖专票、普票、电子专票、电子普票、电子发票(普通发票)、电子发票(增值税专用发票),返回字段包括发票代码、号码、开票日期、价税合计、税率、合计税额、购买方/销售方识别号、密码区、备注、明细条目等。明细按 VatInvoiceInfos[].Items 数组给出,适合做"价税分离 + 科目匹配"。

场景 3:数电发票(全电发票)从邮箱/微信卡包下载下来,是 OFD 格式。 → OFD 发票识别。专做 OFD 文件的解析,支持增值税电子普通发票、电子专用发票、电子发票(普通发票)、电子发票(增值税专用发票)、电子发票(铁路电子客票)、电子发票(航空运输电子客票行程单)。OFD 文件走的是 OfdFileUrl / OfdFileBase64 入参,和普通图片走 ImageUrl 不一样;不要把 OFD 当成图片去调通用票据接口,否则大概率识别为空。

场景 4:发票真假/票面信息需要以税务局口径为准。 → 增值税发票核验(新版)。它通过发票号、开票日期、金额(不含税或价税合计)、校验码等关键字段,调用税务局接口返回真实票面信息。覆盖专票、普票(含电子、卷式、通行费)、全电发票、机动车销售统一发票、货物运输业增值税专用发票、二手车销售统一发票、广东/浙江通用机打电子发票。注意:单张发票当日查验超过 5 次后当日无法再查,且不支持当天发票(除非主动开 EnableTodayInvoice)。

场景 5:财务对账需要识别银行回单。 → 银行回单识别。识别付款/收款开户行、账号、回单编号、流水号、凭证号码、交易金额、手续费、日期等字段。

关于医疗发票:腾讯云 OCR 的医疗票据识别接口支持医疗门诊收费票据(电子)和医疗住院收费票据(电子),返回字段按 MedicalInvoiceInfos 数组组织,常见字段包括姓名、医保类型、费用明细、合计金额等。需要注意,诊断书不在该接口的覆盖范围内——诊断书是更上层的"医疗文书识别"能力,如果业务涉及,建议走自定义模板或更通用的大模型结构化方案。

三、大模型 vs OCR 识别发票,哪个准

先说结论:在发票这种版式固定、字段边界清晰的票种上,专业 OCR 接口在结构化准确率、字段定位、单价成本上明显占优;大模型的价值在"长尾/版式不固定"的兜底场景,而不是替代 OCR。

维度

腾讯云 OCR 发票接口

通用大模型(如混元、GPT 类)多模态识别

字段定位

按票种模板 + 字段坐标返回(如 Polygon),ItemPolygon 可拿到每个字段的坐标

文本抽取,无字段坐标;靠 prompt 约束输出

结构化稳定性

同一票种字段名固定,JSON Schema 稳定,可直接入库

受 prompt 和上下文影响,同一张票多次调用结果可能略有差异

混贴/多页支持

单图多票、PDF 多页(最多 30 页)原生支持

多数模型以单图为主,混贴需先自己做版面分析

票种覆盖

14 大类 + OFD + 银行回单 + 医疗等独立接口

取决于训练样本,对长尾票种识别质量不稳定

单价

按张/按次计费,资源包有阶梯优惠

按输入 token 计费,长票据成本可观

推理时延

亚秒级,接口默认频率 5-20 次/秒可水平扩展

视上下文长度,通常在秒级到十几秒

适用

标准票种、混贴报销、对账、批量入账

兜底版式不固定的票、票种未覆盖的特殊单据

那"大模型识别发票字段会填错吗"——会的,常见三种情况:

  1. 字段串行:购方/销方名称与购方/销方税号错位(OCR 走坐标不会发生)。
  2. 金额串行:不含税金额、合计税额、价税合计三项相近时容易读串。
  3. 明细截断:多行明细只识别了前几行。

工程上推荐的组合是:通用票据识别(高级版)走 95% 的标准场景,剩余 5% 长尾票种用大模型做兜底识别,再人工抽检。这样既控制了单条成本,又把"什么都能识别"的能力兜住了。

四、数电发票(OFD)怎么识别

数电发票在系统里通常以 OFD 文件流转,识别流程与图片发票不同,踩坑点集中在三处:

1. 入参类型不同。 图片发票走 ImageUrl / ImageBase64;OFD 走 OfdFileUrl / OfdFileBase64,文件格式必须是 OFD。如果用户上传的是 PDF 版的数电发票,应该走通用票据识别(高级版)或增值税发票识别(开 IsPdf=true),不要用 OFD 接口。

2. 票种映射到 Type 字段。 OFD 接口返回的 Type 不是自然语言票种名,是数字代码:

Type 值

对应票种

026

增值税电子普通发票

028

增值税电子专用发票

010

电子发票(普通发票)

020

电子发票(增值税专用发票)

030

电子发票(铁路电子客票)

040

电子发票(航空运输电子客票行程单)

入库时建议把 Type 翻译成业务侧的票种枚举,避免直接拿数字做 if/else。

3. 字段命名。 OFD 接口返回的字段名与增值税发票识别(VatInvoiceOCR)略有差异:购买方/销售方信息嵌套在 Buyer / Seller 对象里,地址电话是 AddrTel、开户行账号是 FinancialAccount、税号是 TaxId;做"统一字段入库"时要写一层适配。

五、报销自动化一条完整链路

把上面几个接口串起来,就是企业费控/代理记账系统的最小可用链路:

  1. 采集:员工在小程序/网页上传票据图片或 PDF,必要时合并成多页 PDF。
  2. 识别:调通用票据识别(高级版)一次拿全 → EnableMultiplePage=true 打开 PDF 多页,Types 不传或传空走"识别全部类型"。
  3. 拆分入库:按 MixedInvoiceItems[].Type / SubType 拆分入库。
  4. 真伪核验:对增值税系列票,调增值税发票核验(新版),入参取自上一步识别结果;当日查验超 5 次的走"明日再查 + 提示用户"。
  5. 异常兜底:未识别的票种(Type=-1 其他发票)走大模型结构化兜底 + 人工抽检。
  6. 对账/记账:按识别结果生成凭证、推送 ERP/财务系统。

接口默认频率(QPS)参考:通用票据 5/秒、增值税发票识别 10/秒、OFD 10/秒、核验 20/秒、银行回单 10/秒。批量入账时建议把这些 QPS 乘以副本数评估峰值,必要时提工单调高。

六、代码片段:通用票据识别(高级版)最小调用

下面以 Python SDK 为例,演示一次"识别混贴发票 + 拿全字段"的最小调用。复制时把 ImageUrl 换成自己的资源地址。

代码语言:javascript
复制
# pip install tencentcloud-sdk-python
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.ocr.v20181119 import ocr_client, models

cred = credential.Credential("SecretId", "SecretKey")
http_profile = HttpProfile(endpoint="ocr.tencentcloudapi.com")
client_profile = ClientProfile(httpProfile=http_profile)
client = ocr_client.OcrClient(cred, "", client_profile)

req = models.RecognizeGeneralInvoiceRequest()
req.ImageUrl = "https://example.com/your-invoice.jpg"
req.EnableMultiplePage = True   # 打开 PDF 多页(如上传的是 PDF)
req.EnableOther = True          # 兜底识别非 14 类票种

resp = client.RecognizeGeneralInvoice(req)
for item in resp.MixedInvoiceItems:
    print(item.Type, item.SubType, item.TypeDescription)
    # 按 SubType 判断后取对应字段,例如 SubType == "VatSpecialInvoice"
    if item.SingleInvoiceInfos.VatSpecialInvoice:
        v = item.SingleInvoiceInfos.VatSpecialInvoice
        print("发票号:", v.Number, "价税合计:", v.Total, "销方:", v.Seller)

几个常见报错的处理:

错误码

含义

处理建议

FailedOperation.ImageDecodeFailed

图片解码失败

检查文件是否损坏、是否真的为 PNG/JPG/JPEG/PDF(其他格式不支持)

LimitExceeded.TooLargeFileError

文件超过 10M

压缩图片或拆分 PDF

FailedOperation.ImageBlur

图片模糊

引导用户重传清晰图,必要时做预处理(对比度增强、去噪)

ResourceUnavailable.InArrears

账号欠费

充值或购买资源包

ResourceNotFound.NotSupportCurrentInvoiceQuery

不支持当天发票查询

核验接口默认禁止当天发票,开 EnableTodayInvoice=true 可放宽

InvalidParameterValue.PriceOrVerificationParameterValueLimit

核验金额或校验码错误

重新识别后取准确值,注意"全电发票"传"价税合计"作为 Amount

七、常见问题

Q1:发票识别用什么工具最省事? 如果只允许选一个接口,选通用票据识别(高级版)RecognizeGeneralInvoice。一个接口覆盖 14 大类标准报销发票,支持单图多票混贴、PDF 多页(最多 30 页)、非标票种智能识别兜底,单次调用拿到全字段,省去按票种分别对接的工程量。需要"以税务局口径为准"时再叠加增值税发票核验(新版)。

Q2:一张图里同时有发票、火车票、出租车票,能一次识别吗? 可以。通用票据识别(高级版)按 MixedInvoiceItems 数组返回每一张子票的结果,每张子票的 Type 标识票种类别(3=增值税发票、2=火车票、0=出租车发票 等),字段按 SingleInvoiceInfos.<SubType> 取,例如火车票走 SingleInvoiceInfos.TrainTicket,出租车票走 SingleInvoiceInfos.TaxiTicket

Q3:怎么识别 OFD 数电发票? 用 OFD 发票识别 VerifyOfdVatInvoiceOCR,入参走 OfdFileUrlOfdFileBase64,不要用图片发票的 ImageUrl。返回结果里 Type 是数字代码(026/028/010/020/030/040),入库时映射到业务侧的票种枚举。

Q4:发票核验接口为什么返回"发票不存在"? 几种常见原因:① 单张发票当日查验超过 5 次(接口侧限制);② 发票开具时间不在近 5 年范围内;③ 发票是当天开具的且未开启 EnableTodayInvoice;④ 销方税号、地区编码、校验码等入参有误。逐项核对后重试即可。

Q5:腾讯云 OCR 发票识别支持医疗诊断书吗? 不支持。医疗票据识别接口只覆盖医疗门诊收费票据(电子)和医疗住院收费票据(电子)。诊断书属于医疗文书,更接近非结构化版面,建议走自定义模板或通用大模型结构化方案,不要直接调发票识别接口。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、先把"票据"和"发票"分清楚
  • 二、五张图看明白腾讯云发票识别能做什么
  • 三、大模型 vs OCR 识别发票,哪个准
  • 四、数电发票(OFD)怎么识别
  • 五、报销自动化一条完整链路
  • 六、代码片段:通用票据识别(高级版)最小调用
  • 七、常见问题
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档