【Python×Docker】Gemini APIでPDF伝票を無料でOCR&JSONデータ化してみた!【初心者向け】

Gemini APIで請求書をJSONデータに自動抽出するイメージ プログラミング

はじめに

「紙の伝票やPDFの請求書を手入力で入力するのがめんどくさい…」 「OCRを使って自動でデータ化したいけれど、有料サービスはハードルが高い…」

そんな悩みはありませんか?

今回は、Googleが提供するGemini APIを使って、PDFの伝票を読み込んでJSONフォーマットとして自動抽出するシステムをサクッと作ってみました!

しかも、モデルにgemini-3.5-flash-liteを使用すれば、無料枠の範囲内で試すことができます! 開発環境の構築もDockerを使って手軽に整えていきますので、初心者の方もぜひチャレンジしてみてください。

⚠️ 開発・導入時の重要な注意点(プライバシー・セキュリティ)

Gemini APIを使って伝票や請求書などのドキュメントを処理する際は、データの取り扱いとプライバシーポリシーに十分注意してください。

1. 無料枠(Free Tier)でのデータ利用について

Google AI Studioの無料枠(Free Tier)を利用する場合、送信したプロンプトやアップロードしたファイル(PDF)の内容は、Googleのサービス向上やモデルの学習データとして使用される可能性があります(※人間のレビューワーによって確認される場合もあります)。

  • 対応策: 個人情報(顧客名・住所・電話番号など)や、社外秘・機密情報が含まれる本物の伝票は絶対に入力しないでください。テストを行う際は、マスキング(黒塗り)するか、ダミーのテスト用PDFを使用しましょう。

2. 商用利用や本番運用時の対応

実際の業務や顧客の個人情報・取引データを扱うシステムとして構築する場合は、以下の対策を強く推奨します。

  • 有料枠(Pay-as-you-go)へ移行する
    Google Cloudアカウントで課金設定(Pay-as-you-go)を有効にすると、プライバシーポリシーが切り替わり、送信データがモデルの学習に使用されない仕様になります。
  • Vertex AI(Google Cloud)の利用
    より厳格なセキュリティ要件(Enterpriseレベルのガバナンスやデータ保存場所の指定など)が必要な場合は、Google Cloudの「Vertex AI」経由でGeminiモデルを利用することをご検討ください。

個人開発やテスト検証(無料枠)で試す場合は、必ず「ダミーデータ」を使って安全に実験しましょう!

今回作るシステムの概要

完成イメージはこんな感じです!

  1. PDFの伝票ファイルを用意する
  2. DockerコンテナでPythonプログラムを動かす
  3. Gemini APIにPDFをそのまま送信
  4. 日付・金額・明細などの欲しいデータがきれいなJSON形式で出力される!
[ PDF伝票 ]  --->  [ Docker / Python (Gemini API) ]  --->  [ 構造化JSONデータ ]

準備するもの

  • Google AI Studio の APIキー(無料で取得できます)
  • WSL2上のDocker環境、またはDocker Desktop
  • テスト用のPDF伝票

Google AI StudioでAPIキーを取得する手順

Gemini APIを利用するには、まず「APIキー」というパスワードのようなものを取得する必要があります。数分で簡単に無料で発行できます!

Google AI Studioにアクセス

Google AI Studio にアクセスし、お使いのGoogleアカウントでログインします。

「Get API key」を選択

画面左側のメニューの下の方にある鍵のアイコン「Get API key」 ボタンをクリックします。

Gemini-API-Keyを取得するページへのアクセスボタンのスクリーンショット

キーを作成する

  1. 画面右上のほうにある「Create API key」 をクリックします。
  2. プロジェクトを選択する画面が表示された場合は、「Create API key in new project(新しいプロジェクトで作成)」を選択します。
  3. 数秒でAPIキーが生成されるので、表示された文字列をコピーしておきます。

💡 ポイント
無料枠(Free Tier)で利用できるため、クレジットカード等の登録なしでそのまま試すことができます!

Gemini APIのモデルのレート制限

GeminiAPIのモデル別レート制限ページの一覧表のスクリーンショット
  • Gemini 3.6 Flash
    • 制限: RPM: 5 / TPM: 250K / RPD: 20
    • 特徴: 速度と精度のバランスに優れた標準~最新の高速モデルです。無料枠では1分間5回、1日20回(RPD: 20)までと厳しめに制限されています。
  • Gemini 3.5 Flash Lite
    • 制限: RPM: 15 / TPM: 250K / RPD: 500
    • 特徴: Flashをさらに軽量・高速化したモデルです。処理精度はわずかに落ちますが、1分間15回、1日500回まで呼び出せるため、大量のテキスト処理や頻繁なチャット応答に向いています。

ディレクトリ構造

作業用フォルダを作成し、以下の4つのファイルを準備します。

gemini-pdf-ocr/
├── Dockerfile
├── requirements.txt
├── app.py
└── invoice.pdf  (テスト用の伝票PDF)

各コードの解説

1. 必要なライブラリの指定 (requirements.txt)

Geminiの最新SDK(google-genai)と、出力フォーマットを定義するためのpydanticを使用します。

google-genai>=0.1.0
pydantic>=2.0

2. メインのPythonプログラム (app.py)

Pydanticを使って「取り出したいデータ構造(JSONの型)」をあらかじめ定義するのがポイントです。

Pydantic(パイダンティック)とは、Pythonで「データの型チェック」や「データの自動変換(バリデーション)」を簡単かつ高速に行うための超人気ライブラリです。

Pythonは本来、変数の型を厳密にチェックしない「動的型付け言語」ですが、Pydanticを使うことで「指定した型やフォーマット通りのデータになっているか」を厳密に保証できるようになります。

Gemini APIとPydantic SchemaによるJSON構造化出力のイメージ

これにより、AIの回答がブレずに綺麗なJSONで返ってきます。

import os
import sys
from typing import List, Optional
from google import genai
from google.genai import types
from pydantic import BaseModel, Field

# 1. 抽出したい伝票データの構造を定義
class ItemDetail(BaseModel):
    item_name: str = Field(description="品名・項目名")
    quantity: Optional[int] = Field(None, description="数量")
    unit_price: Optional[int] = Field(None, description="単価(円)")
    amount: Optional[int] = Field(None, description="金額(円)")

class InvoiceSummary(BaseModel):
    invoice_number: Optional[str] = Field(None, description="伝票番号・請求書番号")
    issue_date: Optional[str] = Field(None, description="発行日(YYYY-MM-DD形式)")
    company_name: Optional[str] = Field(None, description="発行元企業名・取引先名")
    total_amount: int = Field(..., description="合計金額(税込)")
    tax_amount: Optional[int] = Field(None, description="消費税額")
    items: List[ItemDetail] = Field(default_factory=list, description="明細項目一覧")
    summary: str = Field(..., description="この伝票の要約説明")

def extract_invoice_to_json(pdf_path: str):
    api_key = os.environ.get("GEMINI_API_KEY")
    if not api_key:
        print("エラー: GEMINI_API_KEY が設定されていません。")
        sys.exit(1)

    client = genai.Client(api_key=api_key)

    if not os.path.exists(pdf_path):
        print(f"エラー: {pdf_path} が見つかりません。")
        sys.exit(1)

    print(f"PDFファイル '{pdf_path}' を読み込んでいます...")
    
    # PDFファイルをGeminiにアップロード
    pdf_file = client.files.upload(file=pdf_path)

    try:
        prompt = "添付された伝票PDFから記載内容を読み取り、要約および指定スキーマに沿って項目を抽出してください。"

        # モデルには gemini-3.5-flash-lite を指定
        response = client.models.generate_content(
            model="gemini-3.5-flash-lite",
            contents=[pdf_file, prompt],
            config=types.GenerateContentConfig(
                response_mime_type="application/json",
                response_schema=InvoiceSummary,
                temperature=0.1, # 抽出精度を上げるため低めに設定
            ),
        )

        print("\n--- 抽出結果 (JSON) ---")
        print(response.text)

    finally:
        # アップロードした一時ファイルを削除
        client.files.delete(name=pdf_file.name)

if __name__ == "__main__":
    target_pdf = sys.argv[1] if len(sys.argv) > 1 else "invoice.pdf"
    extract_invoice_to_json(target_pdf)

3. Docker環境の構築 (Dockerfile)

Pythonの公式軽量イメージを使用してコンテナ化します。

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py .

ENTRYPOINT ["python", "app.py"]

実際に動かしてみよう!

ステップ1:Dockerイメージのビルド

コマンドプロンプトやターミナルで作成したディレクトリに移動し、以下のコマンドを実行します。

docker build -t gemini-pdf-ocr .

ステップ2:コンテナの実行

取得したGemini APIキーを渡して、PDFファイルを読み込ませます。

docker run --rm \
  -e GEMINI_API_KEY="YOUR_GEMINI_API_KEY_HERE" \
  -v "$(pwd)":/app \
  gemini-pdf-ocr invoice.pdf

(※ WindowsのPowerShellをご利用の場合は “$(pwd)” を ${PWD} に変更してください)

実行結果

プログラムを実行すると、数秒で以下のような結果が得られます!

{
  "invoice_number": "DEN-2026-0042",
  "issue_date": "2026-09-20",
  "company_name": "〇〇建機サービス株式会社",
  "total_amount": 128000,
  "tax_amount": 11636,
  "items": [
    {
      "item_name": "油圧ホース交換作業",
      "quantity": 2,
      "unit_price": 40000,
      "amount": 80000
    },
    {
      "item_name": "出張点検費",
      "quantity": 1,
      "unit_price": 36000,
      "amount": 36000
    }
  ],
  "summary": "〇〇建機サービス株式会社からの伝票です。油圧ホース交換および出張点検費を含み、合計金額は128,000円です。"
}

表組みの明細や小計・合計もしっかり識別されて、プログラムでそのまま扱えるJSONデータとして出力されました!

使ってみて感じたポイント

  1. OCRライブラリ(Tesseractなど)の設定が不要
    従来のOCRだと文字認識の調整や前処理が大変でしたが、GeminiはマルチモーダルモデルなのでPDFをそのまま投げるだけで高精度に解釈してくれます。
  2. gemini-3.5-flash-lite が速くて優秀
    処理速度が速く、無料枠(Free Tier)で気軽にテスト・検証が行えるのが大きな魅力です。
  3. Pydanticによる構造化出力が便利
    response_schema を渡すことで、AI特有の「出力フォーマットが毎回変わってしまう」という課題をすっきり解決できます。

まとめ

今回は Gemini API と Docker を使って、PDF伝票の自動OCR&データ抽出を試してみました。

わずか数十分の作業でここまで高精度な抽出システムが作れるのは驚きですね! 生成されたJSONをそのままデータベースに保存したり、Webアプリのバックエンドに組み込んだりと応用範囲は非常に広そうです。

実行環境をGoogle Cloud Runにして起動するとさらに活用の幅が広がります。
ぜひ以下の記事も参考にしてください。

コメント