[{"data":1,"prerenderedAt":258},["ShallowReactive",2],{"content-/book-ocr-to-web-content":3,"all-pages-for-dir":235,"related-/book-ocr-to-web-content":236,"og-image-/book-ocr-to-web-content":257},{"id":4,"title":5,"body":6,"category":215,"concepts":216,"description":217,"extension":218,"meta":219,"navigation":185,"ogImage":216,"path":220,"project_name":221,"published":222,"publishedAt":223,"seo":224,"source":225,"stem":226,"tags":227,"todo":216,"unpublished":222,"updatedAt":216,"__hash__":234},"pages/2026-08/2026-08-02/book-ocr-to-web-content.md","584ページのスキャンPDFをOCRしてナレッジベースに入れ、サイトの解説コンテンツに変えるまで",{"type":7,"value":8,"toc":200},"minimark",[9,13,17,20,25,28,31,39,42,45,48,67,70,73,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,124,127,130,133,136,139,142,145,148,151,154,157,160,163,166,169,172],[10,11,5],"h1",{"id":12},"_584ページのスキャンpdfをocrしてナレッジベースに入れサイトの解説コンテンツに変えるまで",[14,15,16],"p",{},"584ページのスキャンPDFをOCRにかけたら、25分で終わった。\n見積もりは30分弱だったので、想定より早い。\nこの日いちばん時間を食ったのは、そのあとに続いた「成功したように見える失敗」のほうだった。",[14,18,19],{},"ダウンロードフォルダに落としてあった専門技術書のPDFを1本、OCRしてナレッジベースのDBに入れる。\nそこまでは前からある手順をなぞるだけのはずだった。",[21,22,24],"h2",{"id":23},"_3ページで測ってから584ページを流す","3ページで測ってから584ページを流す",[14,26,27],{},"作業マシンは Apple Silicon の Mac で、この経路を通すのは初めてだった。\n見つけたPDFは175MB、584ページのスキャンで、テキストレイヤーは入っている。\nいきなり584ページを投げず、まず3ページだけ流させて速度と品質を測らせた。\nMPS で動いて約2.7秒/ページ、584ページなら30分弱で終わる計算だった。\n出力の品質にも問題がなかったので、本番をバックグラウンドに投げた。",[21,29,30],{"id":30},"待ち時間に前提を潰す",[14,32,33,34,38],{},"OCRが回っているあいだは待ち時間になる。\n後続工程の前提を先に確認させたら、図版をオブジェクトストレージへ上げるための rclone がこのMacに入っていなかった。\n1.75.0 を導入した。\n",[35,36,37],"code",{},".env"," の中身を表示せず、環境変数経由で認証情報を渡して接続だけ確かめた。\n既存の354冊分が見えた。",[14,40,41],{},"PDF内蔵のテキスト層は精度が低かったので、章立ても書店ページの目次で裏を取らせた。\n公式の全16章が取れて、PDFから抽出した各章の初出ページとも合った。",[14,43,44],{},"途中で進捗を聞いた。\n293/584ページで半分、図671枚。\n20:41 の時点で最新ファイルの更新が止まっていない。\n最終的に584/584ページ、欠番ゼロ、図1,464枚、処理時間25分だった。",[21,46,47],{"id":47},"終了コード0の見せかけ",[14,49,50,51,54,55,58,59,62,63,66],{},"図1,464枚を正規名にリネームさせ、アップロードとDB格納を実行した。\n「取り込みが完了しました」と返ってきたので結果を確認したら、DBには1行も入っていない。\n",[35,52,53],{},"| tail"," を挟んだせいでパイプ末尾の終了コードが返っており、失敗が0に見えていた。\n原因は、cwd が ",[35,56,57],{},"src/"," でないために ",[35,60,61],{},"db"," モジュールを解決できなかったことだった。\ncwd 非依存に直させ、",[35,64,65],{},"MD_DIR"," も絶対パスにして再実行した。",[21,68,69],{"id":69},"書き込みだけが403で返る",[14,71,72],{},"今度は exit 1 で止まった。\nrclone のコピーが403で拒否されている。\nただし一覧取得のほうは通っている。\n単一ファイルで詳細ログを取らせて切り分けたところ、GET と LIST は成功し、PUT だけが403だった。",[14,74,75,77],{},[35,76,37],{}," に入っているキーが読み取り専用だった。\n1Password 側も値を出さずに確認させたが、書き込み権限を持つ別の認証情報はなかった。",[14,79,80],{},"取り込みスクリプトは、アップロードの成功をDB格納の前提としてハードコードしていた。\nプロジェクト側は触らず、取り込みスクリプト側だけ「アップロードに失敗しても本文は格納する」形に変えさせた。\n図版は1,464枚ともローカルに残っているので、書き込み用のキーを発行すればあとから投入できる。",[14,82,83],{},"584ページが493チャンクとして入った（62グループ統合、スキップ0）。\n全文検索も引ける状態になった。",[21,85,86],{"id":86},"ページを章と節に畳み直す",[14,88,89],{},"ページ単位のチャンクを目次に沿ってセクション単位へ統合する。\n章の境界を機械的に検出させたら、16章のうち6つの章タイトルページがOCRの揺れで拾えなかった。\nタイトル文字列で直接探させて、全16章の開始ページを確定させた。",[14,91,92],{},"セクション名を目視で確かめると、図のキャプションが見出しとして混ざっている。\n節の切れ目ではないので、除外して前の節へ吸収させた。\n450セクションで確定して統合を実行し、493チャンクが450チャンクになった。",[14,94,95],{},"章立ては目次と合った。\nただ最終章の末尾だけが妙に長い。\n中を見たら、p560以降は本文ではなく付録だった。\n最終章から切り離して後付に分類し直した。",[21,97,98],{"id":98},"動いていないものを15分待つ",[14,100,101],{},"再分類のあとに全文検索インデックスのリビルドを走らせたら、5分でタイムアウトした。\nUPDATE 自体は反映されていたので、リビルドだけ単独で流し直した。",[14,103,104],{},"15分経っても戻ってこない。\nプロセスを見ると、CPUをほとんど使わないまま止まっている。\nそのくせ書き込みロックは握ったままで、他の更新まで止めていた。",[14,106,107],{},"調べさせたら、インデックスは INSERT / UPDATE / DELETE のトリガで自動更新される構成だった。\n手動リビルドはそもそも要らない。\n待っていた15分は、必要のない処理がハングするのを眺めていた時間だった。",[21,109,110],{"id":110},"図を装飾と情報に仕分ける",[14,112,113],{},"図のコンタクトシートを61枚作らせた。\nサブエージェント5つを並列で走らせて、装飾図と情報図を判定させる。\nバッチごとに結果が戻ってきて、装飾図は14件だった。\n本文から除去したところで、取り込みから再構造化、クリーンアップまでの3工程が通った。",[14,115,116],{},"書棚のメタデータが同シリーズの別書籍に誤って紐づいていたのも、この待ち時間に直した。\n書影を目視して正しい表紙であることを確認し、手動登録用のステータスに合わせて上書きさせた。",[14,118,119],{},"アプリを立ち上げて描画を見ようとしたら、ブラウザでの自動確認が使えなくなっていた。\n原因はDevTools用の専用プロファイルのChromeが残っていたことで、それだけ終了させたら復旧した。\n左の書棚に「済」バッジが付き、章と節が目次として効いている。",[21,121,123],{"id":122},"dbの知識をサイトの読みものにする","DBの知識をサイトの読みものにする",[14,125,126],{},"ここで方向を変えた。\nDBに入れた知識を、別リポジトリで動かしている地域密着サービス業のサイトのコンテンツとして組み込みたい。\nその分野の歴史を扱う読みものと、仕組みを可視化するページを増やす。\nあわせて、サイト全体のキーワード設計とAI経由の流入を含む改善計画もまとめさせる。",[14,128,129],{},"サイトの現状を調べさせると、Cloudflare 配信の静的HTMLが1枚（36KB）だけだった。\n構造化データもaltも既に入っている。\n弱いのは、1ページ構成であること、情報系のコンテンツが皆無であること、sitemap が1URLしかないことだった。\n2026-03 のSEOレポート（88/100）が残課題に挙げていたのも「コンテンツ追加」で、今回やりたいことと重なっていた。",[14,131,132],{},"歴史のページと、仕組みの可視化ページを作らせた。\n歴史のほうは日本語の中に別言語の単語が1箇所混じっていたので直させた。\n可視化のほうは、機構の断面を描く構成にした。\n部品が所定の位置に揃ったときだけ次の段階へ進む様子を3状態で切り替える。",[14,134,135],{},"描画を確認したら、図の重なり順が違っていた。\n境界をまたいでいるはずの部品が手前の塗りに隠れて見えない。\n描画順とJS側の参照を直させて、3状態とも意図どおりになった。",[14,137,138],{},"トップページから読みものへの導線とsitemapも整えた。\n新しいセクションのカードにスタイルが当たらず、CSSファイルを確認させたら括弧は181対181で整合している。\nブラウザキャッシュだった。",[21,140,141],{"id":141},"出来上がりが物足りなかった",[14,143,144],{},"計画書をHTML化してブラウザに出したところで、可視化を見た感想を伝えた。\n思っていたよりレベルが低い。\n3状態を切り替えるだけでは、部品が噛み合う瞬間が見えない。",[14,146,147],{},"モデルを上位のもの（Fable 5）に切り替えて、図解と描写を作り直させた。\n注文は「手で少しずつ動かせて、部品が順に乗り上げて所定の位置にはまり、そのあと次の段階まで動く」こと。",[14,149,150],{},"スライダーを付けて、操作量を手で変えられるようにさせた。\n中盤では、先に条件を満たした部品だけが持ち上がる。\n奥まで進めるとすべての部品に一致の印が付いて、次の操作が有効になる。",[14,152,153],{},"最終段階の見せ方で一度破綻した。\n断面図をそのまま動かすと、部品どうしが斜めに突き抜けてしまう。\n最終段階の動きは正面図だけで表し、断面図は「動ける状態になった」ことだけを示す形に分けさせた。\n余白の取りすぎ、ラベルの重なり、正面図の形状、端の見切れも順に詰めた。",[14,155,156],{},"同じ注文を上位モデルに投げ直しただけで、最初の版には出てこなかった動きが出てきた。",[21,158,159],{"id":159},"文字数をバイト数で数えていた",[14,161,162],{},"並行して走らせていた競合調査が戻ってきて、計画書の前提に誤りがあると指摘された。\n自分で検証できる2点を確かめさせた。",[14,164,165],{},"本文は1,762文字だった。\n前に書いた「14,261」はバイト数を数えた誤りだった。\nrobots.txt にAIクローラーのブロックが元々入っていないことも確かめた。",[14,167,168],{},"本文量を8倍に見誤ったままなら、そこから導いた「コンテンツは足りている」という判断ごと逆になる。\n計画書は全面的に書き直させた。",[21,170,171],{"id":171},"残っていること",[173,174,177,188,194],"ul",{"className":175},[176],"contains-task-list",[178,179,182,187],"li",{"className":180},[181],"task-list-item",[183,184],"input",{"disabled":185,"type":186},true,"checkbox"," 図版1,464枚のアップロード（書き込み権限を持つキーの発行が要る。値の入力は自分でやる）",[178,189,191,193],{"className":190},[181],[183,192],{"disabled":185,"type":186}," 書き直した改善計画のレビュー",[178,195,197,199],{"className":196},[181],[183,198],{"disabled":185,"type":186}," 可視化ページをモバイル幅で確認する",{"title":201,"searchDepth":202,"depth":202,"links":203},"",2,[204,205,206,207,208,209,210,211,212,213,214],{"id":23,"depth":202,"text":24},{"id":30,"depth":202,"text":30},{"id":47,"depth":202,"text":47},{"id":69,"depth":202,"text":69},{"id":86,"depth":202,"text":86},{"id":98,"depth":202,"text":98},{"id":110,"depth":202,"text":110},{"id":122,"depth":202,"text":123},{"id":141,"depth":202,"text":141},{"id":159,"depth":202,"text":159},{"id":171,"depth":202,"text":171},"dev",null,"専門技術書のスキャンPDF584ページをOCRにかけ、ページ単位のチャンクをセクション単位へ再構造化して全文検索まで通した。その知識を別サイトの解説ページへ転用する過程で、終了コードの見落とし、書き込み権限の403、可視化の作り直しに時間を使った記録。","md",{},"/book-ocr-to-web-content","book-knowledge-base",false,"2026-08-02T00:00:00.000Z",{"title":5,"description":217},"make-diary","2026-08/2026-08-02/book-ocr-to-web-content",[228,229,230,231,232,233],"OCR","ナレッジベース","全文検索","Turso","SEO","可視化","IxH1T09r78qscshG9AFvAKM8xqEdiBI1Pyz3eLWeuC0",[],[237,241,245,249,253],{"title":238,"path":239,"publishedAt":240},"裁断した実務書をOCRしてTursoのDBに横串検索できる本棚を毎日10冊単位で増やす","/book-knowledge-base-import-batch-workflow","2026-06-16T00:00:00.000Z",{"title":242,"path":243,"publishedAt":244},"自炊した4分冊の参考書をOCRして蔵書DBに取り込み、章・節単位に整理し直すまで","/textbook-ocr-to-knowledge-base","2026-05-27T00:00:00.000Z",{"title":246,"path":247,"publishedAt":248},"yomitoku で専門書5冊・1181ページを一気にOCRして Turso DB に1057チャンク登録した","/yomitoku-book-ocr-batch","2026-04-28T00:00:00.000Z",{"title":250,"path":251,"publishedAt":252},"2026年8月7日の開発日記 - 緩めたルールを、元に戻した日","/2026-08-07-diary","2026-08-07T00:00:00.000Z",{"title":254,"path":255,"publishedAt":256},"蔵書DBを棚卸しして専門書の抜けを洗い出し、簡易デューデリジェンス支援スキルを実装した","/bookshelf-db-stocktake-and-dd-skill","2026-08-05T00:00:00.000Z","https://log.eurekapu.com/og/blog/book-ocr-to-web-content.png?v=2026-08-02T00%3A00%3A00.000Z&title=584%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%A3%E3%83%B3PDF%E3%82%92OCR%E3%81%97%E3%81%A6%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AB%E5%85%A5%E3%82%8C%E3%80%81%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AE%E8%A7%A3%E8%AA%AC%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B%E3%81%BE%E3%81%A7&author=Kei%20Komatsu&sig=b02012c5d77316c6",1786233133756]