space ocr
指南文章價格文件

如何把掃描文件轉成 CSV

教你如何把掃描文件轉成 CSV:欄位只要定義一次,上傳照片或掃描檔,每份文件就自動填成一列。匯出成 UTF-8 CSV,Excel 與中日韓文字都不會亂碼。

你手邊有一疊紙本——發票、收據、送貨單——而你需要把它們變成試算表裡的一列列資料。手動重新打字又慢又容易出錯,而一般的 OCR 工具只會吐出一大片原始文字,後續還是得自己拆解成欄位。你真正想做的其實更聚焦、也更實用:把一份文件的照片或掃描檔,每次都穩定地轉成乾淨的一列 CSV,正確的值落在正確的欄位裡。

這篇教學帶你完成的就是這件事。欄位只需定義一次,把 space-ocr 對準一張影像,每份文件就會自動填成一列。完成後,你把整張表匯出成 CSV——採用帶位元組順序標記(BOM)的 UTF-8,讓 Excel 與中日韓文字都能正常開啟。不必重打,而且每個值都能回溯到它在頁面上的位置。

整個流程的樣貌

把掃描文件轉成 CSV,可拆成四個動作:

  1. 拍照或掃描你的文件——點陣影像(JPEG、PNG、TIFF 等)。用手機拍就行,自動旋轉會處理拍歪的照片。
  2. 欄位只定義一次——把你在意的欄位命名好(vendordatetotal、明細項目……)。這會成為每份文件據以判讀的結構。
  3. 上傳——每張影像被判讀後,值會落進你欄位下的新一列。不需要逐份設定。
  4. 匯出 CSV——把整張表下載成 <sheetName>.csv,到哪都能打開。

好處在於一致性:因為欄位事先就固定了,第十張收據落下的樣子會和第一張一模一樣。

先看證據:每個值都知道自己從哪來

進入步驟之前,先說明為什麼這值得信賴。把滑鼠移到下方任一欄位上——收據上的方框會標示出那個值正是從哪個位置讀取的,而且每個欄位都帶有一個比對比例(match ratio)。一份 CSV,只有當裡面的數字都經得起查核時才有用,而在這裡,每一格都能回溯到來源像素。

Delivery slip with extracted-field bounding boxes
Verified fields
Delivery slip

Each value with a box carries a verified on-page location — bbox + 4-point vertices + 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.

上傳一張文件影像,看著每個值落進你定義好的欄位底下——不必重打

如何把掃描文件轉成 CSV,一步步來

1. 把文件拍成影像

space-ocr 判讀的是點陣影像——JPEG、PNG、GIF、BMP、TIFF 與 WebP。把收據放桌上拍、把發票掃成 PNG,或從掃描軟體匯出頁面都可以。掃描 PDF 也可以直接丟進應用程式,每一頁都會自動轉成影像。用手機斜著拍也沒問題:引擎會讀取 EXIF 方向資訊並校正旋轉,所以拍歪的照片照樣能正向判讀,值也照樣錨定在正確的位置。

2. 欄位只定義一次

這一步正是把 OCR 變成整齊表格的關鍵。建立一張帶有欄位結構的表——也就是你想當成 CSV 標題的那些欄位。純量欄位是單一值(vendorinvoice_datetotal);陣列欄位則用來收納會重複出現的明細項目。這個只需定義一次,之後你上傳的每份文件都會依照同一組欄位來判讀。

vendor        (string)
invoice_date  (string)
total         (string)
items         (array) → name, unit_price, qty

如果你不想手動建立結構,內建範本(invoicereceiptbusiness_card 等)會替常見的文件類型提供現成的欄位與提示。發票的部分,可參考從發票擷取明細項目

3. 上傳——列會自動填好

欄位就緒後,把影像上傳到這張表。每份文件成為一列:引擎判讀頁面,把每個值塞進對應的欄位下。丟進二十張收據,你就得到二十列,全都同一個樣子。明細項目陣列會以結構化的子項目保留在該列底下,匯出時即可展開。

值是原樣(verbatim)回傳的——7,855 的逗號會保留,全形字元與敬稱也都原封不動——所以你的 CSV 反映的是紙上實際印出的內容,而不是重新格式化後的猜測。

一鍵就把整張表匯出成 CSV——標題取自你的欄位,明細項目展開成子列。

4. 匯出成 CSV

點下匯出,這張表就會下載成 <sheetName>.csv。標題列直接由你的結構建構而成:

  • 開頭一個 # 欄(列索引)。
  • 每個純量欄位名稱照原樣呈現。
  • 每個陣列子項目攤平為 colName.childName——所以含 nameunit_priceitems 陣列會產生 items.nameitems.unit_price 兩欄。

含有明細項目陣列的列會展開成子列——父層的純量值出現一次,每個明細項目在其底下各佔一列,所以一張有八行明細的發票會變成同一個廠商與日期下的八列 CSV。檔案以帶位元組順序標記(BOM)的 UTF-8 寫入,正是這一點讓 Excel——以及日文、韓文或中文——打開時不會出現亂碼。

如果你手動編輯過某一格,匯出時你的手動值會覆蓋原本的 OCR 值,所以更正會一路反映到 CSV 裡。

✓ Verified

這份 CSV 是依你的欄位建構的,不是猜出來的。 標題來自你的結構(# + 純量名稱 + 明細項目的 array.child),陣列列展開成子列,檔案以帶 BOM 的 UTF-8 輸出,讓 Excel 與中日韓文字都能正常開啟。手動編輯會在匯出時覆蓋 OCR 值——欄位的樣貌在你定義的那一刻就固定下來,這正是每次下載都可預期的原因。

透過 API 來做

同一套流程也能在無介面(headless)情況下完成。建立一張帶欄位的表,把影像上傳上去,再用 GET /view 取回結構化的列——這是在伺服器端進行的,不會重跑 OCR,也不會計費。從這裡你可以自行寫出 CSV,或直接抓取該表的 CSV 匯出。GET /view 還讓你在匯出前先篩選(where)、排序並選取欄位,所以你只需輸出真正需要的那幾列。

欄位只建一次,接著上傳
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 1. Create a sheet with the columns you want as CSV headers
curl -X POST https://api.space-ocr.com/create \
  -H "Authorization: Bearer $SPACE_OCR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "path": "/invoices",
    "type": "sheet",
    "name": "june-invoices",
    "columns": [
      { "name": "vendor", "type": "string" },
      { "name": "invoice_date", "type": "string" },
      { "name": "total", "type": "string" },
      { "name": "items", "type": "array",
        "children": [
          { "name": "name", "type": "string" },
          { "name": "unit_price", "type": "string" }
        ] }
    ]
  }'

# 2. Upload document images — each one fills a row
curl -X POST https://api.space-ocr.com/upload \
  -H "Authorization: Bearer $SPACE_OCR_API_KEY" \
  -F "path=/invoices/june-invoices" \
  -F "files=@invoice-01.png" \
  -F "files=@invoice-02.jpg"

列進來之後,GET /view 會以結構化 JSON 回傳,你可以直接寫成 CSV——或交給你的會計系統。關於擷取端點與欄位規格的完整說明,請參考發票資料擷取 API 指南以及 API 文件

掃描 PDF 與輸入格式的提醒

space-ocr 的引擎處理的是點陣影像,而非 PDF 位元組——不過在應用程式裡你不需要操心這件事:把掃描 PDF 丟進來,每一頁都會在 OCR 之前自動點陣化成影像。只有當你直接呼叫公開 API 時,才需要先把每一頁轉算成影像(PNG 或 JPEG)再上傳。如果你的目標明確是 Excel 而不是 CSV,同樣這套流程依舊適用——詳見把掃描 PDF 轉成 Excel。CSV 是阻力最小的目標:到哪都打得開,而帶 BOM 的 UTF-8 匯出也代表編碼不會出意外。

  1. 把文件拍成影像
    把每份文件拍照或掃描成點陣影像(JPEG、PNG、TIFF 等)。手機照片就可以——EXIF 自動旋轉會校正拍歪的照片。掃描 PDF 也可以:把 PDF 丟進 space-ocr 應用程式,每一頁都會自動點陣化(只有直接呼叫 API 時才需要先把每一頁轉算成影像)。
  2. 欄位只定義一次
    建立一張帶欄位結構的表:像 vendor、date、total 這類純量欄位,再加上用來收納重複明細項目的陣列欄位。這會成為 CSV 標題,並沿用於每一份文件。
  3. 上傳影像
    把你的文件影像上傳到這張表。每張影像被判讀後,其值會自動填進你欄位下的新一列——不需逐份設定,而且值是原樣保留的。
  4. 匯出成 CSV
    匯出這張表。它會下載成 <sheetName>.csv,標題為 # 加上純量欄位名稱,再加上攤平成 colName.childName 的陣列子項目。明細項目列會展開成子列,檔案為帶 BOM 的 UTF-8,讓 Excel 與中日韓文字都能正常開啟。
我要怎麼把掃描文件轉成 CSV?
把每份文件拍成點陣影像(手機照片或 PNG 掃描檔都可以),把欄位以表格結構定義一次,接著上傳影像——每份文件就會在你的欄位下填成一列。完成後匯出這張表,它會下載成 <sheetName>.csv。標題是 # 索引加上你的純量欄位名稱,明細項目陣列則攤平為 colName.childName。
這份 CSV 在 Excel 裡能正常開啟嗎,包含日文或中文?
可以。匯出是以帶位元組順序標記(BOM)的 UTF-8 寫入的,這正是 Excel 偵測編碼所需要的。如此一來,檔案打開時日文、韓文與中文字元都不會變成亂碼。
CSV 裡的明細項目是怎麼處理的?
陣列(明細項目)欄位在標題中會攤平為 colName.childName——例如含 name 與 unit_price 的 items 陣列會變成 items.name 與 items.unit_price。含有明細項目陣列的列會展開成子列:父層的純量值出現一次,每個明細項目在其底下各佔一列。
我可以把掃描 PDF 轉成 CSV 嗎?
在應用程式裡可以。把掃描 PDF 丟進來,每一頁都會在 OCR 之前自動點陣化成 PNG,並像其他文件一樣被判讀成一列。引擎與公開 API 本身接收的是點陣影像(PNG、JPEG 等),所以如果你直接呼叫 API,請先把每一頁 PDF 轉算成影像。不論哪種方式,你都照常把這張表匯出成 CSV。
每份文件都要重新定義欄位嗎?
不用——你在建立表時把欄位定義一次,之後上傳的每份文件都會依照同一組結構來判讀。你也可以套用內建範本(invoice、receipt、business_card 等)來自動帶入欄位,不必手動逐一建立。

把你的掃描文件轉成 CSV

欄位只設定一次,上傳,匯出。免費方案——每月 100 次掃描,免信用卡。每個值回傳時都附帶它在頁面上的位置。

相關