space ocr
指南文章价格文档
Invoice OCR

把供应商发票变成可信数据的发票 OCR

别再手动录入发票。space-ocr 按你声明的字段读出供应商、单号、日期、合计和每一条明细行,并把每个值连同 box/quad 坐标、verified 判定,以及列出待核值的 data.review.flagged 一起返回。

每一张进到收件箱的发票,都是一笔小小的录入税。有人打开 PDF,找出供应商、发票号、日期、税额行、合计,再把这些全部重新敲进会计系统——要明细的话,还得一行行手抄。又慢,又是错字的温床,合计敲错一个数字就能卡住一次付款。

发票 OCR 本该把这件事接过去:读发票,返回字段。问题在于,大多数工具递给你一个数字,然后让你自己去信。space-ocr 按你声明的字段把发票读成结构化的行,并把每个值连同它在页面上被读取的区域一起返回,同时给出一份没有通过核对的值的复核清单。批准付款前要看的是那几个值,而不是整页。

看一张你可以亲自核对的真实发票

把鼠标悬停在下方任意字段上——发票上的框就是这个值被读取的位置。供应商、开票日期、账单周期、付款期限、应付金额、合计,以及每一条明细行,都直接读自一次真实的解析结果,而不是摆拍。

Invoice with extracted-field bounding boxes
Verified fields
Invoice

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.

三种形态,同一份契约
同一页可以取成声明的字段(POST /ocr/fields)、保留版式的 Markdown(POST /ocr/markdown),或还原了阅读顺序的纯文本(POST /ocr/text)。三者的响应外形一致——data.values、以 path 为键的 data.cells、data.review 和 data.image——核对逻辑写一次就能复用。
每个值都可寻址
供应商、发票号、开票日期、付款期限和每个金额都会进入 data.cells[path]:轴对齐的 box(0–1000 归一化网格上的 xmin/ymin/xmax/ymax),以及跟随页面倾斜的四点 quad。坐标所依据的宽高由 data.image 给出。
不只是合计,还有明细行
把明细行声明为带 children 的 array 字段,描述一行(品名、数量、单价、金额)。每个单元格以 items[0].amount 这样的路径保留自己的坐标,行本身是 items[0] 的合并框,所以换行或合并的行也能追踪。
声明规则,收到例外
没有模板可选,字段由你命名。给发票号加 required,给日期加 type date,给金额加 type number 与 min,再给供应商加 not_near,这样从收件方区域取来的名称会以 near_conflict 暴露出来,而不是悄悄通过。
税额与合计
小计、税额行和总额都是普通的 number 字段。data.values 保留读出的原始写法;声明标量类型后,data.normalized 会并列给出解析后的数值,解析不了是 type_mismatch,越过 min/max 则是 out_of_range。
干净的导出
带 UTF-8 BOM 的 CSV(Excel 与中日韩文本安全,明细行展开为子行),以及 REST API 的 JSON——直接进你的表格或会计导入。
AP(应付)自动化
把发票作为异步任务发到 /upload,每张读完后收到带 HMAC 签名的 ocr.completed Webhook,新的供应商发票就会自动流入表格,不必有人盯着队列。

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 — 所有坐标所依据的宽与高。
声明发票字段并读取一页图片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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

  1. 添加发票
    在应用中拖入发票(PDF 或图片)——每一页会被渲染成图片并排队 OCR。做 AP 自动化时,把它发到 /upload,读完后收到 Webhook。
  2. 声明字段
    把会计里在用的名称作为 fields 发过去,并附上适合发票的检查——发票号加 required,日期加 type date,金额加 type number 与 min;版式陌生就发 autoFields,把返回的名称留作声明。明细行是一个带 children 的 array 字段。
  3. 读取结构化结果
    业务数据在 data.values。坐标与逐值判定在 data.cells[path]——box、quad、verified、review、evidence——坐标所依据的画幅由 data.image 给出。
  4. 入账前先核对
    遍历 data.review.flagged,而不是给分数设阈值。每项给出 path 与 reasons;跳到 data.cells[path],把 box 或 quad 高亮在页面上并修正该值。编辑会保存在原始 OCR 值旁边。
  5. 导出或查询
    为会计导入下载 CSV(UTF-8 BOM,明细行已展开),或用 GET /view 配合 where、sort、select 查询已存储的表格——无需重跑 OCR,也不额外收费。

简单、可预期的定价

读一页就是一个点数——$0.05(含税),在应用里上传还是调用 API 都是同一价格。每个账号每月有 100 点数免费额度,无需信用卡,失败不计费。套餐计划增加每月点数、更多表格和存储空间。

Free
$0
  • 100 点数/月
  • 3 表格
  • 1 GB 存储
免费 — 无需信用卡
Starter
$19/月
  • 500 点数/月
  • 15 表格
  • 10 GB 存储
免费开始
最受欢迎
Pro
$39/月
  • 1,100 点数/月
  • 无限表格
  • 100 GB 存储
免费开始
发票 OCR 能从发票里取出什么?
取出你声明的内容。供应商名、发票号、开票日期、付款期限、账单周期、小计、税额和总额都是普通的 string / date / number 字段,明细行则是一个用 children 描述一行的 array 字段。每个值都会进入 data.cells[path],带上它被读取的 box 与 quad。
它能读明细行,而不只是合计吗?
能。把明细行声明为 type 为 'array' 的字段,其 children 描述一行(品名、数量、单价、金额)。每个单元格以 items[0].amount 这样的路径保留自己的坐标,行本身是 items[0] 的合并框,导出时展开为子行。
我怎么知道它读出的合计是对的?
不去调阈值,而是处理复核清单。data.review.flagged 列出被标记的路径,每项带按排名排列的原因,例如 text_mismatch、missing、type_mismatch 或 out_of_range;verified 在核对跑过且没有触发任何标记时为 true,触发了就是 false,没有可核对的对象时为 null。打开 data.cells[path],把 box 或 quad 叠到页面上,自己看一眼印出来的区域。坐标是值来自何处的佐证,不是它正确的证明——两个读取方也可能在同一处误读上取得一致——所以业务侧的校验请保留。
我能把发票导出成 CSV 或导入会计吗?
能。下载带 UTF-8 BOM 的 CSV(让 Excel 正确打开中日韩文本,明细行展开为子行),或用 REST API 的 JSON。把发票作为异步任务发到 /upload,每张读完后会触发一个签名 Webhook。
它支持 PDF 发票吗?
Web 应用直接接受 PDF 发票——它把每一页渲染成图片再做 OCR。公开 API 接收栅格图像(JPEG、PNG、GIF、BMP、TIFF、WebP),因此调用 API 时你发送页面图片。
发票 OCR 多少钱?
一页一个点数——$0.05(含税),每月 100 点数免费,无需信用卡。失败不计费。套餐计划(Starter 和 Pro)增加每月点数、更多表格和存储——见上方的计划。

把你的供应商发票变成可核对的数据

免费额度——每月 100 点数,无需信用卡。每个值都连同它在页面上的位置一起返回。

相关