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

スキャンしたPDFをExcelに変換する

スキャンしたPDFをExcelに変換する方法。各ページを画像として構造化フィールドに読み取り、元画像と照合してスポットチェックしたうえで、Excelできれいに開けるUTF-8 BOM付きCSVに書き出します。

7 分で読了· 2026-08-31

スキャンしたPDFは、ファイルの中に表計算データが隠れているわけではありません。それはドキュメントを撮った「画像」です。各ページは行・列・合計が並んだ画像で、人間の目には表に見えても、コンピューターにとってはただのピクセルの集まりにすぎません。スキャンに「Excelへエクスポート」ボタンがほとんど用意されていないのはそのためです。エクスポートすべきセルなど存在せず、あるのは画像だけだからです。本物の行を取り出すには、ページを構造化されたフィールドとして読み戻し、それをExcelで開けるファイルとして書き出す必要があります。

ここで紹介するのは、まさにそのワークフローです。ドキュメント画像(スキャンしたページ、スマホで撮った写真、FAXで届いたレシートなど)を取り込み、その値を名前付きフィールドとして抽出し、Excelでそのまま開けるCSVとして書き出します。CSVはBOM(バイトオーダーマーク)付きのUTF-8なので、日本語・韓国語・中国語のテキストも文字化けせず、正しい列にきちんと収まります。「スキャンPDFをExcelに変換する」という作業の成果物が、このCSVです。

なぜスキャンはそのままExcelにできないのか

紙の請求書をスキャンすると、出力されるのはラスター画像です。JPEG写真とまったく同じ種類のファイルです。space-ocrはこうしたラスター形式をそのまま受け付けます。対応形式はJPEG、PNG、GIF、BMP、TIFF、WebPです。元データが複数ページのPDFの場合は、2つの方法があります。PDFをそのままspace-ocrアプリにドロップすれば、各ページを自動的に画像へレンダリングしてくれます。あるいは、REST APIを直接呼び出すなら、先に各ページを画像(PNGまたはTIFF)として書き出して送信します。いずれの場合も、OCRはページ画像に対して実行されます。

エンジンは各画像を読み取って値を見つけ、その値をページのどこから読んだのかという出典座標を、特定できた分について返します。0〜1000に正規化した軸並行のboxと、紙面の傾きに追従する4点のquadです。領域を特定できなかった値や、印字された文字との突合が合わなかった値は、そのまま通過させず検討対象として提示されます。ページがフィールドへと構造化されてしまえば、あとはCSVをダウンロードするだけでExcel化は完了です。難しく、そして手を抜いてはいけないのは「読み取り」であって、エクスポートではありません。

ドキュメント画像から構造化フィールドへ

ドキュメント画像をアップロード — あるいは写真やPDFをそのままドロップするだけ — で、値は文字の羅列ではなく名前付きフィールドとして出てきます。いちばん速いのは、アプリにフィールドを提案させる方法です。ページをドロップすれば、設定不要で自動的にスキーマを提案してくれます。必要な列があらかじめ決まっているなら、自分で列(スキーマ)を定義することもできます。列名と型を一度決めておけば、そのシートに追加する各ページが同じ定義で読み取られます。スキャンがラベル付きの列へと変わる様子をご覧ください。

ドキュメント画像をドロップすると、その値が名前付きフィールドに収まります。これが、あなたのExcelファイルに入る行になります。

請求書の明細行やレシートの商品一覧のように、繰り返し現れる行を含むドキュメントには、子列を持つarrayフィールドを宣言します。ページ上の各行がそれぞれ独立した行になり、合計を計算する必要がある表ではまさにこれが求められます。こうした繰り返し行を専門的に扱いたい場合は、フィールド仕様の詳細を解説した請求書から明細行を抽出するを参照してください。

POST /ocr/fields → リクエストボディ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
  "image": "https://example.com/scanned-page-01.png",
  "imageType": "url",
  "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": "unit_price", "type": "string" },
        { "name": "qty", "type": "string" }
      ]
    }
  ]
}
✓ Verified

値はこちらで正規化しません。 印字された7,8557,855のまま返ります。カンマ、小数点、全角文字も読み取った表記のまま保持し、標準的な数値表記へ書き換えることはないので、紙面との突合が取れます。アプリ上で見える通貨記号はUI上の装飾であって、値の一部ではありません。フィールドのdescriptionに何を書いてもこれは変わりません — 座標と突合が意味を持つためには、値が印字に沿っている必要があるからです。ただしvaluesはモデルがページを読み取ったテキストなので、印字との文字単位の厳密照合が必要なら、その座標における生のOCR文字であるevidence.printed_textを使ってください。計算に使う数値が必要なら、APIが印字された値の隣にそれを返せます。フィールドのtypenumberintegerdateを宣言すると、valuesと並んで解釈済みのnormalizedが付いてきます。

確認してから、Excelへ書き出す

Excelに取り込む前に、読み取り結果を念のため確認しましょう。値にマウスを乗せると、元画像上の該当箇所がハイライトされるので、スキャン全体を見直さなくても、視線がそのまま正しい場所へ向かいます。

全件を目で追う必要もありません。読み取り結果には確認対象の一覧が同梱されます。data.review.flaggedには、確認が必要な値ごとに、その値のpathとフラグのreasonsが入ります。印字との突合が合わなければtext_mismatch、出典領域を特定できなければnobox、必須と宣言したフィールドが空で返ればmissingです。セルのverifiedはその判定で、何かフラグが立った時点でfalseになります。この一覧だけを処理し、残りはそのままで構いません。evidence.match_ratioはセルに付く補助的な材料であって、しきい値で機械的に足切りするための数値ではありません。

フィールドにマウスを乗せて、元のスキャンと照らし合わせて確認。誤った読み取りを、表計算に届く前にキャッチできます。

Excelで開けるCSVを書き出す

フィールドが正しく見えたら、シートを書き出します。出力されるのは<sheetName>.csvで、列名を並べたヘッダー行が付きます。arrayフィールドはcolumn.childという列に展開され、繰り返しの明細行はサブ行として展開されます。ファイルはBOM付きのUTF-8で、これこそがダブルクリックしたときにExcelがCJKテキストをきれいに開いてくれる決め手です。手動で修正した内容は、エクスポート時に元のOCR値を上書きします。

書き出しそのものは、FreeとPay-as-you-goのプランでは1クレジットを消費します。StarterとProではダウンロードは無料です。同じデータの再ダウンロードは、どのプランでも費用がかかりません。

ワンクリックでUTF-8 BOM付きCSVを書き出し。ダブルクリックすれば、Excelが列の揃った行を開きます。

Excelで開くには、.csvをダブルクリックするだけです。BOMがあるおかげで、Excelは自動的にUTF-8として読み込みます。テキストファイルウィザードも、文字化けもありません。そこから、ネイティブのワークブックが必要なら名前を付けて保存 → .xlsxへ。最終的なゴールがExcelそのものではなくシンプルなCSVパイプラインであれば、姉妹ガイドのスキャン文書をCSVにするが同じエクスポートを最初から最後までカバーしています。

APIで大量に処理する

スキャンのフォルダーをまとめて処理するには、まず列スキーマを持つシートを一度作成し、そのシートにページ画像をアップロードします。各画像はそのスキーマに沿って読み取られ、行として追加されていくので、あとでまとめて1つのCSVとして書き出せます。

POST /uploadの上限は、1リクエストあたり20ファイル、1ファイル20MB、リクエスト全体で28MBです(超過すると413が返ります)。料金は1ページあたり1クレジット(¥10、税込)。呼び出しは既定で非同期で、レスポンスにはjobs[]が入り、結果はocr.completedウェブフックかGET /jobs/{jobId}のポーリングで受け取ります。下のリクエストのようにwait=trueを付けると同期で待ち受けになり、待機は1画像あたり最大30秒、間に合わなかった項目はstatus: "pending"で返るので後から回収します。リトライする場合はIdempotency-Keyを付けておくと、再送時にキャッシュ済みのレスポンスが返り、二重にスキャンされません。リクエスト/レスポンスの完全な形式はAPIドキュメントにあります。

スキャンしたページ画像をシートにアップロードする
1
2
3
4
5
6
curl -X POST https://api.space-ocr.com/upload \
  -H "Authorization: Bearer $SPACE_OCR_API_KEY" \
  -F "path=/Invoices 2026" \
  -F "files=@scan-page-01.png" \
  -F "files=@scan-page-02.png" \
  -F "wait=true"

スキャンしたPDFをExcelに変換する手順

  1. PDFまたはページ画像を追加する
    space-ocrアプリでは、PDFをドロップするだけです。各ページが自動的に画像へラスタライズされるので、変換するものは何もありません。REST APIを直接呼び出す場合は、エンジンがPDFのバイトではなくラスター画像(JPEG、PNG、GIF、BMP、TIFF、WebP)を読み取るため、先に各ページをラスター画像として書き出してください。
  2. ページをフィールドとして読み取る
    値を名前付きフィールドとして抽出します。いちばん速いのは、アプリにページからフィールドを自動提案させる方法です。必要な列が決まっていれば、自分で列(スキーマ)を定義することもできます。繰り返しの明細行にはarrayフィールドを宣言します。
  3. 値を確認する
    フィールドにマウスを乗せると、元のスキャンのどこから読み取られたかがハイライトされます。確認は、読み取りが検討対象として立てた値だけで足ります。APIでは理由付きで data.review.flagged に返るので、その一覧を処理し、残りはそのままにします。
  4. CSVを書き出す
    シートをCSVとして書き出します。BOM付きのUTF-8で、arrayの明細行はサブ行に展開され、手動での修正があれば元のOCR値を上書きします。
  5. Excelで開く
    CSVをダブルクリックします。ExcelはBOMを読み取り、列が揃いCJKテキストもそのままの状態で行を開きます。ネイティブのワークブックが必要なら、名前を付けて保存で.xlsxにします。
スキャンしたPDFをExcelに変換するにはどうすればいいですか?
PDFをそのままspace-ocrアプリにドロップしてください。各ページが自動的に画像へラスタライズされ、アプリがフィールドを提案してくれるので、手作業で変換するものは何もありません。値を元画像と照合してスポットチェックしたら、シートをCSVとして書き出します。CSVはBOM付きのUTF-8なので、ダブルクリックするだけでExcelがそのまま開きます。ネイティブのワークブックが必要なら、名前を付けて保存で.xlsxにします。(アプリを使わずREST APIを直接呼び出す場合は、エンジンがラスター画像を受け付けるため、先に各ページを画像として書き出してください。)
space-ocrはPDFファイルを直接読み取れますか?
アプリでは直接読み取れます。PDFをドロップすると、OCRの前に各ページが自動的にPNGへレンダリングされるので、ページを手で分割する必要はありません。一方、公開APIとOCRエンジン自体はラスター画像(JPEG、PNG、GIF、BMP、TIFF、WebP)を受け付けます。そのため、APIを直接呼び出す場合は、先に各ページを画像として書き出してください。いずれの場合も、値がフィールドとして抽出されてしまえば、Excelが開けるCSVへの書き出しはワンクリックです。
書き出したCSVは、日本語や中国語のテキストでもExcelで正しく開けますか?
はい。CSVエクスポートはBOM(バイトオーダーマーク)付きのUTF-8でエンコードされており、これはまさにExcelがエンコーディングを自動判別するために必要なものです。CJKやアクセント付きの文字も、ダブルクリックするだけで正しい列に収まり、テキストファイルウィザードを実行する必要はありません。
請求書の明細行を、それぞれ別の行になるようにするにはどうすればいいですか?
子列を持つarrayフィールドを宣言します(例:description、unit_price、qty)。ページ上で繰り返される各行がそれぞれのサブ行になり、書き出し時にarrayは`column.child`というヘッダーへ展開されるので、Excelで行がきちんと合計されます。
Excelに取り込む前に、抽出が正確だったかを確認するにはどうすればいいですか?
値には読み取り元の出典座標が付くので、フィールドにマウスを乗せると、元のスキャンのどこから読まれたかがハイライトされます。印字との突合が合わなかった値や、出典領域を特定できなかった値(nobox)は、理由とともに data.review.flagged に列挙され、アプリ上でも同じ値が検討対象として表示されます。書き出す前は、シート全体を読み直すのではなくこの一覧を確認してください。セルの verified は、何かフラグが立った時点で false になります。
関連記事