テキストの羅列ではなく、構造化フィールドを返す画像OCR
space-ocrでJPEGやPNGなどの画像をOCR。必要なフィールドを宣言すれば、値ごとに box と quad の座標が付き、確認が要る値は data.review.flagged にまとまって返ります。
ほとんどの画像OCRは、ベタなテキストの塊を返してそこで終わりです。領収書を撮って読み込ませても、返ってくるのは行の集まりで、結局それを読んで、区切って、正しい列に打ち直すことになります。ページを見れば一目でわかったはずの構造が、消えてしまうのです。
space-ocrは画像を構造化フィールドとして読み取ります——店名はここ、日付はそこ、合計はあそこ、明細は行として。値には画像のどこから読み取ったかが必ず付きます。軸に沿った box と4点の quad が data.cells[path] に入るからです。そしてページとの突合が取れなかった値は、理由付きで data.review.flagged に並びます。返ってくるのは、信じるしかない数字ではなく、確認すべき作業リストです。
その場で確認できる、実際の抽出結果
これは1枚の画像——領収書2枚を写した写真——をフィールドに読み取ったものです。下の値にマウスを合わせると、画像上のボックスがその値を読み取った場所です。ここにある数値・ボックス・文字一致率はすべて、実際の解析結果から読み込んだもので、モックアップではありません。一致率は「値の文字をページ上でどれだけ特定できたか」を示す補助的な根拠であり、合否を分ける判定値ではありません。

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.
space-ocrでの画像OCRの仕組み
画像をURLまたは純粋なbase64として /ocr/fields に送ります——JPEG・PNG・GIF・BMP・TIFF・WebPはそのまま読み取られます。EXIF orientation は読み取り前に反映され、非常に大きな写真は長辺4000pxまで縮小されることがあります。実際に読んだ紙面の寸法は data.image が返すので、座標はこの寸法を基準に換算します。
欲しい結果は fields 配列で記述します。フィールドごとに name と type(string / number / integer / date / array / object)を与え、明細表には children を持つ array フィールドを使い、必要に応じて required・pattern・min/max・enum を宣言します。文書側から始めたいときは autoFields: true を送り、返ってきたフィールド名から始めれば十分です。宣言はモデルには渡らないため読み取り自体を誘導しません。決まるのは data.review.flagged に何が載るかと、決定論的な data.normalized 層が何を解釈するかです。(PDFはWebアプリ経由で、各ページをまず画像にレンダリングします。API自体は画像を読みます。)
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/receipt-photo.jpg",
"imageType": "url",
"fields": [
{ "name": "store_name", "type": "string", "required": true },
{ "name": "date", "type": "date", "required": true },
{ "name": "total", "type": "number", "required": true, "min": 0 },
{
"name": "items",
"type": "array",
"children": [
{ "name": "name", "type": "string" },
{ "name": "price", "type": "number" }
]
}
]
}'画像をOCRする手順
- 画像を送るJPEG・PNG・GIF・BMP・TIFF・WebPを /ocr/fields にURLまたは純粋なbase64で送るか、アプリにドロップします。EXIFの向きは読み取り前に反映されます。
- フィールドを宣言する値ごとに name と type を書いた fields 配列を送ります——明細行テーブルには children を持つ array フィールドを使います。autoFields を true にして、返ってきたフィールド名から始めることもできます。
- 構造化された結果を読む業務データは data.values に入ります。data.cells はパスごとに box と quad、verified の判定と evidence を返し、data.image がその座標をピクセルへ換算する基準になります。
- 検討リストを処理するdata.review.flagged を順に処理します。各項目は path と reasons を持つので、cells[path] を開いて画像上に box を描き、印字されている文字と値を突き合わせます。編集は元のOCR値の隣に保存されます。
- エクスポートまたはクエリCSV(UTF-8 BOM、明細行は展開済み)をダウンロードするか、保存済みシートを GET /view で where・sort・select を使ってクエリします——保存済みの行を読むだけならOCRの再実行はなく、課金もありません。
シンプルで予測できる料金
1枚あたり¥10(税込)。カード登録不要で毎月100クレジットの無料枠があり、失敗時は課金しません。定額プランは月間クレジット数・シート数・ストレージを追加します。