space ocr
ガイド記事料金ドキュメント
Image OCR

テキストの羅列ではなく、構造化フィールドを返す画像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枚を写した写真——をフィールドに読み取ったものです。下の値にマウスを合わせると、画像上のボックスがその値を読み取った場所です。ここにある数値・ボックス・文字一致率はすべて、実際の解析結果から読み込んだもので、モックアップではありません。一致率は「値の文字をページ上でどれだけ特定できたか」を示す補助的な根拠であり、合否を分ける判定値ではありません。

Receipts with extracted-field bounding boxes
Verified fields
KINSHO · 合計 2,045
ライフ · 合計 4,286

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.

3 つの形、同じ契約
同じ 1 ページを、名前付きフィールドとして・レイアウトを保った Markdown として(POST /ocr/markdown)・読み順を整えたプレーンテキストとして(POST /ocr/text)受け取れます。3 つとも返却の器は values / cells / review / image で共通なので、どの形を選んでも座標と verified の判定は同じ扱いです。
テキストの羅列ではなく構造化フィールド
画像は data.values の下に、店名・日付・合計・明細行といった名前付きの値と行になって返ります。依頼したスキーマそのままの形なので、自分で区切る必要のある長い1本の文字列ではありません。
すべての値に位置情報
data.cells[path] には軸に沿った box(xmin/ymin/xmax/ymax)と4点の quad が入り、いずれも 0〜1000 の正規化座標です。ピクセル換算に使う寸法は data.image が返します(x = box.xmin / 1000 × width)。
スマホ写真もOK
EXIF の向きは読み取り前に反映されるので、返る座標は表示中の写真と一致します。傾き補正は行わないため quad は手持ち撮影の傾きに沿い、非常に大きな写真は先に縮小されることがあります。座標の基準は送信したファイルではなく data.image です。
必要なフィールドを宣言
fields 配列に name と type を並べ、必要に応じて required・pattern・min/max・enum・label・near を添えて送ります。文書側から始めたいときは autoFields を true にすれば、書類から拾ったフィールド名が返ります。
合計だけでなく明細行も
children を持つ array フィールドは繰り返し行として返り、セルごとにパスと位置を保ちます。items[0].amount が1セル、items[0] がその行にあたります。
きれいなエクスポート
UTF-8 BOM付きCSV(Excel・CJK対応、明細行は展開)と、非同期ジョブ(POST /upload → GET /jobs/{jobId})・HMAC署名付きWebhookを備えたREST API経由のJSON。

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自体は画像を読みます。)

画像からフィールドを抽出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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する手順

  1. 画像を送る
    JPEG・PNG・GIF・BMP・TIFF・WebPを /ocr/fields にURLまたは純粋なbase64で送るか、アプリにドロップします。EXIFの向きは読み取り前に反映されます。
  2. フィールドを宣言する
    値ごとに name と type を書いた fields 配列を送ります——明細行テーブルには children を持つ array フィールドを使います。autoFields を true にして、返ってきたフィールド名から始めることもできます。
  3. 構造化された結果を読む
    業務データは data.values に入ります。data.cells はパスごとに box と quad、verified の判定と evidence を返し、data.image がその座標をピクセルへ換算する基準になります。
  4. 検討リストを処理する
    data.review.flagged を順に処理します。各項目は path と reasons を持つので、cells[path] を開いて画像上に box を描き、印字されている文字と値を突き合わせます。編集は元のOCR値の隣に保存されます。
  5. エクスポートまたはクエリ
    CSV(UTF-8 BOM、明細行は展開済み)をダウンロードするか、保存済みシートを GET /view で where・sort・select を使ってクエリします——保存済みの行を読むだけならOCRの再実行はなく、課金もありません。

シンプルで予測できる料金

1枚あたり¥10(税込)。カード登録不要で毎月100クレジットの無料枠があり、失敗時は課金しません。定額プランは月間クレジット数・シート数・ストレージを追加します。

Free
¥0
  • 100 クレジット/月
  • 3 シート
  • 1 GB ストレージ
無料 — カード不要
Starter
¥3,980/月
  • 500 クレジット/月
  • 15 シート
  • 10 GB ストレージ
無料で始める
おすすめ
Pro
¥8,980/月
  • 1,100 クレジット/月
  • シート無制限
  • 100 GB ストレージ
無料で始める
space-ocrはどの画像フォーマットをOCRできますか?
公開APIはラスター画像をそのまま読み取ります——JPEG・PNG・GIF・BMP・TIFF・WebP。画像は自動でRGBに変換されます。PDFはWebアプリ経由で、各ページを画像にレンダリングしてからOCRします。
画像OCRは構造化フィールドを返しますか、それとも単なるテキストですか?
構造化フィールドです。画像は data.values の下に、店名・日付・合計・明細行といった名前付きの値と行として、宣言したスキーマそのままの形で読み取られます。自分で解析しなければならない長いテキストの塊ではありません。
スマホで撮った写真をOCRできますか?
できます。EXIF orientation は読み取り前に反映されるので、返る座標は表示中の写真と一致します。傾き補正は行わないため4点の quad は手持ち撮影の傾きに沿い、その座標が属する紙面の寸法は data.image が返します。
画像OCRは各値の位置を保持しますか?
はい。data.cells のパスごとに、0〜1000の正規化グリッド上の box(xmin/ymin/xmax/ymax)と4点の quad が付き、ピクセル換算に必要な寸法は data.image が返します。cells[path].evidence には突合の根拠が入り、match_ratio と、このエンドポイントでは printed_text(その座標で読み取った生の文字)も含まれます。
どの値を確認すべきか、どうやって判断しますか?
data.review.flagged を読みます。各項目は path と、順位付けされた reasons の配列(text_mismatch・missing・pattern_mismatch・out_of_range など文書化された理由コード)を持ち、確認件数は flagged.length です。path から cells[path] を開き、値の隣に box を描いて突き合わせます。独立した2つの読み取りが同じ誤読で一致することもあるため、業務側の検証は引き続き行ってください。
画像はどうやってAPIに送りますか?
POST /ocr/fields にURL(imageType 'url')または純粋なbase64(imageType 'base64'、data-URIプレフィックスなし)として送ります。認証はBearerトークンで、キーは spocr_ で始まります。必要な項目を書いた fields 配列を渡すか、autoFields を true にします。
画像OCRの料金はいくらですか?
1枚あたり¥10(税込)で、カード登録不要・毎月100クレジットの無料枠があり、失敗時は課金しません。定額プラン(StarterとPro)は月間クレジット数・シート数・ストレージを追加します——上の料金表をご覧ください。

あなた自身の画像を、確認できるデータに

無料枠——月100クレジット、クレジットカード不要。すべての値が画像上の位置とともに返ります。

関連