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

確認できるデータに変える、PDFのOCR

space-ocr で PDF のページから構造化データを抽出します。必要なフィールドを宣言すると、各値は data.cells の座標付きで返り、確認すべき項目は data.review.flagged に並びます。

PDFは、データが隠れてしまう場所です。請求書、領収書の束、納品書——数字はページ上にちゃんとあるのに、表計算に取り込むには結局打ち直すことになります。PDF OCRはそれを解決すると約束します。書類を読んで、構造化されたフィールドを返す、と。ただ問題は、ほとんどのツールがそれらしい推測で止まり、あとはそれを信じるしかないことです。

space-ocrはもっと厳しい問いに答えます。必要なフィールドを宣言すると、各値は読み取り元のページ領域——data.cells の box と quad——とともに返り、さらに突合が通らなかったパスが data.review.flagged に並びます。解釈すべきスコアが1つ届くのではなく、確認すべき作業リストが届きます。

その場で確認できる、実際の抽出結果

下のフィールドにマウスを合わせてみてください——領収書上のボックスが、その値を読み取った場所です。ここにある値・ボックス・マッチ率はすべて実際の解析結果から読み込んだもので、モックアップではありません。

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ページを、名前付きフィールドとして(POST /ocr/fields)、レイアウトを保った Markdown として(POST /ocr/markdown)、読み順を整えたプレーンテキストとして(POST /ocr/text)受け取れます。3経路とも values・cells・review・image という同じ封筒で返るので、検証側の実装は1本で済みます。Markdown は要素単位の cells を既定で返し、テキストは includeBlocks: true で付きます。
すべての値に位置情報
data.cells の各パスは box(0〜1000正規化グリッド上の xmin/ymin/xmax/ymax)と、ページの傾きに沿う4点の quad を持ちます。座標の基準となる幅と高さは data.image が示すので、ピクセル換算は掛け算ひとつです。
合計だけでなく明細行も
type が array のフィールドに children を宣言すると、各行が items[0].amount のような添字付きパスに落ち、セルを個別に持ちます。行自体も外接ボックスを持つため、折り返しや結合された行も追跡できます。
固定スキーマではなく、自分のフィールド
実際に保存するフィールドを送ります。name と type に加えて、必要に応じて required・pattern・min/max・enum・label・near を宣言できます。未知の書式を試すときは autoFields: true を送ればスキーマが提案されます。宣言はモデルには渡らず、読み取り方ではなく何を要確認とするかを決めます。
きれいなエクスポート
UTF-8 BOM付きCSV(Excel・CJK対応、明細行は展開)と、REST API 経由のJSON。非同期ジョブは GET /jobs/{jobId}、ocr.completed はHMAC署名付きWebhookで受け取れます。
言語は全自動
日本語・韓国語・中国語・英語をひとつのエンジンで——言語設定の項目はなく、混在スクリプトも処理します。
スマホ写真も傾いたスキャンも
読み取り前にEXIF回転がピクセルに反映され、傾き補正は行いません。quad が書類の傾きに沿うので、描いた枠は印字どおりの位置に重なります。

space-ocrでのPDF OCRの仕組み

アプリにPDFをドロップすると、各ページがブラウザ内でPNGにレンダリングされ、読み取られて構造化フィールドになります——複数ページのPDFは、並べ替え・絞り込み・エクスポートできる行の集合になります。

公開APIはより厳格で、読むのはラスター画像だけ、PDFのバイト列は読みません。POST /upload はPDFをその場で拒否し、先にページを画像化するよう返します。API利用時はご自身でラスタライズし、ページ画像を送ってください。どちらの経路でも1ページ1クレジットです。

/ocr/fields の応答は次の形です。

  • data.values — 宣言したスキーマそのままの業務データ。
  • data.cells[path] — そのパスの box・quad・verified・review・evidence。
  • data.review — declared・returned・boxed・verified、そして作業リストの flagged。
  • data.normalized — number・integer・date を宣言したフィールドの解析済み値。
  • data.image — すべての座標の基準となる幅と高さ。

verified は文字一致そのものではなく判定です。review に理由が立てば false、照合が走って何も立たなければ true、照合する対象がなければ null になります。文字どうしの突合自体は evidence.text_match にあり、evidence.match_ratio はその補助情報として並びます。

ページを画像化してからフィールドを抽出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# APIが読むのは画像でありPDFのバイト列ではない — 先にページを画像化する
pdftoppm -r 200 -jpeg invoice.pdf page

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/page-1.jpg",
    "imageType": "url",
    "fields": [
      { "name": "invoice_no", "type": "string", "required": true },
      { "name": "issue_date", "type": "date", "required": true },
      { "name": "total", "type": "number", "required": true, "min": 0 },
      { "name": "items", "type": "array", "children": [
        { "name": "description", "type": "string" },
        { "name": "quantity", "type": "number" },
        { "name": "amount", "type": "number" }
      ] }
    ]
  }'

PDFをOCRする手順

  1. ページを画像化する
    Webアプリでは、PDFをドロップすると各ページがブラウザ内でPNGにレンダリングされます。APIを直接呼ぶ場合は、ご自身でページを画像化し、url または base64 として POST /ocr/fields に送るか、POST /upload でシートに取り込みます。
  2. フィールドを宣言する
    欲しい fields を並べます。name と type に加え、必要に応じて required・pattern・min/max・enum・label・near を宣言します。明細行の表には children を持つ array フィールドを使い、書式が未知なら autoFields: true でスキーマ提案を受けられます。
  3. 構造化された結果を読む
    業務データは宣言したスキーマのまま data.values に、パスごとの box・quad・verified・review・evidence は data.cells[path] に、number・integer・date を宣言したフィールドの解析済み値は data.normalized に入ります。
  4. review.flagged を処理する
    data.review.flagged を順に見ます。各項目は path とランク順の reasons 配列で、先頭が代表理由です。data.cells[path] を開いて box または quad を data.image 基準で描き、読み取り元の領域の隣で値を直します。
  5. エクスポートまたは照会
    CSV(UTF-8 BOM、明細行は展開済み)をダウンロードするか、保存済みシートを GET /view で where・sort・select・boxes を使って照会します——この読み取りは無料で、OCRの再実行もありません。

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

1クレジットで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でPDFをOCRできますか?
できます。ただし1ステップ挟みます。WebアプリはPDFを直接受け付け、各ページをブラウザ内でPNGにレンダリングしてからOCRするため、複数ページのPDFが構造化された行になります。公開APIが読むのはラスター画像だけで、POST /upload はPDFを拒否し、先にページを画像化してから送るよう返します。
PDF OCRは各値の位置を保持しますか?
はい。data.cells の各パスは、box(0〜1000正規化グリッド上の xmin/ymin/xmax/ymax)と、書類の傾きに沿う4点の quad を返します。どちらも data.image を基準に測られます。要確認かどうかはセルの verified が示し、理由は review.reasons に、evidence.match_ratio や evidence.printed_text といった補助情報は evidence に入ります。
PDFから表や明細行を抽出できますか?
できます。明細行を type が 'array' のフィールドとしてリクエストし、その children で1行(説明・数量・金額など)を記述します。各セルは items[2].amount のような添字付きパスを保ち、行自体も外接ボックスを持つため、折り返しや結合された明細行でも位置まで追跡できます。
どの値を確認すべきか、どう分かりますか?
data.review.flagged を読みます。各項目は path と、ランク順の reasons 配列(missing・text_mismatch・type_mismatch・out_of_range・pattern_mismatch・nobox など)で構成され、確認件数はその配列の長さそのものです。path で data.cells[path] を開けば、その値を読み取った領域を提示できます。固定のスコア閾値を実装する必要はありません。
PDF OCRの結果は何にエクスポートできますか?
UTF-8 BOM付きのCSV(ExcelやCJKテキストを正しく開き、明細行はサブ行に展開)と、REST API経由のJSONです。保存済みシートは GET /view で where・sort・select・boxes を使ってサーバー側から照会でき、この読み取りは無料でOCRの再実行もありません。
PDF OCRの料金はいくらですか?
1クレジット ¥10(税込)で、1クレジットが1ページ分です。全アカウントに毎月100クレジットの無料枠があり、カード登録は不要、失敗時は課金なし。StarterとProは月間クレジット数・シート数・ストレージを追加します——上の料金表をご覧ください。
どの言語に対応していますか?
言語検出は全自動です——日本語・韓国語・中国語・英語をひとつのエンジンで扱い、混在スクリプトや全角・半角にも対応します。選ぶべき言語設定の項目はありません。

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

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

関連