[{"data":1,"prerenderedAt":315},["ShallowReactive",2],{"content-/yomitoku-book-pdf-to-markdown-db":3,"all-pages-for-dir":313,"og-image-/yomitoku-book-pdf-to-markdown-db":314},{"id":4,"title":5,"body":6,"category":297,"description":298,"extension":299,"meta":300,"navigation":265,"ogImage":301,"path":302,"project_name":21,"published":303,"publishedAt":304,"seo":305,"stem":306,"tags":307,"todo":301,"unpublished":303,"updatedAt":301,"__hash__":312},"pages/2026-05/2026-05-10/yomitoku-book-pdf-to-markdown-db.md","yomitokuで書籍PDFをMarkdown化してTurso DBに格納する：日本語特化AI OCRで蔵書を全文検索可能にする",{"type":7,"value":8,"toc":280},"minimark",[9,14,27,35,38,47,66,69,72,77,84,87,91,98,102,107,110,123,126,130,133,138,141,149,158,168,171,175,181,184,188,191,197,203,206,230,234,237,248,251,254],[10,11,13],"h2",{"id":12},"自分の本棚にaiで質問するインフラを1冊ずつ増やす","自分の本棚にAIで質問するインフラを1冊ずつ増やす",[15,16,17,18,22,23,26],"p",{},"裁断してスキャンした実務書のPDFが、HDDに転がったまま積もり続けていた。\n今日はそのうち1冊（199ページ）を、",[19,20,21],"code",{},"book-knowledge-base"," プロジェクトの ",[19,24,25],{},"/yomitoku"," スラッシュコマンドに食わせた。\n処理が走っている数十分の間、別の作業（奥付抽出計画）を並列で進めて、戻ってきたら Turso DB に1冊分の全文が増えていた。",[15,28,29,30,34],{},"「OCRしました」で終わる話ではない。\n",[31,32,33],"strong",{},"自分の本棚に AI で質問できる状態","を、1冊ずつ作っている。",[10,36,37],{"id":37},"yomitokuとは",[15,39,40,43,44,46],{},[19,41,42],{},"yomitoku"," は日本語特化の AI OCR ツールで、手書き混じりや段組み・表の入った実務書でも、本文と図表を分離して Markdown を吐く。\n今回使った ",[19,45,25],{}," コマンドは、その変換だけでなく以下までを一気通貫で回す。",[48,49,50,54,57,60],"ul",{},[51,52,53],"li",{},"PDF → ページ単位の Markdown 化",[51,55,56],{},"図表を別画像として抽出",[51,58,59],{},"抽出結果を Turso DB（libSQL/SQLite互換）に格納",[51,61,62,65],{},[19,63,64],{},"amazon_metadata"," テーブルと書籍IDで自動紐付け",[15,67,68],{},"最後の紐付けが効くと、Amazon 側で持っているタイトル・著者・出版社のメタデータと、OCR した本文セクションが結合された状態で検索できる。",[10,70,71],{"id":71},"やったこと",[73,74,76],"h3",{"id":75},"pdfを探す一度迷子になった","PDFを探す（一度迷子になった）",[15,78,79,80,83],{},"最初に ",[19,81,82],{},"find"," でPDFを当てに行ったが、想定パスに無くて空振りした。\n別ディレクトリを順に当たって、ようやく目当てのファイルを掘り当てた。",[15,85,86],{},"裁断本のPDFはディレクトリを分けて保管しているつもりでも、案外散らかっている。今後は格納先のパス規約を固めたい。",[73,88,90],{"id":89},"先頭10ページで書籍情報を把握-199ページと判明","先頭10ページで書籍情報を把握 → 199ページと判明",[15,92,93,94,97],{},"PDFが見つかったら、まず先頭10ページを読んで何の本かを確認した。\nタイトル・著者・章立てが頭に入った段階で、総ページ数を確認したら ",[31,95,96],{},"199ページ","。\nyomitoku は分量に応じて処理時間が伸びるので、数十分かかる前提で動かす段取りに切り替えた。",[73,99,101],{"id":100},"バックグラウンドで-yomitoku-を起動-他作業と並列","バックグラウンドで yomitoku を起動 → 他作業と並列",[15,103,104,106],{},[19,105,25],{}," をバックグラウンド実行にして、別のターミナルで奥付抽出の計画書を書いていた。\n完了通知が来たら結果を確認する、というリズム。",[15,108,109],{},"199ページの本を完走させると、",[48,111,112,117],{},[51,113,114],{},[31,115,116],{},"199ページ分の Markdown",[51,118,119,122],{},[31,120,121],{},"170枚の図"," が別画像として出力された",[15,124,125],{},"図ファイルは既定の命名規則でリネームされて、Markdown 側からの相対パスで参照される構造になる。",[73,127,129],{"id":128},"db格納で2回つまずいた","DB格納で2回つまずいた",[15,131,132],{},"ここから先がやや手探りだった。",[134,135,137],"h4",{"id":136},"つまずき1-関数シグネチャを取り違えた","つまずき1: 関数シグネチャを取り違えた",[15,139,140],{},"DB 格納処理を呼ぼうとして、引数の渡し方を間違えた。1回エラーで止まったので、シグネチャを確認してから再実行した。",[134,142,144,145,148],{"id":143},"つまずき2-init_books_db-がスキーマ衝突","つまずき2: ",[19,146,147],{},"init_books_db"," がスキーマ衝突",[15,150,79,151,153,154,157],{},[19,152,147],{}," を回そうとしたら、既存テーブルと衝突して止まった。\nスキーマは既に作ってあるので、初期化は飛ばして ",[19,155,156],{},"insert_book"," から直接実行する流れに切り替えた。",[159,160,165],"pre",{"className":161,"code":163,"language":164},[162],"language-text","init_books_db   ← スキップ（既存スキーマあり）\ninsert_book     ← 書籍メタデータを登録\n前処理 + セクション統合   ← Markdown を章節単位にまとめ直して格納\n","text",[19,166,163],{"__ignoreMap":167},"",[15,169,170],{},"この順で実行したら、DB 格納が通った。",[73,172,174],{"id":173},"検索テストとamazonメタデータの紐付け","検索テストとAmazonメタデータの紐付け",[15,176,177,178,180],{},"格納が終わったら、検索テストを1本叩いて動作を確認した。\n本文中のキーワードでセクションが引けて、同時に ",[19,179,64],{}," 側の書籍IDが解決された状態で返ってきた。",[15,182,183],{},"つまり「この本のこの章にこう書いてある」という単位で、Claude Code から問い合わせられる。",[10,185,187],{"id":186},"yomitoku-コマンドの中身","/yomitoku コマンドの中身",[15,189,190],{},"実行している処理を分解するとこうなる。",[159,192,195],{"className":193,"code":194,"language":164},[162],"PDF\n ↓ yomitoku（日本語特化AI OCR）\nページごとのMarkdown + 図画像\n ↓ 章節単位への再構成\nセクション化されたMarkdown\n ↓ Turso DB（libSQL）に insert\n書籍コンテンツテーブル\n ↓ amazon_metadata と書籍IDで自動結合\n全文検索 + メタデータ検索が可能な状態\n",[19,196,194],{"__ignoreMap":167},[15,198,199,200],{},"人間がやったのは、PDFのパスを渡したことと、シグネチャミス・スキーマ衝突の2点をリカバリしたことだけ。\n",[31,201,202],{},"Claude Code がコマンドの中で順次実行している。",[10,204,205],{"id":205},"今日の発見",[48,207,208,215,218,223],{},[51,209,210,211,214],{},"199ページの実務書でも、バックグラウンドに回せば",[31,212,213],{},"ほぼ放置で完走する","。1冊ずつ蔵書DBに積み上げる運用が現実的になった",[51,216,217],{},"図表が170枚抽出された。本文だけでなく図解の位置も保持されるので、後で AI に図解付きで要約させる余地が残る",[51,219,220,222],{},[19,221,147],{}," のような「初回だけ実行」系コマンドは、毎回確認するクセを付けないとスキーマ衝突で止まる",[51,224,225,226,229],{},"WebFetch でも yomitoku でも、",[31,227,228],{},"長時間処理をバックグラウンド化して別作業と並列で動かす","のが効くと改めて確認した",[10,231,233],{"id":232},"税理士会計士フォロワー視点での応用","税理士・会計士フォロワー視点での応用",[15,235,236],{},"裁断本の山がHDDに眠っている人ほど効く。",[48,238,239,242,245],{},[51,240,241],{},"自炊した実務書（税法解説書、会計実務書、判例集）を全文検索可能な状態に変換できる",[51,243,244],{},"過去の参考書をDB化すれば、「○○の論点について書いてある書籍を横串で当てる」が日本語で頼める",[51,246,247],{},"SQLは書かなくていい。「○○について関連書籍から検索して内容を要約して」とClaude Codeに頼むだけで、裏でDBが叩かれる",[15,249,250],{},"「自分の本棚にAIで質問する」インフラは、1冊ずつしか増やせない。\n今日はその1冊が増えた。",[10,252,253],{"id":253},"次にやること",[48,255,258,268,274],{"className":256},[257],"contains-task-list",[51,259,262,267],{"className":260},[261],"task-list-item",[263,264],"input",{"disabled":265,"type":266},true,"checkbox"," 残っている裁断本PDFをディレクトリで一元化する",[51,269,271,273],{"className":270},[261],[263,272],{"disabled":265,"type":266}," 奥付抽出の計画書を仕上げて、書籍メタデータの取得経路を整理する",[51,275,277,279],{"className":276},[261],[263,278],{"disabled":265,"type":266}," 検索クエリのバリエーション（章横断・書籍横断）をいくつか試して使用感を掴む",{"title":167,"searchDepth":281,"depth":281,"links":282},2,[283,284,285,293,294,295,296],{"id":12,"depth":281,"text":13},{"id":37,"depth":281,"text":37},{"id":71,"depth":281,"text":71,"children":286},[287,289,290,291,292],{"id":75,"depth":288,"text":76},3,{"id":89,"depth":288,"text":90},{"id":100,"depth":288,"text":101},{"id":128,"depth":288,"text":129},{"id":173,"depth":288,"text":174},{"id":186,"depth":281,"text":187},{"id":205,"depth":281,"text":205},{"id":232,"depth":281,"text":233},{"id":253,"depth":281,"text":253},"dev","199ページの実務書PDFを日本語特化AI OCRツール「yomitoku」でMarkdown化し、Turso DB（libSQL）に格納してAmazonメタデータと自動紐付けするまでの記録。/yomitokuスラッシュコマンド1本で完走。","md",{},null,"/yomitoku-book-pdf-to-markdown-db",false,"2026-05-10T00:00:00.000Z",{"title":5,"description":298},"2026-05/2026-05-10/yomitoku-book-pdf-to-markdown-db",[42,308,309,310,311],"OCR","Turso","蔵書管理","Claude Code","twry7O86YQ-T_qpqrs0QakVoshlvW697KvhNOJMl4tw",[],"https://log.eurekapu.com/og/blog/yomitoku-book-pdf-to-markdown-db.png?v=2026-05-10T00%3A00%3A00.000Z&title=yomitoku%E3%81%A7%E6%9B%B8%E7%B1%8DPDF%E3%82%92Markdown%E5%8C%96%E3%81%97%E3%81%A6Turso%20DB%E3%81%AB%E6%A0%BC%E7%B4%8D%E3%81%99%E3%82%8B%EF%BC%9A%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%B9%E5%8C%96AI%20OCR%E3%81%A7%E8%94%B5%E6%9B%B8%E3%82%92%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2%E5%8F%AF%E8%83%BD%E3%81%AB%E3%81%99%E3%82%8B&author=Kei%20Komatsu&sig=a04c6f44cbc3047d",1782528834947]