[{"data":1,"prerenderedAt":575},["ShallowReactive",2],{"content-/book-ocr-turso-batch-import":3,"all-pages-for-dir":573,"og-image-/book-ocr-turso-batch-import":574},{"id":4,"title":5,"body":6,"category":552,"description":553,"extension":554,"meta":555,"navigation":556,"path":557,"project_name":558,"published":559,"publishedAt":560,"seo":561,"stem":562,"tags":563,"todo":570,"unpublished":559,"updatedAt":571,"__hash__":572},"pages/2026-04/2026-04-23/book-ocr-turso-batch-import.md","yomitoku OCRで会計基準9冊589ページを一括処理しTurso DBに格納した手順",{"type":7,"value":8,"toc":536},"minimark",[9,13,17,20,24,27,31,46,49,186,189,191,195,199,202,262,265,269,276,289,300,406,412,414,418,427,435,438,440,444,448,487,490,493,496,498,501,532],[10,11,5],"h1",{"id":12},"yomitoku-ocrで会計基準9冊589ページを一括処理しturso-dbに格納した手順",[14,15,16],"p",{},"会計基準のPDF10冊をyomitoku OCRに通してTurso DBに流し込んだ。1冊は壊れたファイルで弾かれ、残り9冊・589ページをGPUで順次処理した。蔵書DBが19冊から28冊に増え、チャンク数が約3,200に達した。",[18,19],"hr",{},[21,22,23],"h2",{"id":23},"処理対象の10冊",[14,25,26],{},"全て会計基準の公的文書PDF。yomitokuに渡す前にファイルの中身を確認したところ、1冊だけ問題が見つかった。",[28,29,30],"h3",{"id":30},"壊れたファイルの除外",[14,32,33,37,38,41,42,45],{},[34,35,36],"code",{},"40_圧縮記帳取扱い.pdf"," をyomitokuに通そうとしたら、OCRエンジンがPDFとして認識できなかった。バイナリの先頭を覗くと ",[34,39,40],{},"\u003C!DOCTYPE html>"," で始まっていた。HTMLファイルが ",[34,43,44],{},".pdf"," の拡張子で保存されていただけだった。このファイルは除外し、9冊で処理を進めた。",[28,47,48],{"id":48},"処理した9冊",[50,51,52,68],"table",{},[53,54,55],"thead",{},[56,57,58,62,65],"tr",{},[59,60,61],"th",{},"#",[59,63,64],{},"書籍名",[59,66,67],{},"ページ数",[69,70,71,83,94,105,116,127,138,149,160,171],"tbody",{},[56,72,73,77,80],{},[74,75,76],"td",{},"1",[74,78,79],{},"連結キャッシュ・フロー計算書等の作成に関する実務指針",[74,81,82],{},"68",[56,84,85,88,91],{},[74,86,87],{},"2",[74,89,90],{},"外貨建取引等の会計処理に関する実務指針",[74,92,93],{},"95",[56,95,96,99,102],{},[74,97,98],{},"3",[74,100,101],{},"資本連結実務指針",[74,103,104],{},"88",[56,106,107,110,113],{},[74,108,109],{},"4",[74,111,112],{},"持分法に関する実務指針",[74,114,115],{},"71",[56,117,118,121,124],{},[74,119,120],{},"5",[74,122,123],{},"金融商品会計に関する実務指針",[74,125,126],{},"158",[56,128,129,132,135],{},[74,130,131],{},"6",[74,133,134],{},"特別目的会社を活用した不動産の流動化に係る譲渡人の会計処理に関する実務指針",[74,136,137],{},"25",[56,139,140,143,146],{},[74,141,142],{},"7",[74,144,145],{},"連結財務諸表の用語、様式及び作成方法に関する規則ガイドライン",[74,147,148],{},"14",[56,150,151,154,157],{},[74,152,153],{},"8",[74,155,156],{},"財務諸表等の用語、様式及び作成方法に関する規則ガイドライン",[74,158,159],{},"42",[56,161,162,165,168],{},[74,163,164],{},"9",[74,166,167],{},"固定資産の減損に係る会計基準の設定に関する意見書",[74,169,170],{},"28",[56,172,173,175,181],{},[74,174],{},[74,176,177],{},[178,179,180],"strong",{},"合計",[74,182,183],{},[178,184,185],{},"589",[14,187,188],{},"金融商品実務指針の158ページが最も重く、連結財務諸表規則ガイドラインの14ページが最も軽い。ページ数の差は10倍以上あるが、yomitokuのGPU処理はページ単位で走るので、所要時間はほぼページ数に比例した。",[18,190],{},[21,192,194],{"id":193},"ocr処理の流れ","OCR処理の流れ",[28,196,198],{"id":197},"yomitoku-ocrの実行","yomitoku OCRの実行",[14,200,201],{},"9冊を1冊ずつ順次処理した。yomitokuはGPUを使うため、並列実行するとVRAMが溢れる。1冊の処理が終わるのを待ってから次を投入する流れで回した。",[203,204,209],"pre",{"className":205,"code":206,"language":207,"meta":208,"style":208},"language-bash shiki shiki-themes vitesse-light vitesse-light","# 各PDFに対して順次実行\nyomitoku ${PDF_PATH} -o ${OUTPUT_DIR} -f md --figure --figure_letter\n","bash","",[34,210,211,220],{"__ignoreMap":208},[212,213,216],"span",{"class":214,"line":215},"line",1,[212,217,219],{"class":218},"sxvE3","# 各PDFに対して順次実行\n",[212,221,223,227,231,235,238,242,244,247,249,252,256,259],{"class":214,"line":222},2,[212,224,226],{"class":225},"senZ8","yomitoku",[212,228,230],{"class":229},"shFtX"," ${",[212,232,234],{"class":233},"s4oTP","PDF_PATH",[212,236,237],{"class":229},"}",[212,239,241],{"class":240},"snbK4"," -o",[212,243,230],{"class":229},[212,245,246],{"class":233},"OUTPUT_DIR",[212,248,237],{"class":229},[212,250,251],{"class":240}," -f",[212,253,255],{"class":254},"sdGka"," md",[212,257,258],{"class":240}," --figure",[212,260,261],{"class":240}," --figure_letter\n",[14,263,264],{},"出力はページごとのMarkdownファイルと、検出された図・表の画像ファイル。589ページ分のMarkdownが生成された。",[28,266,268],{"id":267},"process_yomitoku_book関数でdb格納","process_yomitoku_book関数でDB格納",[14,270,271,272,275],{},"OCR出力のMarkdownをTurso DBに格納する処理は ",[34,273,274],{},"process_yomitoku_book"," 関数に集約されている。この関数は以下を一括で実行する。",[277,278,279,283,286],"ol",{},[280,281,282],"li",{},"指定ディレクトリ内のMarkdownファイルを読み込み",[280,284,285],{},"ページ順にソートしてチャンクに分割",[280,287,288],{},"Turso Embedded Replicaに直接INSERT",[14,290,291,292,295,296,299],{},"前回の記事で書いた「",[34,293,294],{},"init_books_db"," を呼ばない」「",[34,297,298],{},"db_path"," を渡さない」という学びが既にコードに反映されており、今回は一度もエラーに引っかからなかった。CLAUDE.mdに手順を書き残しておいた効果が出た。",[203,301,305],{"className":302,"code":303,"language":304,"meta":208,"style":208},"language-python shiki shiki-themes vitesse-light vitesse-light","# process_yomitoku_book がやっていること（概要）\nconn = connect_turso()  # 環境変数からURL/トークンを取得\nfor chunk in split_into_chunks(markdown_pages):\n    conn.execute(\"INSERT INTO book_chunks ...\", [chunk])\nconn.sync()  # Embedded Replica → クラウドDBに同期\n","python",[34,306,307,312,330,355,390],{"__ignoreMap":208},[212,308,309],{"class":214,"line":215},[212,310,311],{"class":218},"# process_yomitoku_book がやっていること（概要）\n",[212,313,314,318,321,324,327],{"class":214,"line":222},[212,315,317],{"class":316},"sG7-3","conn ",[212,319,320],{"class":229},"=",[212,322,323],{"class":316}," connect_turso",[212,325,326],{"class":229},"()",[212,328,329],{"class":218},"  # 環境変数からURL/トークンを取得\n",[212,331,333,337,340,343,346,349,352],{"class":214,"line":332},3,[212,334,336],{"class":335},"sHkkW","for",[212,338,339],{"class":316}," chunk ",[212,341,342],{"class":335},"in",[212,344,345],{"class":316}," split_into_chunks",[212,347,348],{"class":229},"(",[212,350,351],{"class":316},"markdown_pages",[212,353,354],{"class":229},"):\n",[212,356,358,361,364,367,369,373,376,378,381,384,387],{"class":214,"line":357},4,[212,359,360],{"class":316},"    conn",[212,362,363],{"class":229},".",[212,365,366],{"class":316},"execute",[212,368,348],{"class":229},[212,370,372],{"class":371},"sMJiu","\"",[212,374,375],{"class":254},"INSERT INTO book_chunks ...",[212,377,372],{"class":371},[212,379,380],{"class":229},",",[212,382,383],{"class":229}," [",[212,385,386],{"class":316},"chunk",[212,388,389],{"class":229},"])\n",[212,391,393,396,398,401,403],{"class":214,"line":392},5,[212,394,395],{"class":316},"conn",[212,397,363],{"class":229},[212,399,400],{"class":316},"sync",[212,402,326],{"class":229},[212,404,405],{"class":218},"  # Embedded Replica → クラウドDBに同期\n",[14,407,408,411],{},[34,409,410],{},"conn.sync()"," を呼ぶと、ローカルのEmbedded Replicaに書き込んだデータがTursoのクラウドDBに反映される。turso-replicasリポジトリ側のレプリカDBも同期されるため、他のプロジェクトからも即座に新しい書籍データを検索できる。",[18,413],{},[21,415,417],{"id":416},"_9冊の処理結果","9冊の処理結果",[14,419,420,421,423,424,426],{},"全9冊が同じパイプラインで処理できた。1冊ごとに ",[34,422,274],{}," を呼び、",[34,425,410],{}," でクラウドに同期する。この繰り返しを9回実行した。",[203,428,433],{"className":429,"code":431,"language":432},[430],"language-text","PDF → yomitoku OCR → Markdown群\n  → process_yomitoku_book → Turso Embedded Replica\n    → conn.sync() → クラウドDB同期\n","text",[34,434,431],{"__ignoreMap":208},[14,436,437],{},"特筆すべきトラブルは起きなかった。壊れたPDFを最初に弾けたことと、前回のセッションで学んだAPI変更がコードに反映済みだったことが大きい。",[18,439],{},[21,441,443],{"id":442},"蔵書dbの更新状況","蔵書DBの更新状況",[28,445,447],{"id":446},"before-after","Before → After",[50,449,450,463],{},[53,451,452],{},[56,453,454,457,460],{},[59,455,456],{},"項目",[59,458,459],{},"Before",[59,461,462],{},"After",[69,464,465,476],{},[56,466,467,470,473],{},[74,468,469],{},"登録冊数",[74,471,472],{},"19冊",[74,474,475],{},"28冊",[56,477,478,481,484],{},[74,479,480],{},"チャンク数",[74,482,483],{},"約2,300",[74,485,486],{},"約3,200",[14,488,489],{},"CLAUDE.mdの蔵書情報も19冊から28冊に更新した。Claude Codeが蔵書DBを検索するとき、この数字を見て「どの程度のデータが入っているか」を把握する。",[28,491,492],{"id":492},"追加された9冊のカバー領域",[14,494,495],{},"今回追加した9冊は、連結会計・外貨建取引・金融商品・減損会計といった実務指針と規則ガイドラインをカバーしている。既存の19冊が主に企業会計基準と適用指針だったので、実務指針系の層が厚くなった。全文検索で「連結キャッシュ・フロー」「ヘッジ会計」「持分法」などの用語を引くと、対応するチャンクが返ってくる状態になった。",[18,497],{},[21,499,500],{"id":500},"学んだこと",[502,503,504,517,526],"ul",{},[280,505,506,509,510,512,513,516],{},[178,507,508],{},"壊れたPDFはバイナリの先頭で即判別できる",": ",[34,511,40],{}," で始まるファイルはHTMLが拡張子だけPDFになっている。yomitokuに通す前に ",[34,514,515],{},"file"," コマンドやヘッダ確認で弾けば、OCRエラーの原因調査に時間を取られない",[280,518,519,522,523,525],{},[178,520,521],{},"前回の学びをコードに焼き込んでおくと同じ罠を踏まない",": 前回2セッション連続で引っかかったTurso APIの変更点が ",[34,524,274],{}," に反映されていたため、今回は9冊を通して一度もAPI関連のエラーが出なかった",[280,527,528,531],{},[178,529,530],{},"589ページの順次処理はGPU律速",": yomitokuのOCR処理時間はほぼページ数に比例する。並列化はVRAM制約で難しいが、1冊ずつ流せばメモリ管理を気にせず済む。バッチジョブとして放置できる粒度",[533,534,535],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sG7-3, html code.shiki .sG7-3{--shiki-default:#393A34;--shiki-dark:#393A34}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}",{"title":208,"searchDepth":222,"depth":222,"links":537},[538,542,546,547,551],{"id":23,"depth":222,"text":23,"children":539},[540,541],{"id":30,"depth":332,"text":30},{"id":48,"depth":332,"text":48},{"id":193,"depth":222,"text":194,"children":543},[544,545],{"id":197,"depth":332,"text":198},{"id":267,"depth":332,"text":268},{"id":416,"depth":222,"text":417},{"id":442,"depth":222,"text":443,"children":548},[549,550],{"id":446,"depth":332,"text":447},{"id":492,"depth":332,"text":492},{"id":500,"depth":222,"text":500},"dev","日本語特化AI OCR yomitokuを使い、連結CF実務指針や金融商品実務指針など会計基準9冊・合計589ページをMarkdown変換。process_yomitoku_book関数でTurso Embedded Replicaに直接格納し、蔵書DBを28冊・約3,200チャンクに拡張した記録","md",{},true,"/book-ocr-turso-batch-import","book-knowledge-base",false,"2026-04-23T00:00:00.000Z",{"title":5,"description":553},"2026-04/2026-04-23/book-ocr-turso-batch-import",[564,226,565,566,567,568,569],"OCR","TursoDB","書籍デジタル化","会計基準","バッチ処理","Embedded-Replica","memo",null,"vjK_8tB0VPhw9AC5kpDqxuJPSGkF4qrdPZeLWuXVsYk",[],"https://log.eurekapu.com/og/blog/book-ocr-turso-batch-import.png?v=2026-04-23T00%3A00%3A00.000Z&title=yomitoku%20OCR%E3%81%A7%E4%BC%9A%E8%A8%88%E5%9F%BA%E6%BA%969%E5%86%8A589%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%92%E4%B8%80%E6%8B%AC%E5%87%A6%E7%90%86%E3%81%97Turso%20DB%E3%81%AB%E6%A0%BC%E7%B4%8D%E3%81%97%E3%81%9F%E6%89%8B%E9%A0%86&author=Kei%20Komatsu&sig=c004d11cfbf8db57",1780786054780]