【AI駆動開発】100ページ超のPDFをMarkdownに変換してAIに読ませる方法
はじめに
最近、大規模システムの引き継ぎ案件を受けました。
その案件はAI駆動の進め方が許可されていたので早速AIを利用して、引き継ぎどんどん進めていくぞ!
と思ったのですが、いくつか困ったことがありました。
そう、資料のほとんどがエクセルで構成されているのと、外部API仕様書のほとんどが100P以上あるPDFデータになっていました。
AIを利用する上で、エクセルなどはもちろんのこと、重厚長大なPDF資料を読み取ることも苦手でございます。
なので、各種ファイルをAIが読みやすい資料にするべく、マークダウンの形式に書き換えていく必要があります。
今回はその中でもPDFをマークダウンに変換する処理についてを紹介できればと思います。
この記事の最後に「ワークフロー」と「Pythonスクリプト」を載せています。
AntigravityやCursorをお使いの方は、それをコピペしてAIに「これでPDFを変換して」と伝えるだけで、あとはAIが勝手にやってくれます。人間がやることは、コーヒーを飲みながら進捗を眺めることくらいです☕
なぜPDFをそのままAIに渡せないのか?
「PDFをそのままアップロードすればいいじゃん」
...と思うじゃないですか。僕もそう思ってました。でも実際にやってみると、色々と辛いことが起きます。
問題点
| 問題 | 詳細 |
|---|---|
| トークン消費が激しい | 100ページ超のPDFをそのまま渡すと、コンテキストウィンドウを圧迫。「途中で切れちゃいました」が頻発 |
| 構造が失われる | 表やレイアウトがフラットなテキストになり、「この数値は何の列?」状態に |
| 検索・参照が困難 | 「この仕様はどこ?」と聞いても、AIが「たぶんこの辺...」みたいな曖昧な回答をしがち |
| 差分管理ができない | 仕様が更新されても、どこが変わったのかGitで追えない |
解決策:Markdownに変換する
そこで考えたのが、PDFを一度「画像」に変換して、AIに「視覚的に読ませて」Markdownとして書き起こさせるというアプローチです。
Markdownに変換することで:
- ✅ 構造化された情報として保持(見出し、表、箇条書き)
- ✅ Gitで差分管理が可能(「あ、ここ変わったんだ」が一目瞭然)
- ✅ AIが効率的に読み取れる形式に
人間にとっても、AIにとっても、幸せな形式。それがMarkdownです。
変換の全体像
今回のアプローチはこうです:
PDF → 画像(ページごと) → AI精読 → Markdown
「なぜ画像を経由するの?」と思うかもしれません。
理由は単純で、AIは画像を「見る」ことができるからです。PDFのテキスト抽出だと崩れてしまう表やレイアウトも、画像として渡せば「見たまま」を理解してくれます。人間と同じですね。
Step 1: PDFを画像に変換する
まずはPDFを1ページずつの画像ファイル(PNG)に変換します。
事前準備
# Pythonライブラリのインストール
pip install pdf2image Pillow
pdf2imageは内部でpopplerというツールを使うので、OSに合わせてインストールしてください:
macOS:
brew install poppler
Windows:
poppler for Windows からダウンロードして、PATHを通す
Linux:
sudo apt-get install poppler-utils
変換スクリプト
以下のスクリプトをpdf_to_images.pyとして保存します:
#!/usr/bin/env python3
"""
PDF to Images Converter
PDFファイルを各ページの画像ファイルに変換するスクリプト
"""
from pdf2image import convert_from_path
import os
import sys
def pdf_to_images(pdf_path, output_dir=None, dpi=150):
"""
PDFを画像に変換
Args:
pdf_path: PDFファイルのパス
output_dir: 出力先ディレクトリ(省略時はPDFと同名のフォルダ)
dpi: 解像度(デフォルト150)
"""
if output_dir is None:
output_dir = os.path.splitext(pdf_path)[0]
os.makedirs(output_dir, exist_ok=True)
print(f"Converting: {pdf_path}")
print(f"Output dir: {output_dir}")
print("-" * 40)
images = convert_from_path(pdf_path, dpi=dpi)
for i, image in enumerate(images, 1):
image_path = os.path.join(output_dir, f"page_{i:03d}.png")
image.save(image_path, "PNG")
print(f"[{i}/{len(images)}] Saved: {image_path}")
print("-" * 40)
print(f"Done! {len(images)} pages converted.")
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Usage: python pdf_to_images.py <pdf_path>")
sys.exit(1)
pdf_to_images(sys.argv[1])
使い方
python pdf_to_images.py api_spec.pdf
これでapi_spec/page_001.png 〜 page_XXX.pngが生成されます。
199ページのPDFでも、だいたい2分くらいで完了します。コーヒーを淹れる時間もありません。
Step 2: AIに画像を「精読」させてMarkdownに変換
ここからがAI駆動の本領発揮です。
Antigravity(またはCursor)を起動して、こう伝えます:
api_spec/のpage_001.png〜page_020.pngを精読して、Markdownに変換して
するとAIが画像を1枚ずつ読み取り、構造化されたMarkdownに変換してくれます。
Step 3: 段階的に全ページを変換
100ページ超のPDFを一度に変換するのは現実的ではありません。
AIのコンテキストにも限界がありますし、途中でミスがあった場合に手戻りが大きくなります。
そこで、10〜20ページ単位で段階的に変換していきます:
セッション1: p1-20を変換(今日の仕事)
セッション2: p21-40を変換(明日の仕事)
セッション3: p41-60を変換(明後日の仕事)
...
進捗管理用の[task.md]なんかを用意しておくと、どこまでやったか忘れません:
こんな感じのやつです
# API仕様書変換タスク
## 進捗
- [x] p1-20: 認証・ユーザー管理
- [x] p21-40: 商品API
- [ ] p41-60: 注文API(次回ここから)
- [ ] p61-80: 決済API
- [ ] p81-100: エラーコード一覧
実例:経産省の調査報告書199ページをMarkdown化してみた
今回、実際に変換してみたのはこちらのPDFです:
令和2年度 中小企業のAI活用促進に関する調査事業 最終報告書(経済産業省)
- 全199ページ
- 表・グラフ・図が多数
- AI導入の経済効果推計など、数値データが豊富
変換前(PDF p.7)
こんな感じのページです。棒グラフと表が混在した複雑なレイアウト:

「実際に、中小企業におけるAI導入インパクトとして、2025年までに経済効果11兆円・労働人口効果160万人相当を最大で推計」
グラフには業界別のインパクト推計、右側には2022年→2025年の比較表...
人間でも読み取りに時間がかかりそうなページです。
変換後(Markdown)
AIに精読させた結果がこちら:
## 実際に、中小企業におけるAI導入インパクトとして、2025年までに経済効果11兆円・労働人口効果160万人相当を最大で推計
### AI導入領域×業界毎の中小企業における経済効果推計
**対象**: 2025年; 4業界(製造、建設、卸・小売、サービス業の合計。その他業界除く)
**グラフの見方**:
- 面積は経済効果額(兆円)の比率
- 横軸: 領域毎の比率
- 縦軸: 同一領域内での業界毎の比率
#### 業界別の構成(縦軸)
| 業界 | 色 |
|---|---|
| 建設業 | 濃い青 |
| サービス業 | 青 |
| 卸・小売 | 水色 |
| 製造業 | 薄い水色 |
#### 課題に対応するAI導入領域(横軸: 1〜19)
| # | 領域 |
|---|---|
| 1 | 予知保全 |
| 2 | 需要予測 |
| 3 | 経理関連業務効率化 |
| 4 | データマーケティング |
| 5 | 不良品所・自動検出 |
| 6 | 企業間商談の効率化 |
| 7 | 人事業務・最適化 |
| 8 | 調達の効率化 |
| 9 | 棚割り・店舗レイアウト最適化 |
| 10 | 経費精算・給与支払い・業務自動化 |
| 11〜19 | (その他領域) |
---
### AI導入インパクト推計
**4業界にその他業界を加えた全業界**
| 指標 | 2022年 | 2025年 |
|---|---|---|
| **経済効果** | 2兆円 | **11兆円** |
| **労働人口効果** | 29万人 | **157万人** |
> ※人件費算出化による経済効果を含む。1人当たり年間給与350万円(例:給与、福利厚生)で除算して算出
---
### 注釈
1. 経営戦略、人事、財務、調達、製造、販売等、企業のバリューチェーンにおける30の課題領域を特定。そのうち、現在AIを活用することで対応し得る領域を19領域に厳選
2. 4業界(製造、建設、卸・小売、サービス)における試算。製造(IS)コード+金融業含む、他:サービスセクト提供引き上事業者含む、製造(17):小規模事業者除く、製造:製造工程施設
ちゃんと表になってる!
さらに注目してほしいのは:
- グラフの凡例が表として整理された → 色と業界の対応が一目瞭然
- 横軸の19領域がリスト化された → 「予知保全って何番目?」がCtrl+Fで即検索可能に
- 注釈まで抽出されている → 小さい文字の脚注も見落とさない
- グラフの「読み方」も言語化された → 「面積が経済効果の比率」という情報が明示的に
元のPDFだと「棒グラフをじっくり見て、凡例を確認して...」という作業が必要でしたが、Markdownならテキスト検索で一発です。
もう一つの例:19のAI導入領域(PDF p.8)
元のPDFでは箇条書きと番号付きリストが混在していましたが、AIがきれいに整理してくれました:

## 19のAI導入領域を特定
俯瞰的な事業の課題リストから中小企業ヒアリング・サーベイや業界エキスパートインタビュー・関係者との議論を通じ、中小企業課題に対応する**19のAI導入領域を特定**。
### 企業の課題に対するAI導入領域(19領域)
| # | 領域 |
|---|---|
| 1 | 機械・施設へのセンサー取付けによる予知保全を通じた逸失利益・保全費用の最小化 |
| 2 | 売上実績等の社内データ・気候等の外部データの分析による需要予測・在庫最適化を通じた業務効率化・人件費の削減 |
| 3 | 文字認識(AI-OCR)・RPAによる受注、請求・支払等の経理関連業務効率化 |
| 4 | 人事データのシフティング・パターン分析データ解析と適切な配置による人件費削減・売上増加 |
| 5 | 画像認識による不良品判断自動検出による検品作業効率化 |
| ... | (以下省略) |
19項目すべてがテーブル形式で整理され、Ctrl+Fで「予知保全」と検索すれば一発でヒットします。
実際にやってみた結果
Before
- PDF 199ページ
- AI単体では全体把握が困難
- 「この数値どこにある?」→ 人力で探すハメに
After
- Markdown 667行(約41KB)
- 構造化されたテーブル・見出し
- Ctrl+Fで一発検索
- Gitで差分管理可能
所要時間
| フェーズ | 時間 |
|---|---|
| PDF→画像変換 | 約2分 |
| 主要部分(p1-50)の変換 | 約15分 |
| 参考資料部分(p51-199) | 段階的に実施中 |
正直、人間が手作業でやったら丸一日かかる作業が、1時間もかからず終わります。
空いた時間で別の仕事ができる。これぞAI駆動開発の醍醐味。
まとめ
| 項目 | 内容 |
|---|---|
| 課題 | 大量のPDF資料をAIで扱いたい |
| 解決策 | PDF → 画像 → AI精読 → Markdown |
| ポイント | 10-20ページ単位で段階的に変換 |
| 効率化 | ワークフロー化して再利用可能に |
重厚長大なPDF資料も、Markdownに変換することでAI駆動開発の土台として活用できるようになります。
引き継ぎ案件や新規参画時に「資料がPDFばかりで辛い...」という方は、ぜひ試してみてください!
付録:コピペで使えるワークフロー
以下のワークフローをAntigravityやCursorに渡せば、あとはAIが勝手にやってくれます。
使い方:
- このワークフローをコピー
- AIに「このワークフローに従って、
{フォルダ名}のPDFをMarkdownに変換して」と伝える - ☕コーヒーを飲みながら待つ
# PDF完全Markdown変換ワークフロー
## 概要
PDFから変換された連番画像ファイル(page_001.png〜)を精読し、AI可読なMarkdownドキュメントに完全変換する。
## 前提条件
- PDFが画像に変換済み
- 画像ファイルが `{フォルダ名}/page_001.png` 〜 `page_XXX.png` の形式で存在
---
## ステップ1: 対象ファイルの確認
1. ユーザーに以下を確認する:
- **対象フォルダ**: 画像が格納されているフォルダパス
- **変換範囲**: 開始ページ〜終了ページ(例: p56-70)
- **出力先.mdファイル**: 既存ファイルに追記 or 新規作成
2. フォルダ内の画像ファイル数を確認
ls {フォルダパス}/page_*.png | wc -l
---
## ステップ2: ページ精読(10-20ページ単位)
1. 指定範囲のページ画像を順番に確認
- 1回に5ページ程度を並行して読み込み可能
2. 各ページの内容を把握:
- **テキスト**: 見出し、本文、箇条書き
- **表**: 行・列構造、ヘッダー、データ
- **図・イラスト**: 図の意味・内容
- **引用・コメント**: ヒアリング結果など
---
## ステップ3: Markdownに変換
### 変換ルール
| 元の形式 | Markdown形式 |
|---|---|
| 大見出し | `# 見出し` または `## 見出し` |
| 中見出し | `### 見出し` |
| 箇条書き | `- 項目` または `1. 項目` |
| 表 | Markdownテーブル形式 |
| 図・イラスト | 説明テキスト(図の内容を文章で再現) |
| 引用・コメント | `> 引用テキスト` |
| 強調 | `**太字**` |
### 変換時の注意点
- 表の列数を揃える(`|---|---|---|`)
- 図は「【図】〇〇の概念図」などで明示し、内容を説明
- ページ番号を適宜記載(`(p.XX)`)
---
## ステップ4: .mdファイルに追記
1. 既存の.mdファイルの末尾に変換内容を追加
2. または新規.mdファイルを作成
---
## ステップ5: 進捗管理(task.md更新)
1. タスク管理ファイル(task.md)が存在する場合は更新
2. 変換完了した範囲にチェックを付ける
---
## ステップ6: 完了報告
1. 変換したページ範囲を報告
2. 追加した内容のサマリーを提示
3. 次に変換すべき範囲を提案
---
## 所要時間の目安
| ページ数 | 所要時間 | 備考 |
|---|---|---|
| 10ページ | 5-10分 | 図表中心(文字少なめ) |
| 20ページ | 10-20分 | 詳細説明あり(文字多め) |
| 50ページ | 30-60分 | 複数セッションに分割推奨 |
---
## 品質チェックポイント
- [ ] 表の列が正しく揃っているか
- [ ] 見出し階層が適切か
- [ ] 図の内容が説明されているか
- [ ] ページ番号の対応が明確か
- [ ] 誤字・脱字がないか