このファイルと同じディレクトリにある pdfread.py ツールを使ってPDFを読み取ります。次のいずれかの方法で実行できます。
- uv 0.11以上(推奨):
pdfread.pyを直接呼び出します。シバン行がuv run経由で実行し、初回起動時に依存関係をダウンロードするため、1分程度かかることがあります。 - uv なし:
python3 pdfread.py ...で、pymupdf4llm>=0.0.17がインストールされた任意のPython 3.10以上で動作します(pip install pymupdf4llm)。
search コマンドはFTS5が有効なSQLiteを必要とします。uv管理下のPythonや、最新のシステムPythonのほとんどに含まれており、ない場合はスクリプトが明確にエラーを表示します。
pdfread.py --help で全使用法を確認できます。簡単に説明すると:
pdfread.py info FILE— ページ数、メタデータ、アウトライン/目次。まずはここから。pdfread.py search FILE "用語"— キーワードが含まれるページを、BM25順にスニペット付きで表示。初回の検索ではキャッシュインデックスを構築(数秒)、以降は即時。用語はAND結合、term*で前方一致、--rawでFTS5全構文("完全一致"、OR、NEAR)を利用可能。テキストレイヤーのみ対応 — スキャンページは検索対象外。pdfread.py text FILE --pages 10-25— 1始まりのページ範囲をMarkdownテキストに変換。図は[image: p12-img2 640x480px]のようなプレースホルダとして表示。pdfread.py image FILE p12-img2— その図をPNGファイルとして書き出し、パスを表示します。ファイル読み取りツールで確認できます。pdfread.py images FILE --pages 12— 指定ページの図ID一覧を表示。pdfread.py render FILE 7— ページ全体(または--rect x0,y0,x1,y1で領域指定)をPNGにレンダリング。スキャンページやテキストレイヤーで取得できないものの代替手段。
大規模PDFでのコンテキスト維持
ピンポイントな質問(「契約書のどこに解約手数料の記載があるか?」)には、まず search を実行し、該当ページだけを text --pages で読み取ります — サブエージェントへの分配は不要です。インデックスキャッシュは共有されるため、サブエージェントも再構築なしで search できます。
広範な情報を合成する場合、文書全体をメイン会話にダンプしないでください。代わりに:
infoでページ数とアウトラインを取得し、文書を適切な範囲(章ごと、または15~25ページごと)に区切ります。- 範囲ごとにサブエージェントを起動し、次のような指示を与えます。「
<パス>/pdfread.py text <ファイル> --pages 10-25を実行し、<ユーザーの質問> に答える/最大N語で要約してください。[image: ...]プレースホルダが関連する場合は、imageコマンドで画像を抽出して確認してください。」 - メイン会話には要約/回答だけを残し、それらから全体を合成します。サブエージェントの要約が答えの存在を示す場合のみ、自分で該当ページを直接参照します。
注意事項
- OCR機能はありません。テキストレイヤーのないページは、全ページ分の
[image: ...]プレースホルダ(または「抽出可能テキストなし」のメモ)として返されます。その場合はrenderで画像を抽出して視覚的に読み取ってください。 - 抽出は決定論的です。画像IDは実行間で安定しているため、サブエージェントが報告したIDを後でメイン会話から抽出できます。