把扫描版 PDF 转成 Excel
扫描版 PDF 转 Excel 的方法:把每一页图片识别成结构化字段,对照原图核对后,再导出一份 Excel 能干净打开的 UTF-8 BOM CSV。
扫描版 PDF 里并不是藏着一张表格,它本质上是一张文档的照片。每一页都是行、列和合计的图像,在人眼看来像一张表,但在计算机眼里只是一堆像素。这也是为什么扫描件几乎从来没有「导出到 Excel」按钮:根本没有单元格可导,只有一张图。想拿到真正的行,你必须先把页面重新识别成结构化字段,再把这些字段写成 Excel 能打开的文件。
本文讲的正是这套流程。你拿一张文档图片(扫描页、手机拍的照片、传真过来的小票),把上面的值抽取成有名字的字段,再导出一份能在 Excel 里直接打开的 CSV——UTF-8 带字节序标记(BOM),这样日文、韩文、中文都能落到正确的列里,而不会变成乱码。「扫描版 PDF 转 Excel」最终拿到的,就是这份 CSV。
为什么扫描件不能直接变成 Excel
扫描一张纸质发票,得到的是一张栅格图像——和 JPEG 照片是同一类文件。space-ocr 直接支持这些栅格格式:JPEG、PNG、GIF、BMP、TIFF 和 WebP。如果你的源文件是多页 PDF,有两条路:直接把 PDF 丢进 space-ocr 应用,它会自动把每一页渲染成图片;或者——如果你是直接调用 REST API——先把每一页导出成图片(PNG 或 TIFF)再上传。无论哪种方式,OCR 跑的都是页面图片。
引擎会读取每张图片,找出其中的值,并给每个字段标注它在页面上经过核验的位置。一旦页面被结构化成字段,转成 Excel 不过是下载一份 CSV 而已。真正难、也真正值得做好的部分是「识别」,而不是「导出」。
从文档图片到结构化字段
上传一张文档图片——或者干脆丢进一张照片或一份 PDF——值就会以有名字的字段形式返回,而不是一大段文字。最快的办法是让应用替你推荐字段:把页面丢进去,它会自动给出一套字段结构,不用任何配置,也不用挑模板。你也可以套用内置模板(小票和名片是一键预设;发票、采购订单、送货单等等在完整选择器里),或者自己定义字段。来看一张扫描件怎么变成带标签的列:
对于有重复行的文档——发票的明细行、小票上的商品——可以声明一个 array 字段,并带上子列。页面上的每一行都会变成独立的一行,这正是表格需要做加总时你想要的样子。如果你专门要处理这类重复行,可以看从发票中提取明细行,里面有字段定义的细节。
{
"image": "https://example.com/scanned-page-01.png",
"imageType": "url",
"fields": [
{ "name": "vendor", "type": "string" },
{ "name": "invoice_date", "type": "string" },
{ "name": "total", "type": "string" },
{
"name": "line_items", "type": "array",
"children": [
{ "name": "description", "type": "string" },
{ "name": "unit_price", "type": "string" },
{ "name": "qty", "type": "string" }
]
}
]
}返回的值是原样照搬的。 印在纸上的 7,855 依然是 7,855——逗号、小数点、全角字符都和页面上一模一样地保留下来,所以你的合计对得上账。应用里看到的货币符号只是界面装饰,并不是值的一部分。只有当你在某个字段的描述里明确要求时,数字才会被规范化。
先核对,再导出到 Excel
在把任何东西导入 Excel 之前,先把识别结果核对一遍。把鼠标移到某个值上,原图里对应的区域就会高亮,你的视线能直接落到那个位置,而不必把整张扫描件重读一遍。match_ratio 等于 1.0 表示页面上每一个字符都找到了;低于 0.85 的就值得再看一眼。
导出能在 Excel 里打开的 CSV
字段看起来没问题后,就导出这张表。你会得到一个 <sheetName>.csv,表头那一行就是你设的列名;array 字段会展开成 column.child 这样的列,重复的明细行会展开成多个子行。文件是 UTF-8 带 BOM 的,正是这个细节让 Excel 双击时能干净地打开 CJK(中日韩)文本。你做过的任何手动修正,都会在导出时覆盖原本的 OCR 值。
在 Excel 里打开它很简单:直接双击那个 .csv。因为有 BOM,Excel 会自动把它当成 UTF-8 读取——不用文本导入向导,也不会出现乱码。接下来如果你需要原生工作簿,另存为 → .xlsx 即可。如果你的最终目标只是一条纯 CSV 的处理流水线、并不非得是 Excel,那么配套的扫描文档转 CSV指南把同一套导出从头到尾讲了一遍。
通过 API 批量处理
如果是一整个文件夹的扫描件,先用你的列结构创建一张 sheet,然后把页面图片上传到这张 sheet。每张图片都会按这套结构识别,并作为行追加进去,之后就能一次性导出成一份 CSV。完整的请求/响应结构见 API 文档。
curl -X POST https://api.space-ocr.com/upload \
-H "Authorization: Bearer $SPACE_OCR_API_KEY" \
-F "path=/Invoices 2026" \
-F "files=@scan-page-01.png" \
-F "files=@scan-page-02.png" \
-F "wait=true"扫描版 PDF 转 Excel 怎么做
- 添加你的 PDF 或页面图片在 space-ocr 应用里,直接把 PDF 丢进去就行——每一页都会自动渲染成图片,根本不用转换。如果你是直接调用 REST API,那就先把每一页导出成栅格图像,因为引擎读取的是栅格图像(JPEG、PNG、GIF、BMP、TIFF、WebP),而不是 PDF 字节。
- 把页面识别成字段把上面的值抽取成有名字的字段。最快的办法是让应用根据页面自动推荐字段;你也可以套用内置模板,或自己定义字段结构。对于重复的明细行,声明一个 array 字段。
- 核对各个值把鼠标移到字段上,高亮显示它在原始扫描件上的读取位置。match ratio 等于 1.0 表示每一个字符都已定位;低于 0.85 则标记出一个值得复核或修正的值。
- 导出 CSV把这张表导出成 CSV。它是 UTF-8 带 BOM 的,会把 array 明细行展开成子行,你做过的任何手动修正都会覆盖原本的 OCR 值。
- 在 Excel 里打开双击这个 CSV——Excel 会读取 BOM,把你的行打开,列对得整整齐齐,CJK 文本也完好无损。需要原生工作簿就另存为 .xlsx。