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

把文档变成可核对数据的 PDF OCR

用 space-ocr 从 PDF 页面提取结构化数据:声明你需要的字段,每个值都连同 data.cells 里的来源坐标返回,需要复核的路径列在 data.review.flagged。

PDF 是数据藏身的地方。一张发票、一叠票据、一张送货单——数字明明就在页面上,但要进到表格里通常意味着重新录入。PDF OCR 承诺解决这件事:读文档,返回结构化字段。问题是,大多数工具止步于一个看似合理的猜测,剩下的就要你自己去信。

space-ocr 回答的是一个更严苛的问题。你声明需要的字段,每个值都连同它被读取的页面区域——data.cells 里的 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.

三种形态,同一份契约
同一页可以取成具名字段(POST /ocr/fields)、取成保留版式的 Markdown(POST /ocr/markdown),或取成还原了阅读顺序的纯文本(POST /ocr/text)。三条路径返回同一个信封——values、cells、review、image——所以核对逻辑只需写一遍。Markdown 默认返回元素级 cells,纯文本用 includeBlocks: true 索取。
每个值都有位置
data.cells 的每个路径都带一个 box(0–1000 归一化网格上的 xmin/ymin/xmax/ymax)和四个点组成、跟随页面倾斜的 quad。坐标所依据的宽高由 data.image 给出,换算成像素只要一次乘法。
不只是合计,还有明细行
把字段声明为 type 为 array 并带 children,每一行就落在 items[0].amount 这样的带索引路径上,并各自拥有一个单元格。行本身也有一个外接框,所以换行或合并的明细行仍可追踪。
你自己的字段,而不是固定模式
发送你真正要存的 fields:name 与 type,需要时再加 required、pattern、min/max、enum、label 或 near。遇到陌生版式就发 autoFields: true,让系统给出一份可保留的字段方案。声明不会传给模型——它决定什么会被标记复核,而不是页面怎么被读。
干净的导出
带 UTF-8 BOM 的 CSV(Excel 与中日韩文本安全,明细行展开),以及 REST API 的 JSON;异步任务用 GET /jobs/{jobId},ocr.completed 通过 HMAC 签名的 Webhook 送达。
语言自动识别
日语、韩语、中文、英文在一个引擎里——没有语言选项要设置,混合文字也能处理。
手机照片与歪斜扫描
读取前 EXIF 方向已写入像素,且不做纠偏——quad 会跟随文档的倾斜,所以你画出的轮廓正好落在印刷的位置上。

space-ocr 里的 PDF OCR 如何工作

把 PDF 拖进应用,每一页都会在浏览器里被渲染成 PNG,再被读取并转成结构化字段——一份多页 PDF 会变成一组可以排序、筛选、导出的行。

公开 API 更严格:它只读栅格图像,不读 PDF 字节。POST /upload 会直接拒绝 PDF,并提示先把页面渲染成图片。调用 API 时请自行栅格化,再发送页面图片。两条路径都是一页一点数。

一次 /ocr/fields 调用返回的内容如下:

  • data.values — 完全按你声明的 schema 组织的业务数据。
  • data.cells[path] — 该路径的 box、quad、verified、review 与 evidence。
  • data.review — declared、returned、boxed、verified,以及作为待办清单的 flagged。
  • data.normalized — 声明了 number、integer、date 的字段的解析结果。
  • data.image — 所有坐标所依据的宽和高。

verified 是判定而不是字符比对结果:单元格带有复核理由时为 false,比对跑过且没有理由时为 true,没有可比对的对象时为 null。字符比对本身在 evidence.text_match,evidence.match_ratio 作为旁证列在它旁边。

先把页面渲染成图片,再提取字段
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# API 读的是图片而不是 PDF 字节 —— 先把页面渲染成图片
pdftoppm -r 200 -jpeg invoice.pdf page

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/page-1.jpg",
    "imageType": "url",
    "fields": [
      { "name": "invoice_no", "type": "string", "required": true },
      { "name": "issue_date", "type": "date", "required": true },
      { "name": "total", "type": "number", "required": true, "min": 0 },
      { "name": "items", "type": "array", "children": [
        { "name": "description", "type": "string" },
        { "name": "quantity", "type": "number" },
        { "name": "amount", "type": "number" }
      ] }
    ]
  }'

如何对 PDF 做 OCR

  1. 把页面渲染成图片
    在应用中拖入 PDF,每一页会在浏览器里被渲染成 PNG。直接调用 API 时,请自行渲染页面,以 url 或 base64 发送到 POST /ocr/fields,或用 POST /upload 把图片传入表格。
  2. 声明你的字段
    列出需要的 fields:name 与 type,需要时再加 required、pattern、min/max、enum、label 或 near。明细行表格用带 children 的 array 字段;版式陌生时可发 autoFields: true 获得一份字段方案。
  3. 读取结构化结果
    业务数据按你的 schema 放在 data.values,每个路径的 box、quad、verified、review、evidence 放在 data.cells[path],声明了 number、integer、date 的字段的解析值放在 data.normalized。
  4. 处理 review.flagged
    遍历 data.review.flagged。每一项是一个 path 和一个按优先级排序的 reasons 数组,第 0 项是主要理由。打开 data.cells[path],以 data.image 为基准画出它的 box 或 quad,在来源区域旁边修正这个值。
  5. 导出或查询
    下载 CSV(UTF-8 BOM,明细行已展开),或用 GET /view 配合 where、sort、select、boxes 查询已存储的表格——该读取免费,也不会重跑 OCR。

简单、可预期的定价

一点数处理一页,$0.05(含税)。每个账号每月有 100 点数的免费额度,无需信用卡,失败的扫描不计费。套餐计划增加每月点数、更多表格和存储空间。

Free
$0
  • 100 点数/月
  • 3 表格
  • 1 GB 存储
免费 — 无需信用卡
Starter
$19/月
  • 500 点数/月
  • 15 表格
  • 10 GB 存储
免费开始
最受欢迎
Pro
$39/月
  • 1,100 点数/月
  • 无限表格
  • 100 GB 存储
免费开始
我可以用 space-ocr 对 PDF 做 OCR 吗?
可以,中间多一步。Web 应用直接接受 PDF:它在浏览器里把每一页渲染成 PNG 再做 OCR,所以多页 PDF 会变成结构化的行。公开 API 只读栅格图像,POST /upload 会拒绝 PDF,并提示先把页面渲染成图片再发送。
PDF OCR 会保留每个值的位置吗?
会。data.cells 的每个路径都返回一个 box(0–1000 归一化网格上的 xmin/ymin/xmax/ymax)和跟随文档倾斜的四点 quad,两者都以 data.image 为基准。单元格的 verified 说明它是否被标记复核,理由在 review.reasons,evidence.match_ratio 与 evidence.printed_text 等旁证在 evidence 里。
它能从 PDF 提取表格和明细行吗?
能。把明细行作为 type 为 'array' 的字段来请求,其 children 描述一行(描述、数量、金额等)。每个单元格保留自己的带索引路径,例如 items[2].amount,行本身也有外接框,所以换行或合并的明细行也能追溯到它的位置。
怎么知道哪些值需要复核?
读 data.review.flagged。每一项是一个 path 加一个按优先级排序的 reasons 数组(missing、text_mismatch、type_mismatch、out_of_range、pattern_mismatch、nobox 等),待复核条数就是这个数组的长度。用 path 打开 data.cells[path],就能把该值的来源区域展示出来。不需要实现固定的分数阈值。
PDF OCR 的结果能导出成什么?
带 UTF-8 BOM 的 CSV(让 Excel 正确打开中日韩文本,明细行展开为子行),以及 REST API 的 JSON。已存储的表格还能用 GET /view 配合 where、sort、select、boxes 在服务器端查询——该读取免费,也不会重跑 OCR。
PDF OCR 多少钱?
每点数 $0.05(含税),一点数处理一页。每个账号每月有 100 点数的免费额度,无需信用卡,失败的扫描不计费。Starter 和 Pro 增加每月点数、更多表格和存储——见上方的计划。
它支持哪些语言?
语言识别是全自动的——日语、韩语、中文、英文在一个引擎里,混合文字与全角半角都能处理。没有语言选项需要你去设置。

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

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

相关