PDF 解析がこれほど簡単になった理由
業務で大量の PDF を扱う場面は少なくありません。契約書のレビュー、論文のサマリー作成、請求書からのデータ抽出など、手作業では時間がかかるタスクばかりです。
Gemini API のマルチモーダル機能を使えば、PDF ファイルをそのまま入力として渡し、テキスト抽出・要約・質問応答を数行の Python コードで実行できます。OCR や外部ライブラリを別途用意する必要はありません。Gemini がページの画像とテキストレイヤーの両方を理解し、コンテキストに基づいた正確な応答を返してくれます。
Gemini API の File API を使った PDF アップロードから、要約・情報抽出・Q&A まで、実際に動くコード例とともに順を追って進めます。
前提知識と環境準備
必要なもの
- Python 3.10 以上がインストール済みであること
- Google AI Studio の API キー(aistudio.google.com で無料取得可能)
- 解析したい PDF ファイル(サンプルとして任意の PDF を用意してください)
SDK のインストール
pip install google-genaiAPI キーの設定
import os
from google import genai
# 環境変数から API キーを読み込む(推奨)
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
# 確認
print("Gemini API クライアントの初期化に成功しました")環境変数は事前にターミナルで設定しておきます。
export GEMINI_API_KEY="YOUR_API_KEY"API キーの取得方法や初期設定について詳しく知りたい方は、Gemini API クイックスタートガイドを参照してください。
PDF ファイルを Gemini API にアップロードする
Gemini API で PDF を扱うには、まず File API を使ってファイルをアップロードします。アップロードされたファイルは一時的にサーバーに保存され、その後のプロンプトで参照できるようになります。
import os
from google import genai
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
# PDF ファイルをアップロード
pdf_file = client.files.upload(
file="report.pdf", # ローカルのPDFファイルパス
config={"display_name": "分析対象レポート"}
)
print(f"アップロード完了: {pdf_file.name}")
print(f"URI: {pdf_file.uri}")
print(f"状態: {pdf_file.state}")
# 期待する出力:
# アップロード完了: files/xxxxxxxxxxxx
# URI: https://generativelanguage.googleapis.com/v1beta/files/xxxxxxxxxxxx
# 状態: State.ACTIVEアップロードしたファイルは最大 48 時間サーバーに保持されます。保持期間を過ぎると自動的に削除されるため、必要に応じて再アップロードしてください。
大きな PDF を扱う場合のポイント
Gemini API は最大 2GB のファイルアップロードに対応しています。ただし、ページ数が多い PDF の場合はトークン消費量が増えるため、以下の点に注意してください。
- 100 ページ以下: そのままアップロードして問題ありません
- 100〜300 ページ: 必要なページ範囲を指定するプロンプトが効果的です
- 300 ページ超: PDF を分割してから処理することを推奨します
File API の詳細な使い方については、File API の完全ガイドも併せてご覧ください。
PDF の内容を要約する
アップロードした PDF を使って、最もよくある「要約」タスクを実行してみましょう。
import os
from google import genai
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
# PDF をアップロード
pdf_file = client.files.upload(file="report.pdf")
# 要約を生成
response = client.models.generate_content(
model="gemini-2.5-flash",
contents=[
pdf_file, # アップロード済みの PDF
"この PDF の内容を以下の形式で要約してください:\n"
"1. 概要(3行以内)\n"
"2. 主要なポイント(箇条書き5つ以内)\n"
"3. 結論\n"
"日本語で回答してください。"
]
)
print(response.text)
# 期待する出力(例):
# ## 概要
# 本レポートは2026年度のAI市場動向を分析し...
#
# ## 主要なポイント
# - 生成AI市場は前年比45%の成長...
# - マルチモーダルAIの採用が急速に拡大...
# ...プロンプトで出力形式を指定することで、毎回一貫した構造の要約を得られます。業務で繰り返し使う場合は、テンプレートとして保存しておくと便利です。
モデルの選び方
PDF 解析に適した Gemini モデルは用途によって異なります。
- Gemini 2.5 Flash: 処理速度が速く、コストも低い。日常的な要約や情報抽出に最適
- Gemini 2.5 Pro: より複雑な分析や長文 PDF の処理に適しています。契約書の条項比較など高精度が求められる場面向け
- Gemini 3.1 Pro: 最新のモデルで推論能力が大幅に向上。ARC-AGI-2 ベンチマークで 77.1% を達成しており、複雑なドキュメント分析に強い
PDF から特定の情報を抽出する
要約だけでなく、PDF から特定のデータを構造化して抽出することも可能です。請求書や報告書からのデータ抽出に特に威力を発揮します。
import os
import json
from google import genai
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
pdf_file = client.files.upload(file="invoice.pdf")
# 構造化データとして抽出
response = client.models.generate_content(
model="gemini-2.5-flash",
contents=[
pdf_file,
"この請求書から以下の情報を JSON 形式で抽出してください:\n"
"- company_name: 発行元の会社名\n"
"- invoice_number: 請求書番号\n"
"- date: 発行日\n"
"- total_amount: 合計金額\n"
"- items: 明細(品名、数量、単価、小計の配列)\n"
"JSON のみを返してください。"
],
config={
"response_mime_type": "application/json"
}
)
# JSON としてパース
data = json.loads(response.text)
print(json.dumps(data, ensure_ascii=False, indent=2))
# 期待する出力:
# {
# "company_name": "株式会社サンプル",
# "invoice_number": "INV-2026-0342",
# "date": "2026-03-15",
# "total_amount": "¥158,400",
# "items": [
# {
# "name": "コンサルティング費用",
# "quantity": 1,
# "unit_price": "¥120,000",
# "subtotal": "¥120,000"
# }
# ]
# }response_mime_type に application/json を指定すると、Gemini は必ず有効な JSON を返します。後続の処理でパースエラーが発生するリスクを大幅に減らせる、実務で非常に重宝するテクニックです。
PDF に対して質問応答(Q&A)を行う
PDF の内容について自然言語で質問し、回答を得ることもできます。マニュアルや仕様書の内容を素早く確認したいときに便利です。
import os
from google import genai
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
pdf_file = client.files.upload(file="user_manual.pdf")
# 質問を投げる
questions = [
"このマニュアルに記載されている対応OSは何ですか?",
"初期設定の手順を簡潔に教えてください。",
"トラブルシューティングで最も多い問題は何ですか?"
]
for q in questions:
response = client.models.generate_content(
model="gemini-2.5-flash",
contents=[pdf_file, q]
)
print(f"Q: {q}")
print(f"A: {response.text}\n")
# 期待する出力:
# Q: このマニュアルに記載されている対応OSは何ですか?
# A: 本マニュアルに記載されている対応OSは、Windows 11、macOS 14以降、
# Ubuntu 22.04 LTS です。
#
# Q: 初期設定の手順を簡潔に教えてください。
# A: 1. アプリケーションをダウンロード...一度アップロードした PDF は同じセッション内で繰り返し参照できるため、複数の質問を効率よく処理できます。
複数の PDF を一括で処理する
実務では複数の PDF を一括処理するケースも多いでしょう。以下は、フォルダ内の PDF をまとめて要約するスクリプトの例です。
import os
import glob
from google import genai
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
# フォルダ内の PDF を一括アップロード
pdf_dir = "./documents/"
pdf_paths = glob.glob(os.path.join(pdf_dir, "*.pdf"))
results = []
for path in pdf_paths:
filename = os.path.basename(path)
print(f"処理中: {filename}")
# アップロード
pdf_file = client.files.upload(file=path)
# 要約を生成
response = client.models.generate_content(
model="gemini-2.5-flash",
contents=[
pdf_file,
"この PDF の内容を100文字以内で要約してください。日本語で回答してください。"
]
)
results.append({
"filename": filename,
"summary": response.text
})
print(f" → {response.text[:80]}...\n")
# 結果を表示
print("=" * 60)
print(f"合計 {len(results)} 件の PDF を処理しました")
for r in results:
print(f"\n📄 {r['filename']}")
print(f" {r['summary']}")大量のファイルを処理する場合は、API のレート制限に注意してください。1 分あたりのリクエスト数には上限があるため、time.sleep() で適切な間隔を設けるとよいでしょう。大規模なバッチ処理には Gemini Batch Processing API の活用も検討してみてください。
よくあるエラーと対処法
ファイルサイズに関するエラー
File API のアップロード上限は 2GB ですが、処理可能なトークン数にも制限があります。ページ数が非常に多い PDF では「トークン上限超過」のエラーが返ることがあります。その場合は PDF を分割するか、処理対象のページを絞りましょう。
スキャン PDF(画像のみ)の扱い
テキストレイヤーがないスキャン PDF でも、Gemini はマルチモーダル機能で画像として解析できます。ただし、解像度が低い画像や手書き文字の認識精度は下がる場合があります。スキャン品質が低い場合は、事前に画像の解像度を上げる前処理を行うと精度が向上します。
「File not found」エラー
アップロード後 48 時間を過ぎるとファイルが自動削除されます。長時間実行するバッチ処理では、処理直前に再アップロードする設計にしておくと安心です。
まとめ
Gemini API を使った PDF 解析は、File API にファイルをアップロードし、プロンプトを送るだけというシンプルな手順で始められます。OCR ライブラリや複雑な前処理は不要で、テキスト抽出・要約・構造化データの抽出・Q&A まで幅広いタスクに対応できます。
まずは手元にある PDF で試してみてください。数行のコードで得られる結果に驚くはずです。さらに実践的なテクニック(表の高精度抽出、契約書の自動審査、複数ドキュメントの横断分析など)を学びたい方には、Gemini マルチモーダルドキュメント処理 高度ガイドもおすすめです。