確認できるデータに変える、PDFのOCR
space-ocr で PDF のページから構造化データを抽出します。必要なフィールドを宣言すると、各値は data.cells の座標付きで返り、確認すべき項目は data.review.flagged に並びます。
PDFは、データが隠れてしまう場所です。請求書、領収書の束、納品書——数字はページ上にちゃんとあるのに、表計算に取り込むには結局打ち直すことになります。PDF OCRはそれを解決すると約束します。書類を読んで、構造化されたフィールドを返す、と。ただ問題は、ほとんどのツールがそれらしい推測で止まり、あとはそれを信じるしかないことです。
space-ocrはもっと厳しい問いに答えます。必要なフィールドを宣言すると、各値は読み取り元のページ領域——data.cells の box と quad——とともに返り、さらに突合が通らなかったパスが data.review.flagged に並びます。解釈すべきスコアが1つ届くのではなく、確認すべき作業リストが届きます。
その場で確認できる、実際の抽出結果
下のフィールドにマウスを合わせてみてください——領収書上のボックスが、その値を読み取った場所です。ここにある値・ボックス・マッチ率はすべて実際の解析結果から読み込んだもので、モックアップではありません。

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