space ocr
指南文章價格文件
Invoice OCR

把供應商發票變成可信資料的發票 OCR

別再手動輸入發票。space-ocr 依你宣告的欄位讀出供應商、單號、日期、合計與每一筆明細列,並把每個值連同 box/quad 座標、verified 判定,以及列出待核值的 data.review.flagged 一起回傳。

每一張進到收件匣的發票,都是一筆小小的輸入稅。有人打開 PDF,找出供應商、發票號、日期、稅額列、合計,再把這些全部重新敲進會計系統——要明細的話,還得一列列手抄。又慢,又是錯字的溫床,合計敲錯一個數字就能卡住一次付款。

發票 OCR 本該把這件事接過去:讀發票,回傳欄位。問題在於,大多數工具遞給你一個數字,然後讓你自己去信。space-ocr 依你宣告的欄位把發票讀成結構化的列,並把每個值連同它在頁面上被讀取的區域一起回傳,同時給出一份沒有通過核對的值的複核清單。核准付款前要看的是那幾個值,而不是整頁。

看一張你可以親自核對的真實發票

把滑鼠移到下方任一欄位上——發票上的框就是這個值被讀取的位置。供應商、開立日期、帳單週期、付款期限、應付金額、合計,以及每一筆明細列,都直接讀自一次真實的解析結果,而不是擺拍。

Invoice with extracted-field bounding boxes
Verified fields
Invoice

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)。三者的回應外形一致——data.values、以 path 為鍵的 data.cells、data.review 與 data.image——核對邏輯寫一次就能重複使用。
每個值都可定址
供應商、發票號、開立日期、付款期限與每個金額都會進入 data.cells[path]:軸對齊的 box(0–1000 正規化格線上的 xmin/ymin/xmax/ymax),以及跟隨頁面傾斜的四點 quad。座標所依據的寬高由 data.image 給出。
不只是合計,還有明細列
把明細列宣告為帶 children 的 array 欄位,描述一列(品名、數量、單價、金額)。每個儲存格以 items[0].amount 這樣的路徑保留自己的座標,列本身是 items[0] 的合併框,所以換行或合併的列也能追蹤。
宣告規則,收到例外
沒有範本可選,欄位由你命名。給發票號加 required,給日期加 type date,給金額加 type number 與 min,再給供應商加 not_near,這樣從收件方區塊取來的名稱會以 near_conflict 浮現,而不是悄悄通過。
稅額與合計
小計、稅額列與總額都是普通的 number 欄位。data.values 保留讀出的原始寫法;宣告純量型別後,data.normalized 會並列給出解析後的數值,解析不了是 type_mismatch,越過 min/max 則是 out_of_range。
乾淨的匯出
帶 UTF-8 BOM 的 CSV(Excel 與中日韓文字安全,明細列展開為子列),以及 REST API 的 JSON——直接進你的試算表或會計匯入。
AP(應付)自動化
把發票作為非同步工作送到 /upload,每張讀完後收到帶 HMAC 簽章的 ocr.completed Webhook,新的供應商發票就會自動流入工作表,不必有人盯著佇列。

space-ocr 裡的發票 OCR 如何運作

把發票拖進應用程式,它會被讀成一列——供應商、日期、金額,明細列則成為一張可以排序、篩選、匯出的子表。PDF 發票會先按頁算繪成圖片,再被讀取。如果你直接呼叫 API,請傳送頁面圖片(公開 API 接收點陣圖像——JPEG、PNG、GIF、BMP、TIFF、WebP),回傳的結構化結果是一樣的。

發票不必從頭描述,也沒有範本要選。把會計裡已經在用的名稱直接作為 fields 送出,並附上適合發票的檢查;版型陌生就送 autoFields,把回傳的名稱留作你的宣告。明細列是一個帶 children 的 array 欄位。

每張發票會回傳:

  • data.values — 業務資料,形狀與你宣告的完全一致。
  • data.cells[path] — 該值的 box 與 quad,以及 verified、review 與 evidence(逐字核對的佐證,包含 text_match、printed_text 與 match_ratio)。
  • data.review.flagged — 複核清單:每項含 path 與 reasons,依排名排列,第 0 項為主因。
  • data.normalized — 宣告了純量型別的欄位所解析出的數值或 ISO 日期。
  • data.image — 所有座標所依據的寬與高。
宣告發票欄位並讀取一頁圖片
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
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/invoice-page-1.png",
    "imageType": "url",
    "fields": [
      { "name": "supplier", "type": "string", "required": true, "not_near": ["Bill To", "御中"] },
      { "name": "bill_to", "type": "string", "near": ["Bill To", "御中"] },
      { "name": "invoice_no", "type": "string", "required": true, "pattern": "^[A-Za-z0-9-]{4,}$" },
      { "name": "issue_date", "type": "date", "required": true },
      { "name": "due_date", "type": "date" },
      { "name": "subtotal", "type": "number", "min": 0 },
      { "name": "tax", "type": "number", "min": 0 },
      { "name": "total", "type": "number", "required": true, "min": 0 },
      {
        "name": "items", "type": "array",
        "children": [
          { "name": "description", "type": "string" },
          { "name": "quantity", "type": "number" },
          { "name": "unit_price", "type": "number" },
          { "name": "amount", "type": "number" }
        ]
      }
    ]
  }'

如何對發票做 OCR

  1. 加入發票
    在應用程式中拖入發票(PDF 或圖片)——每一頁會被算繪成圖片並排入 OCR 佇列。做 AP 自動化時,把它送到 /upload,讀完後收到 Webhook。
  2. 宣告欄位
    把會計裡在用的名稱作為 fields 送出,並附上適合發票的檢查——發票號加 required,日期加 type date,金額加 type number 與 min;版型陌生就送 autoFields,把回傳的名稱留作宣告。明細列是一個帶 children 的 array 欄位。
  3. 讀取結構化結果
    業務資料在 data.values。座標與逐值判定在 data.cells[path]——box、quad、verified、review、evidence——座標所依據的畫幅由 data.image 給出。
  4. 入帳前先核對
    走訪 data.review.flagged,而不是給分數設閾值。每項給出 path 與 reasons;跳到 data.cells[path],把 box 或 quad 高亮在頁面上並修正該值。編輯會儲存在原始 OCR 值旁邊。
  5. 匯出或查詢
    為會計匯入下載 CSV(UTF-8 BOM,明細列已展開),或用 GET /view 搭配 where、sort、select 查詢已儲存的工作表——無需重跑 OCR,也不額外收費。

簡單、可預期的定價

讀一頁就是一個點數——$0.05(含稅),在應用程式裡上傳或呼叫 API 都是同一價格。每個帳號每月有 100 點數免費額度,免信用卡,失敗不計費。方案計畫增加每月點數、更多工作表與儲存空間。

Free
$0
  • 100 點數/月
  • 3 工作表
  • 1 GB 儲存空間
免費 — 免信用卡
Starter
$19/月
  • 500 點數/月
  • 15 工作表
  • 10 GB 儲存空間
免費開始
最受歡迎
Pro
$39/月
  • 1,100 點數/月
  • 無限工作表
  • 100 GB 儲存空間
免費開始
發票 OCR 能從發票裡取出什麼?
取出你宣告的內容。供應商名、發票號、開立日期、付款期限、帳單週期、小計、稅額與總額都是普通的 string / date / number 欄位,明細列則是一個用 children 描述一列的 array 欄位。每個值都會進入 data.cells[path],帶上它被讀取的 box 與 quad。
它能讀明細列,而不只是合計嗎?
能。把明細列宣告為 type 為 'array' 的欄位,其 children 描述一列(品名、數量、單價、金額)。每個儲存格以 items[0].amount 這樣的路徑保留自己的座標,列本身是 items[0] 的合併框,匯出時展開為子列。
我怎麼知道它讀出的合計是對的?
不去調閾值,而是處理複核清單。data.review.flagged 列出被標記的路徑,每項帶依排名排列的原因,例如 text_mismatch、missing、type_mismatch 或 out_of_range;verified 在核對跑過且沒有觸發任何標記時為 true,觸發了就是 false,沒有可核對的對象時為 null。打開 data.cells[path],把 box 或 quad 疊到頁面上,自己看一眼印出來的區域。座標是值來自何處的佐證,不是它正確的證明——兩個讀取方也可能在同一處誤讀上取得一致——所以業務端的檢核請保留。
我能把發票匯出成 CSV 或匯入會計嗎?
能。下載帶 UTF-8 BOM 的 CSV(讓 Excel 正確開啟中日韓文字,明細列展開為子列),或用 REST API 的 JSON。把發票作為非同步工作送到 /upload,每張讀完後會觸發一個簽章 Webhook。
它支援 PDF 發票嗎?
Web 應用直接接受 PDF 發票——它把每一頁算繪成圖片再做 OCR。公開 API 接收點陣圖像(JPEG、PNG、GIF、BMP、TIFF、WebP),因此呼叫 API 時你傳送頁面圖片。
發票 OCR 多少錢?
一頁一個點數——$0.05(含稅),每月 100 點數免費,免信用卡。失敗不計費。方案計畫(Starter 與 Pro)增加每月點數、更多工作表與儲存——見上方的方案。

把你的供應商發票變成可核對的資料

免費額度——每月 100 點數,免信用卡。每個值都連同它在頁面上的位置一起回傳。

相關