space ocr
指南文章价格文档
convert

把扫描版 PDF 转成 Excel

扫描版 PDF 转 Excel 的方法:把每一页图片识别成结构化字段,对照原图核对后,再导出一份 Excel 能干净打开的 UTF-8 BOM CSV。

7 分钟阅读· 2026-06-25

扫描版 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——值就会以有名字的字段形式返回,而不是一大段文字。最快的办法是让应用替你推荐字段:把页面丢进去,它会自动给出一套字段结构,不用任何配置,也不用挑模板。你也可以套用内置模板(小票和名片是一键预设;发票、采购订单、送货单等等在完整选择器里),或者自己定义字段。来看一张扫描件怎么变成带标签的列:

丢进一张文档图片,上面的值就落进了有名字的字段——也就是你 Excel 文件里要装的那些行。

对于有重复行的文档——发票的明细行、小票上的商品——可以声明一个 array 字段,并带上子列。页面上的每一行都会变成独立的一行,这正是表格需要做加总时你想要的样子。如果你专门要处理这类重复行,可以看从发票中提取明细行,里面有字段定义的细节。

POST /ocr/fields → 请求体
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
  "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" }
      ]
    }
  ]
}
✓ Verified

返回的值是原样照搬的。 印在纸上的 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 值。

一键导出一份 UTF-8 BOM CSV——双击它,Excel 就打开你的行,列也对得整整齐齐。

在 Excel 里打开它很简单:直接双击那个 .csv。因为有 BOM,Excel 会自动把它当成 UTF-8 读取——不用文本导入向导,也不会出现乱码。接下来如果你需要原生工作簿,另存为 → .xlsx 即可。如果你的最终目标只是一条纯 CSV 的处理流水线、并不非得是 Excel,那么配套的扫描文档转 CSV指南把同一套导出从头到尾讲了一遍。

通过 API 批量处理

如果是一整个文件夹的扫描件,先用你的列结构创建一张 sheet,然后把页面图片上传到这张 sheet。每张图片都会按这套结构识别,并作为行追加进去,之后就能一次性导出成一份 CSV。完整的请求/响应结构见 API 文档

把扫描页面图片上传到 sheet
1
2
3
4
5
6
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 怎么做

  1. 添加你的 PDF 或页面图片
    在 space-ocr 应用里,直接把 PDF 丢进去就行——每一页都会自动渲染成图片,根本不用转换。如果你是直接调用 REST API,那就先把每一页导出成栅格图像,因为引擎读取的是栅格图像(JPEG、PNG、GIF、BMP、TIFF、WebP),而不是 PDF 字节。
  2. 把页面识别成字段
    把上面的值抽取成有名字的字段。最快的办法是让应用根据页面自动推荐字段;你也可以套用内置模板,或自己定义字段结构。对于重复的明细行,声明一个 array 字段。
  3. 核对各个值
    把鼠标移到字段上,高亮显示它在原始扫描件上的读取位置。match ratio 等于 1.0 表示每一个字符都已定位;低于 0.85 则标记出一个值得复核或修正的值。
  4. 导出 CSV
    把这张表导出成 CSV。它是 UTF-8 带 BOM 的,会把 array 明细行展开成子行,你做过的任何手动修正都会覆盖原本的 OCR 值。
  5. 在 Excel 里打开
    双击这个 CSV——Excel 会读取 BOM,把你的行打开,列对得整整齐齐,CJK 文本也完好无损。需要原生工作簿就另存为 .xlsx。
扫描版 PDF 怎么转成 Excel?
直接把 PDF 丢进 space-ocr 应用——它会自动把每一页渲染成图片,应用还能替你推荐字段,所以根本不用手动转换什么。对照原图核对各个值,再把这张表导出成 CSV。这份 CSV 是 UTF-8 带 BOM 的,所以能在 Excel 里直接打开——双击它即可,需要原生工作簿就另存为 .xlsx。(如果你不用应用,而是直接调用 REST API,那就先把每一页导出成图片,因为引擎接收的是栅格图像。)
space-ocr 能直接读取 PDF 文件吗?
在应用里可以——把 PDF 丢进去,每一页在 OCR 之前都会自动渲染成 PNG,你不用手动拆页。而公开 API 和 OCR 引擎本身接收的是栅格图像(JPEG、PNG、GIF、BMP、TIFF、WebP),所以如果你是直接调用 API,就先把每一页导出成图片。无论哪种方式,一旦值被抽取成字段,导出成 Excel 能打开的 CSV 都只需一键。
导出的 CSV 在 Excel 里能正确显示日文或中文吗?
可以。CSV 导出采用 UTF-8 带字节序标记(BOM)编码,这正是 Excel 自动识别编码所需要的。双击打开时,CJK(中日韩)字符和带重音的字符都会落到正确的列里,不用再跑文本导入向导。
怎么让发票的明细行变成一行一行的单独记录?
声明一个 array 字段并带上子列(比如 description、unit_price、qty)。页面上每一条重复的明细都会变成它自己的一个子行,导出时 array 会展开成 column.child 这样的表头,这样在 Excel 里各行就能正确加总。
导入 Excel 之前,怎么确认识别是准确的?
每个值都带着一个 match ratio(匹配比例)和一个经过核验的页面位置。把鼠标移到字段上,就能高亮显示它在原始扫描件上被读取的确切位置;match ratio 等于 1.0 表示每一个字符都找到了,低于 0.85 的则值得在导出前再仔细看一眼。
相关文章