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

返回结构化字段而不是一堆文字的图像 OCR

用 space-ocr 对 JPEG、PNG 等图像做 OCR:声明你需要的字段,每个值都连同 box 与 quad 坐标一起返回,需要复核的值汇总在 data.review.flagged 里。

大多数图像 OCR只是丢给你一堆纯文本,然后就没了。你拍一张票据,跑一遍,回来的是一团行,你还得自己去读、去拆、再录进对应的列里。原本在页面上一眼就能看清的结构,没了。

space-ocr 把图像读成结构化字段——店名在这、日期在那、合计在那边、明细是一行行的。每个值还带着它在图像上被读取的确切位置:data.cells[path] 里有一个轴对齐的 box 和一个四点的 quad。而与页面核对不上的值,会带着理由出现在 data.review.flagged 里。所以回到你手里的是一份待办清单,而不是一个只能盲信的数字。

看一次你可以亲自核对的真实提取

这是一张图像——拍了两张票据的照片——被读成了字段。把鼠标悬停在下方任意值上,图像上的框就是这个值被读取的位置。这里的每个数字、框和字符匹配比例,都直接读自一次真实的解析结果,而不是摆拍。匹配比例说明的是这个值有多少字符在页面上被定位到,属于佐证,不是通过或不通过的判定分。

Receipts with extracted-field bounding boxes
Verified fields
KINSHO · 合計 2,045
ライフ · 合計 4,286

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.

三种形态,同一份契约
同一页可以取成具名字段、取成保留版式的 Markdown(POST /ocr/markdown),或取成还原了阅读顺序的纯文本(POST /ocr/text)。三者返回的外壳一样,都是 values / cells / review / image,所以无论选哪一种,坐标和 verified 判定的处理方式都一致。
结构化字段,不是一堆文字
图像会在 data.values 下变成带名字的字段和行——店名、日期、合计、明细行——形状就是你声明的那份 schema,而不是一串你得自己去拆的长字符串。
每个值都有位置
data.cells[path] 里有轴对齐的 box(xmin/ymin/xmax/ymax)和四点的 quad,都是 0–1000 的归一化坐标。换算成像素所需的尺寸由 data.image 给出:x = box.xmin / 1000 × width。
手机照片也行
EXIF 方向在读取之前就已生效,所以返回的坐标与你看到的照片对齐。系统不做倾斜校正,因此 quad 会跟随手持拍摄的倾斜;很大的照片可能先被缩小。坐标的基准是 data.image,而不是你上传的那个文件。
声明你需要的字段
在 fields 数组里写下 name 和 type,需要时再加上 required、pattern、min/max、enum、label、near。想从文档本身出发,就把 autoFields 设为 true,取回它从这份文件里读出的字段名。
不只是合计,还有明细行
带 children 的 array 字段以可重复的行返回,每个单元格都保有自己的路径和位置:items[0].amount 指向一个单元格,items[0] 指向它所在的那一行。
干净的导出
带 UTF-8 BOM 的 CSV(Excel 与中日韩文本安全,明细行展开),以及带异步任务(POST /upload → GET /jobs/{jobId})和 HMAC 签名 Webhook 的 REST API JSON。

space-ocr 里的图像 OCR 如何工作

把图像以 URL 或纯 base64 发送到 /ocr/fields——JPEG、PNG、GIF、BMP、TIFF、WebP 都会被直接读取。EXIF orientation 在读取前生效,很大的照片可能会被缩到长边 4000px,所以真正被读的那一版页面尺寸由 data.image 给出,坐标都以它为基准换算。

你想要的结果用 fields 数组来描述:每个字段一个 name 和一个 type(string / number / integer / date / array / object),明细表用带 children 的 array 字段,需要时再声明 required、pattern、min/max 或 enum。想从文档出发,就发 autoFields: true,直接用返回的字段名。声明不会传给模型,因此不会左右读取本身——它决定的是哪些内容会进 data.review.flagged,以及确定性的 data.normalized 层解析出什么。(PDF 走 Web 应用,先把每一页渲染成图片;API 本身读的是图像。)

从图像提取字段
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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/receipt-photo.jpg",
    "imageType": "url",
    "fields": [
      { "name": "store_name", "type": "string", "required": true },
      { "name": "date", "type": "date", "required": true },
      { "name": "total", "type": "number", "required": true, "min": 0 },
      {
        "name": "items",
        "type": "array",
        "children": [
          { "name": "name", "type": "string" },
          { "name": "price", "type": "number" }
        ]
      }
    ]
  }'

如何对图像做 OCR

  1. 发送你的图像
    把 JPEG、PNG、GIF、BMP、TIFF 或 WebP 以 URL 或纯 base64 发送到 /ocr/fields,或拖进应用。EXIF 方向会在读取前生效。
  2. 声明你的字段
    发送一个 fields 数组,为每个值写明 name 和 type——明细行表格用带 children 的 array 字段。也可以把 autoFields 设为 true,从返回的字段名开始。
  3. 读取结构化结果
    业务数据留在 data.values。data.cells 为每个路径给出 box 与 quad、verified 判定和 evidence,data.image 则是把这些坐标换算成像素的基准。
  4. 处理待复核清单
    遍历 data.review.flagged:每一项都给出 path 和 reasons。打开 cells[path],把 box 画到图像上,再把值和那里印着的字对照。编辑会保存在原始 OCR 值旁边。
  5. 导出或查询
    下载 CSV(UTF-8 BOM,明细行已展开),或用 GET /view 配合 where、sort、select 查询已存储的表格——读取已存储的行不会重跑 OCR,也不计费。

简单、可预期的定价

每张图片 $0.05(含税),每月 100 点数免费且无需信用卡,失败的扫描不计费。套餐计划增加每月点数、更多表格和存储空间。

Free
$0
  • 100 点数/月
  • 3 表格
  • 1 GB 存储
免费 — 无需信用卡
Starter
$19/月
  • 500 点数/月
  • 15 表格
  • 10 GB 存储
免费开始
最受欢迎
Pro
$39/月
  • 1,100 点数/月
  • 无限表格
  • 100 GB 存储
免费开始
space-ocr 能对哪些图像格式做 OCR?
公开 API 直接读取栅格图像——JPEG、PNG、GIF、BMP、TIFF、WebP。图像会被自动转成 RGB。PDF 走 Web 应用,先把每一页渲染成图片再做 OCR。
图像 OCR 给我的是结构化字段还是纯文本?
结构化字段。图像会在 data.values 下被读成带名字的值和行——店名、日期、合计、明细行——形状就是你声明的那份 schema,而不是一团你得自己解析的纯文本。
我能对手机拍的照片做 OCR 吗?
能。EXIF orientation 在读取之前就已生效,所以返回的坐标与显示出来的照片对齐。系统不做倾斜校正,四点的 quad 会跟随手持拍摄的倾斜,而这些坐标所属的页面尺寸由 data.image 给出。
图像 OCR 会保留每个值的位置吗?
会。data.cells 里的每个路径都带一个 box(0–1000 归一化网格上的 xmin/ymin/xmax/ymax)和一个四点的 quad,换算成像素所需的尺寸由 data.image 给出。cells[path].evidence 保存核对的佐证,包括 match_ratio,以及在这个端点上的 printed_text——在那个坐标上读到的原始字符。
我怎么知道哪些值需要复核?
读 data.review.flagged。每一项都有 path 和一个按优先级排序的 reasons 数组(text_mismatch、missing、pattern_mismatch、out_of_range 等已文档化的理由代码),需要复核的数量就是 flagged.length。用 path 打开 cells[path],把 box 画在值旁边对照。两次独立的读取仍可能在同一个误读上达成一致,所以业务规则校验仍然要保留。
我怎么把图像发给 API?
发送到 POST /ocr/fields,作为 URL(imageType 'url')或纯 base64(imageType 'base64',不带 data-URI 前缀)。用 Bearer 令牌认证,密钥以 spocr_ 开头。传一个描述你所需内容的 fields 数组,或把 autoFields 设为 true。
图像 OCR 多少钱?
每张图片 $0.05(含税),每月 100 点数免费且无需信用卡,失败的扫描不计费。套餐计划(Starter 和 Pro)增加每月点数、更多表格和存储——见上方的计划。

把你自己的图像变成可核对的数据

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

相关