コードを書かないSE日誌

SE歴26年。コードを書かずにClaude Codeで8体のAIエージェントチームを動かしています。AIエージェント・自動化・GTDの実験日誌。

2012年に自炊した本23冊が全文検索できるようになった——EvernoteのスキャンPDFをGoogle Drive OCRで掘り起こした話

「GTDストレスフリーの仕事術」で検索してヒットした。しかし中身を開くと、タイトルとタグのみ。本文はない。

前の記事でENEX+yarleでEvernoteのテキストノートをGrepできるようにしたが、スキャンして保存していたPDFには本文テキストが存在しなかった。yarleはEvernoteのテキストをMarkdown化するツールで、画像からテキストを起こすOCR機能は持っていない。

「このPDF群にもOCRをかけられないか」——その答えが、意外なところにあった。


.resources/ に眠っていた34件

yarle変換後のフォルダを見ると、.resources/ というサブディレクトリにPDFファイルが格納されていた。自炊ノートブックに23件、クルマノートブックに14件(重複bundle2件スキップ)、合計34件のPDFがGrepの届かない場所に眠っていた。

中身を見ると、こんなファイルが入っていた。

  • 自炊本: 「ひとつ上のGTD」「ようこそ断捨離へ」「ライフハッカー日本版」「リファクタリング・ウェットウェア」など
  • フォレスター取扱説明書・アイサイト説明書・車検証・注文書
  • ETCマイレージ領収書 6件(2014年)
  • VWバス検討資料

ETCの領収書まで保存していたのか、という驚きはあった。ライフログブームの2012〜2013年ごろ、「なんでも記録しよう」と思っていた時期の産物だ。


Google Drive MCPをOCRエンジンとして使う

「PDFにOCRかけられるの?」と聞いたら、Claude Codeが「Google Drive MCPの convertPdfToGoogleDoc を使えばOCRできる」と提案してきた。

Google Driveにアップロードしてドキュメント変換すると、その過程でGoogleのOCRエンジンが走る。Google DriveはPDFをGoogleドキュメントに変換する際にOCRを行う機能を公式に提供しており、これをローカルのテキスト取得に活用する。ファイル管理ツールとして使うのではなく、OCRエンジンとして使う発想だ。

実際のフローは4ステップだった。

  1. uploadFile — ローカルのPDFをGoogle Driveにアップロード
  2. convertPdfToGoogleDoc — Google ドキュメントに変換(ここでOCRが走る)
  3. downloadFileexportMimeType: text/plain)— テキストとしてローカルに保存(*_ocr.txt
  4. deleteItem — Google DriveのPDF・Docを両方ゴミ箱へ

アップロードして削除するフローは一見手間に見えるが、未処理PDFを検出するスクリプト(ocr-list-unprocessed.sh)と処理ログ記録スクリプト(ocr-post-process.sh)をClaude Codeに作ってもらい、34件を一気に処理した。スクリプト化してしまえば、追加PDFが出てきても同じフローで回せる。


処理結果——正直な整理

うまくいったケース

サイズの大きいOCRファイルを見ると、数十KB〜170KB超のテキストが取れていた。日本語スキャンPDFに対してGoogleのOCRが実用的に機能している。

「ETC マイレージ」で検索したら、2014年の領収書6件がヒットした。金額・日付・ETCカード番号まで全部テキストで出てくる。10年前の日常ドキュメントが突然検索可能になる体験は、技術記事の文脈を超えた驚きがあった。

失敗したケース

実測で確認した最小のファイルはこうなっていた。

  • LESS_IS_MORE_〜_ocr.txt: 321バイト(実測)
  • ライフハッカー_日本版_ocr.txt: 404バイト(実測)

テキストを開いてみると、タイトルらしき断片が数行あるだけで本文はほぼ空だった。スキャン品質が低いPDFはGoogleのOCRでも限界がある。2冊は引き続き「検索できない本」のままだ。失敗ケースがどのくらい出るかは元のPDFの品質次第で、今回の34件では2件が実質空になった。


制約を正直に書く

「Grepしたら、PDFはリンクされて開けるのか?」と確認した。

結論から言うと、OCRテキストにPDFへのリンクはない。ただし *_ocr.txt.resources/*.pdf のファイル名が対応しているので、Grepでヒットしたあと手動でたどれる。ファイル名から元PDFを探して、PDFリーダーで開いて内容を確認する、という流れになる。

ページ番号もわからない。Google DriveがエクスポートするPlainテキストにはページ区切り情報がなく(python3で実測確認済み)、ヒットしたキーワードが元PDFの何ページにあるかを直接知る方法がない。PDFを開いてCtrl+Fで再検索するしかない。

「完全な全文検索」ではなく「どのPDFに含まれているかわかる」レベルの話だ。それでも「34件中どれかにある」と絞れるのと、全くわからないのとでは大違いだった。


まとめ: ENEX+yarle+Google Drive OCRで「アーカイブの完全検索体制」

前の記事で構築したENEX+yarle+Grepの体制に、Google Drive OCRを足した形になった。

対象 手段 状態
テキストノート ENEX+yarle+Grep 全文検索可能
スキャンPDF Google Drive OCR+Grep 大半は全文検索可能(スキャン品質次第)

Claude Codeに「Google Drive MCPを使ってOCRして」と日本語で指示した。スクリプトの作成も含めて、私がやったのは指示と確認だけだ。

「2014年のETCマイレージ領収書」がGrepでヒットしたとき、これはもう過去のアーカイブではなくなったと思った。眠っていたファイルを掘り起こして、現在の検索環境に繋げることができた。


参考書籍・関連リンク

Claude Codeをもっと活用したい方に。

Claude CodeによるAI駆動開発入門(平川 知秀)

実践Claude Code入門――現場で活用するためのAIコーディングの思考法(西見 公宏・吉田 真吾・大嶋 勇樹)

Claude Codeでエージェントチームを作る実践について本にまとめました。

コードを書けない私が、AIに「チーム」を持たせるまで(Zenn Book)

※本記事にはアフィリエイトリンクが含まれます。