把文档变成可核对数据的 PDF OCR
用 space-ocr 从 PDF 页面提取结构化数据:声明你需要的字段,每个值都连同 data.cells 里的来源坐标返回,需要复核的路径列在 data.review.flagged。
PDF 是数据藏身的地方。一张发票、一叠票据、一张送货单——数字明明就在页面上,但要进到表格里通常意味着重新录入。PDF OCR 承诺解决这件事:读文档,返回结构化字段。问题是,大多数工具止步于一个看似合理的猜测,剩下的就要你自己去信。
space-ocr 回答的是一个更严苛的问题。你声明需要的字段,每个值都连同它被读取的页面区域——data.cells 里的 box 与 quad——一起返回,没有通过核对的路径则列在 data.review.flagged。你拿到的不是一个需要解读的分数,而是一份待办清单。
看一次你可以亲自核对的真实提取
把鼠标悬停在下方任意字段上——票据上的框就是这个值被读取的位置。这里的每个值、框和匹配率,都直接读自一次真实的解析结果,而不是摆拍。

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 里的 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 作为旁证列在它旁边。
# 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
- 把页面渲染成图片在应用中拖入 PDF,每一页会在浏览器里被渲染成 PNG。直接调用 API 时,请自行渲染页面,以 url 或 base64 发送到 POST /ocr/fields,或用 POST /upload 把图片传入表格。
- 声明你的字段列出需要的 fields:name 与 type,需要时再加 required、pattern、min/max、enum、label 或 near。明细行表格用带 children 的 array 字段;版式陌生时可发 autoFields: true 获得一份字段方案。
- 读取结构化结果业务数据按你的 schema 放在 data.values,每个路径的 box、quad、verified、review、evidence 放在 data.cells[path],声明了 number、integer、date 的字段的解析值放在 data.normalized。
- 处理 review.flagged遍历 data.review.flagged。每一项是一个 path 和一个按优先级排序的 reasons 数组,第 0 项是主要理由。打开 data.cells[path],以 data.image 为基准画出它的 box 或 quad,在来源区域旁边修正这个值。
- 导出或查询下载 CSV(UTF-8 BOM,明细行已展开),或用 GET /view 配合 where、sort、select、boxes 查询已存储的表格——该读取免费,也不会重跑 OCR。
简单、可预期的定价
一点数处理一页,$0.05(含税)。每个账号每月有 100 点数的免费额度,无需信用卡,失败的扫描不计费。套餐计划增加每月点数、更多表格和存储空间。