領収書・請求書に最適なOCRソフトの選び方
領収書・請求書OCRソフトの選定ガイド。検証可能な精度、明細行の抽出、エクスポート、API、Webhook、監査証跡、そして明朗な料金まで——実際に確認できるライブデモで証明します。
紙の書類を扱うすべての会社が、領収書と請求書を扱っています——そしてどちらも手入力するのは本当に苦痛です。OCRが約束するものは明快です。書類を撮影し、構造化データを受け取り、次の作業へ進む。問題は、ほとんどのOCRツールがそれらしい結果で止まってしまうことです。取引先名と合計金額を渡され、あとはそれを信じるしかありません。個人の経費メモならそれで十分でしょう。しかし買掛金管理や経費の突合、あるいは監査の対象になる業務では、「AIがそう言ったから」という説明は、自分の名前で通せる答えにはなりません。
このガイドは選定チェックリストです。派手なデモではなく、領収書・請求書に最適なOCRソフトを本当に分けるポイント——検証可能な精度、明細行の抽出、きれいなエクスポート、Webhookを備えた本物のAPI、監査証跡、そして予測できる料金——を一つずつ確認し、space-ocrがそれぞれをどう実現しているかを、スクリーンショットではなく実際に確認できるライブデモでお見せします。
まずは証拠から:その場で確認できる実際の抽出結果
機能の話に入る前に、多くのベンダーが見せたがらないものをお見せします。それは、すべての値が、ページ上のどこから読み取られたかを正確に指し示す抽出結果です。下のフィールドにマウスを合わせてみてください——領収書上に表示される枠が、その値が読み取られた場所です。

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.
領収書・請求書OCRで見るべきポイント
領収書と請求書は、「簡単そうに見えて最も難しい」書類です。レイアウトは取引先ごとにばらばら、合計金額は小計や税額の行に紛れ、明細は折り返し、スマホ写真は傾いて反射が入って届きます。きれいなPDF1枚なら完璧に処理できるツールが、次のしわくちゃの感熱紙レシートで崩れることも珍しくありません。マーケティング文句に惑わされないよう、次の基準を使ってください。
| 重要な点 | なぜ重要か | 弱いツール | 強いツール |
|---|---|---|---|
| 検証可能な精度 | 追跡できない数字は、結局打ち直すしかない | 値を返す、せいぜい信頼度スコアまで | 各値を出典座標つきで返す——軸並行のボックスと、紙面の傾きに沿う四点 |
| スコアではなく検討リスト | 何から確認するかを、誰かが決めなければならない | しきい値の設計を利用側に丸投げする | 要確認のパスを、機械が読める理由コードつきで返す。宣言した数値・日付には決定的な解釈値も付く |
| 明細行 | 請求書も領収書もテーブルであって、平坦なフィールドではない | 合計だけ拾って明細行を落とす | セルごとの位置を持つ明細行を繰り返し抽出する |
| エクスポート | データはツールの外に出てこそ役に立つ | コピペか、囲い込まれたビューアのみ | API経由のCSV(Excel/CJK対応)とJSON |
| API + Webhook | 本格的な処理量には、クリックではなく自動化が要る | UIのみ、または貧弱な同期エンドポイント | 非同期ジョブと署名付きWebhookを備えたREST API |
| 監査証跡 | レビュー担当者は何が変わったかを見たい | OCR結果を黙って上書きする | 元の値を人手の修正と並べて保持する |
| 明朗な料金 | 予算管理に不意打ちは禁物 | 何でも「お問い合わせ」 | 公開された1枚あたりの料金と無料枠 |
この記事の残りでは、各行を順番に取り上げていきます。
検証可能な精度は、信頼度スコアに勝る
信頼度スコアは、モデルが「自信あり」と感じていることを教えてくれます。しかし、total: 2,045 が領収書に実際に印字された数字かどうかは教えてくれません。space-ocr はもっと厳しい問いに答えます。業務データは data.values に返り、そこへのパス(total、line_items[0].unit_price)がそのまま data.cells の項目を指します。
box— 0〜1000に正規化されたグリッド上の軸並行矩形{ xmin, ymin, xmax, ymax }(0,0 = 左上、1000,1000 = 右下)。ピクセルへの換算には、実際に読んだ紙面の寸法を持つdata.imageを使います。quad— 書類の傾きに沿う順序付きの4点。boxと必ず併せて返ります。傾き補正はしないため、斜めのスマホ写真でも枠は紙面どおりに付きます。verified— 判定です。検討理由が付いたセルはfalse、照合が走って何も立たなければtrue、照合する相手が無ければ(明細行のユニオンボックスなど)nullになります。review—nullか、確認すべき理由を並べた{ reasons }のどちらかです。evidence— 判定の裏付けです。文字照合そのものの結果text_match、値の文字がどれだけ紙面上で見つかったかを表すmatch_ratio、その座標で OCR が読んだ生の文字printed_textが入ります。
確認の作業リストは data.review.flagged です。{ path, reasons } の配列で、path は cells のキーと同じ文法なので該当セルをそのまま引けます。位置情報が値とともに付いてくるため、ボックスを描画したり、座標を引用したり、フラグの立ったフィールドを再確認したりするのに、OCRを再実行する必要がありません。これがOCR監査証跡の土台であり、上のデモがモックアップでない理由でもあります。
座標は、モデルの言い分をそのまま信じて決めているわけではありません。 言語モデルは各フィールドのテキストと、どの単語トークンを使ったかのヒントを返しますが、ボックスそのものは決して返しません。エンジンはそのテキストを、ビジョンOCRがページ上で実際に検出したシンボルと文字単位で照合します。だからこそボックスは、それらの文字が見つかった実際のピクセルに配置され、各値にはどれだけ照合できたかを示す match_ratio が付与されます。モデルのトークンヒントはノイズを含むことがあり(繰り返し行の間で取り違えることがあります)、そのため鵜呑みにするのではなく、列・行の整合性チェックで検証します。要点は、AIが間違えないということではなく、すべての値が領収書と照合され、どれだけ一致したかを示すスコアが付くということです。
合計だけでなく、明細行まで
安価な領収書OCRで最も大きく欠けているのが、テーブルです。総合計を拾うだけなら誰にでもできます。価値があるのは明細行——商品ごとの数量、単価、値引きです。space-ocr はこれらを繰り返し行として抽出し、各セルがそれぞれの位置を保持するため、折り返しや結合された明細行でも追跡できます。
明細行は、1行を children で記述した type: "array" のフィールドとしてリクエストします。明細行モデルのより詳しい解説は請求書からの明細行抽出をご覧ください。
{
"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": "quantity", "type": "number" },
{ "name": "unit_price", "type": "number" }
]
}
]
}必要なフィールドだけ宣言する——決まっていなければ autoFields
抽出スキーマは fields 配列で渡します。自社のデータベースに実際に入る項目だけを名前と型で並べ、明細行は1行分を children で記述した type: "array" として宣言します。どんな項目が載っているか分からない段階では、代わりに autoFields: true を送ればモデルがスキーマを提案します——返ってきた名前をそのまま固定の宣言に移せば、本番用の呼び出しになります。
宣言は精度の調整つまみではありません。required・pattern・min/max・enum・near・not_near はいずれもモデルには渡らないため、抽出される値は宣言してもしなくても同じです。増えるのは二つです。規則を破った値が理由(missing・pattern_mismatch・out_of_range・near_mismatch・near_conflict)とともに data.review.flagged に載ること、そして number・integer・date を宣言すると values の隣に data.normalized が並ぶことです——同じ読みを決定的に解釈した層なので、同じ紙面なら毎回同じ数値になります。near・not_near は、会社名が2社印字された帳票で正しい方を選ばせる機能ではありません。選び間違いを見えるようにする手立てです。
呼び出しはHTTPリクエスト1回だけ——SDKもPDFの前処理も不要です(エンジンが読むのはラスター画像、つまり写真やスキャンです)。
# A. 本番——自社が保存する項目だけを宣言する
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.jpg",
"imageType": "url",
"fields": [
{ "name": "issuer", "type": "string", "near": ["登録番号", "TEL"] },
{ "name": "recipient", "type": "string", "not_near": ["登録番号", "TEL"] },
{ "name": "invoice_no", "type": "string", "required": true,
"pattern": "^[A-Z0-9-]{4,}$" },
{ "name": "invoice_date", "type": "date" },
{ "name": "payment_method", "type": "string", "enum": ["現金", "振込", "クレジット"] },
{ "name": "total", "type": "number", "required": true, "min": 0 },
{
"name": "line_items",
"type": "array",
"children": [
{ "name": "description", "type": "string" },
{ "name": "quantity", "type": "number" },
{ "name": "unit_price", "type": "number" }
]
}
]
}'
# B. 探索——スキーマ未定なら提案させる
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.jpg",
"imageType": "url",
"autoFields": true
}'エクスポートとAPI:データの行き先
抽出も、データがツールに閉じ込められたままでは無価値です。space-ocr はきれいな出口を2つ用意しています。
- CSV — シートはUTF-8 BOM付きでエクスポートされるため、Excelが日本語・韓国語・中国語のテキストを正しく開きます。配列(明細行)の行はサブ行に展開され、手作業による修正があれば出力ではOCRの値を上書きします。
- REST経由のJSON — 1件の書類には
POST /ocr/fields、画像をそのままシートに投入するにはPOST /upload、保存済みシートをサーバー側で(where、sort、select、limitで)クエリするにはGET /viewを使います。OCRを再実行する必要も、再度課金されることもありません。
大量処理の自動化では、/upload はデフォルトで非同期です。ファイルごとにジョブを返し、完了時に Webhook で通知します——スペースごとに1つの署名付き(HMAC-SHA256)エンドポイントで、ocr.completed や ocr.failed といったイベントが届きます。これが、クリックして使うツールと、自分で回るパイプラインの違いです。全体像は請求書データ抽出APIガイドとAPIドキュメントにあります。
監査証跡:機械が読んだ値 vs. 人が変えた値
最良の領収書・請求書OCRは、自分の出力を記録するだけでなく、修正も記録します。space-ocr でセルを編集すると、あなたの値は元のOCRの値とは別に保存され、元の値のツールチップがエンジンの最初の読み取り結果を常に表示します。レビュー担当者は機械の値と人手の上書きを並べて確認できます——これこそ監査が求めるものです。
明朗で予測できる料金
検証可能な精度と誠実な料金は、たいてい同じ姿勢から生まれます。space-ocr は1枚あたり¥10です。クレジットカード不要、月100クレジットの無料枠があり、月額¥8,980のProプランには1,100クレジット、シート数無制限、100GBのストレージが含まれます。フィールド単位の課金もページ単位の追加料金もなく、保存済みシートへのクエリ(GET /view)は無料です。
領収書・請求書を抽出する手順
- 画像を送信する領収書または請求書を、imageType を「url」または「base64」にして /ocr/fields へPOSTします。エンジンが読むのはラスター画像——スマホ写真やスキャンです。
- フィールドを宣言する保存したい項目を fields 配列で宣言します。明細行は1行分を children で記述した array フィールドにします。スキーマが固まっていなければ、代わりに autoFields を送って提案させます。
- 構造化された結果を読む業務データは data.values に、各値の box・quad・verified・review・evidence は data.cells[path] に返ります。座標の基準となる紙面の寸法は data.image にあります。
- 検証して修正するdata.review.flagged を順に処理します。各項目がパスと理由(text_mismatch、missing、out_of_range など)を示します。セルをクリックすれば、それが読み取られた正確な領域がハイライトされ、編集内容は元の値の隣に保存されます。
- エクスポートまたはクエリするCSV(UTF-8 BOM、明細行は展開済み)をダウンロードするか、保存済みシートを GET /view で where、sort、select を使ってクエリします——OCRの再実行も追加料金もありません。