把供应商发票变成可信数据的发票 OCR
别再手动录入发票。space-ocr 按你声明的字段读出供应商、单号、日期、合计和每一条明细行,并把每个值连同 box/quad 坐标、verified 判定,以及列出待核值的 data.review.flagged 一起返回。
每一张进到收件箱的发票,都是一笔小小的录入税。有人打开 PDF,找出供应商、发票号、日期、税额行、合计,再把这些全部重新敲进会计系统——要明细的话,还得一行行手抄。又慢,又是错字的温床,合计敲错一个数字就能卡住一次付款。
发票 OCR 本该把这件事接过去:读发票,返回字段。问题在于,大多数工具递给你一个数字,然后让你自己去信。space-ocr 按你声明的字段把发票读成结构化的行,并把每个值连同它在页面上被读取的区域一起返回,同时给出一份没有通过核对的值的复核清单。批准付款前要看的是那几个值,而不是整页。
看一张你可以亲自核对的真实发票
把鼠标悬停在下方任意字段上——发票上的框就是这个值被读取的位置。供应商、开票日期、账单周期、付款期限、应付金额、合计,以及每一条明细行,都直接读自一次真实的解析结果,而不是摆拍。

Each value with a box carries a verified on-page location — in data.cells[path], that is box + 4-point quad + evidence.match_ratio — on a 0–1000 normalized grid (0,0 top-left → 1000,1000 bottom-right), the same shape the live API returns. Hover a field to trace it back to the pixels it came from.
space-ocr 里的发票 OCR 如何工作
把发票拖进应用,它会被读成一行——供应商、日期、金额,明细行则成为一张可以排序、筛选、导出的子表。PDF 发票会先按页渲染成图片,再被读取。如果你直接调用 API,请发送页面图片(公开 API 接收栅格图像——JPEG、PNG、GIF、BMP、TIFF、WebP),返回的结构化结果是一样的。
发票不必从头描述,也没有模板要选。把会计里已经在用的名称直接作为 fields 发过去,并附上适合发票的检查;版式陌生就发 autoFields,把返回的名称留作你的声明。明细行是一个带 children 的 array 字段。
每张发票会返回:
data.values— 业务数据,形状与你声明的完全一致。data.cells[path]— 该值的box与quad,以及verified、review和evidence(逐字核对的佐证,包含text_match、printed_text和match_ratio)。data.review.flagged— 复核清单:每项含path与reasons,按排名排列,第 0 项为主因。data.normalized— 声明了标量类型的字段所解析出的数值或 ISO 日期。data.image— 所有坐标所依据的宽与高。
curl -s https://api.space-ocr.com/ocr/fields \
-H "Authorization: Bearer $SPACE_OCR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image": "https://example.com/invoice-page-1.png",
"imageType": "url",
"fields": [
{ "name": "supplier", "type": "string", "required": true, "not_near": ["Bill To", "御中"] },
{ "name": "bill_to", "type": "string", "near": ["Bill To", "御中"] },
{ "name": "invoice_no", "type": "string", "required": true, "pattern": "^[A-Za-z0-9-]{4,}$" },
{ "name": "issue_date", "type": "date", "required": true },
{ "name": "due_date", "type": "date" },
{ "name": "subtotal", "type": "number", "min": 0 },
{ "name": "tax", "type": "number", "min": 0 },
{ "name": "total", "type": "number", "required": true, "min": 0 },
{
"name": "items", "type": "array",
"children": [
{ "name": "description", "type": "string" },
{ "name": "quantity", "type": "number" },
{ "name": "unit_price", "type": "number" },
{ "name": "amount", "type": "number" }
]
}
]
}'如何对发票做 OCR
- 添加发票在应用中拖入发票(PDF 或图片)——每一页会被渲染成图片并排队 OCR。做 AP 自动化时,把它发到 /upload,读完后收到 Webhook。
- 声明字段把会计里在用的名称作为 fields 发过去,并附上适合发票的检查——发票号加 required,日期加 type date,金额加 type number 与 min;版式陌生就发 autoFields,把返回的名称留作声明。明细行是一个带 children 的 array 字段。
- 读取结构化结果业务数据在 data.values。坐标与逐值判定在 data.cells[path]——box、quad、verified、review、evidence——坐标所依据的画幅由 data.image 给出。
- 入账前先核对遍历 data.review.flagged,而不是给分数设阈值。每项给出 path 与 reasons;跳到 data.cells[path],把 box 或 quad 高亮在页面上并修正该值。编辑会保存在原始 OCR 值旁边。
- 导出或查询为会计导入下载 CSV(UTF-8 BOM,明细行已展开),或用 GET /view 配合 where、sort、select 查询已存储的表格——无需重跑 OCR,也不额外收费。
简单、可预期的定价
读一页就是一个点数——$0.05(含税),在应用里上传还是调用 API 都是同一价格。每个账号每月有 100 点数免费额度,无需信用卡,失败不计费。套餐计划增加每月点数、更多表格和存储空间。