見出し画像

国立国会図書館のOCR「NDLOCR-Lite」を使って、PDFをローカルでテキスト化する環境を作ってみた


画像

はじめに——なぜ今、ローカルOCRなのか

2026年2月24日、国立国会図書館のNDLラボが「NDLOCR-Lite」というOCRソフトウェアを無償で公開しました。これまで同館が提供していた「NDLOCR」はNVIDIAのGPUが必須でしたが、NDLOCR-LiteはGPU不要。一般的なノートPCでも動作し、しかもインターネット接続なしで使えます。ライセンスはCC BY 4.0で、適切なクレジットさえ表示すれば商用利用も可能です。

「PDFからテキストを抽出したい」——この需要は実はかなり大きいと思います。書籍をAIで要約したい、資料を検索できるようにしたい、自分だけのナレッジベースとして整理したい。ChatGPTやClaudeといった最近のLLMにもOCR機能は搭載されていて、PDFをアップロードすれば高い精度で読み取ってくれます。でも、それはクラウドサービスです。会社の機密資料や、外部に出したくない個人的な資料には使いにくい。

NDLOCR-Liteなら、完全にローカルで動きます。つまり、社内の機密文書であっても、外部に一切データを出すことなくテキスト化できる。さらにローカルLLMと組み合わせれば、クローズドな環境で自分だけのナレッジベースを構築することも可能です。

今回は、このNDLOCR-Liteを組み込んで、PDFをドラッグ&ドロップするだけでテキストファイルを生成できる環境を、AIとの対話で構築(いわゆるバイブコーディング)してみたので、その手順を共有します。


私がOCRを必要とした理由——「自炊」PDFのテキスト化

私は以前、DURODEX(デューロデックス)のパーソナル断裁機200DXとScanSnapを購入し、書籍を裁断・スキャンしてPDF化する「自炊」をしていました。


自炊そのものは便利なのですが、一つ大きな課題があります。スキャンしたPDFは「画像の集まり」であって、テキストデータではないということです。つまり、文字検索もできないし、テキストのコピーもできない。AIに読ませるにも、画像としてしか認識されません。

この「画像PDF → テキスト」の変換に、OCR(光学文字認識)が必要になります。そして今回公開されたNDLOCR-Liteは、まさにこの用途にぴったりでした。


完成イメージ——やることはPDFを投げるだけ

完成した環境の使い方はとてもシンプルです。

  1. OCR対象のPDFを用意する

  2. `run_ocr.bat` というファイルにPDFをドラッグ&ドロップする

  3. 同じフォルダに `○○_ocr.txt` が自動生成される

sample.pdf      ← 入力(スキャンした画像PDFsample_ocr.txt  ← 出力(テキスト抽出結果)

あとはこのテキストファイルを、ChatGPTに要約させたり、Obsidianに保存したり、RAG(検索拡張生成)のデータソースにしたり、自由に活用できます。


使用する技術

今回の環境で使うものは4つだけです。

Python 3.11 — プログラミング言語。NDLOCR-LiteのCLI版はPython 3.10以降で動作します。

Conda — Python仮想環境の管理ツール。システムのPython環境を汚さずに専用環境を作れます。

NDLOCR-Lite — 国立国会図書館が開発・公開したOCRエンジン。日本語の活字はもちろん、英文や手書き文字にも実験的に対応しています。

PyMuPDF(fitz) — PDFを画像に変換するためのライブラリ。NDLOCR-Liteは「画像 → テキスト」の変換を行うツールなので、PDFをいったん画像に変換する前処理が必要です。

すべてローカルPCで動作し、ネット接続は不要です(ただし、初回のインストール時のみインターネットが必要です)。


環境構築手順

Step 1:Conda環境を作成する

まず、専用のPython環境を作ります。既存のPython環境に影響を与えないよう、Condaで隔離した仮想環境を使います。

conda create -n ndlocr_app python=3.11 -y
conda activate ndlocr_app

Condaをまだインストールしていない方は、Minicondaの公式サイト(https://docs.anaconda.com/miniconda/ )からダウンロードしてください。Anacondaでも問題ありませんが、Minicondaのほうが軽量です。

Step 2:作業フォルダを作り、OCR本体をダウンロードする

mkdir C:\work\my_ocr_app
cd C:\work\my_ocr_app
git clone https://github.com/ndl-lab/ndlocr-lite vendor/ndlocr-lite

Gitがインストールされていない場合は、GitHubのリリースページ(https://github.com/ndl-lab/ndlocr-lite )からZIPでダウンロードして展開しても大丈夫です。

Step 3:必要なライブラリをインストールする

pip install -r vendor/ndlocr-lite/requirements.txt
pip install pymupdf

Step 4:処理の流れを理解する

ここが少しだけ重要なポイントです。NDLOCR-Liteは「画像 → テキスト」の変換を行うツールです。PDFを直接読み込むわけではありません。

そのため、処理の流れはこうなります。

PDF
 ↓ PyMuPDFで変換
ページごとのPNG画像
 ↓ NDLOCR-LiteでOCR
ページごとのテキスト
 ↓ 結合
1つのtxtファイル

この一連の流れを、次のステップで作るPythonスクリプトが自動で行います。

Step 5:main.py を作成する

`C:\work\my_ocr_app\main.py` として以下のコードを保存します。

import sys
import shutil
import tempfile
from pathlib import Path
import fitz

def main():
    if len(sys.argv) < 2:
        print("PDFを指定してください")
        return

    pdf_path = Path(sys.argv[1]).resolve()
    output_txt = pdf_path.parent / f"{pdf_path.stem}_ocr.txt"

    # 一時フォルダ(処理後に自動削除)
    work_dir = Path(tempfile.gettempdir()) / "ndlocr_temp"
    if work_dir.exists():
        shutil.rmtree(work_dir)

    images_dir = work_dir / "images"
    images_dir.mkdir(parents=True)

    print("PDF→画像変換中...")
    doc = fitz.open(str(pdf_path))
    for i in range(len(doc)):
        pix = doc[i].get_pixmap()
        pix.save(str(images_dir / f"page_{i+1}.png"))

    print("OCR実行中...")
    ndl_src = Path("vendor/ndlocr-lite/src").resolve()
    sys.path.insert(0, str(ndl_src))
    import ocr

    import types
    args = types.SimpleNamespace(
        sourcedir=str(images_dir),
        output=str(work_dir),
        sourceimg=None,
        viz=False,
        simple_mode=False
    )
    ocr.process(args)

    print("テキスト結合中...")
    with open(output_txt, "w", encoding="utf-8") as w:
        for t in sorted(work_dir.glob("page_*.txt")):
            w.write(t.read_text(encoding="utf-8"))
            w.write("\n\n")

    shutil.rmtree(work_dir)
    print("完了:", output_txt)

if __name__ == "__main__":
    main()

このスクリプトがやっていることは3つです。PDFを1ページずつPNG画像に変換し、それぞれをOCRにかけ、結果を1つのテキストファイルにまとめる。中間ファイルは処理後に自動で削除されるので、最終的にはtxtファイルだけが残ります。

Step 6:batファイルを作成する(ドラッグ&ドロップ用)

最後に、ドラッグ&ドロップで実行するためのバッチファイルを作ります。`C:\work\my_ocr_app\run_ocr.bat` として以下を保存してください。

@echo off
call %USERPROFILE%\miniconda3\Scripts\activate.bat
call conda activate ndlocr_app
python main.py %1
pause

Anacondaをお使いの方は、2行目の `miniconda3` を `anaconda3` に読み替えてください。

これで環境構築は完了です。あとはPDFファイルを `run_ocr.bat` にドラッグ&ドロップするだけで、テキストファイルが生成されます。


使ってみた所感

実際に自炊PDFでテストしてみたところ、横書き・標準的なフォントで書かれた部分については、かなり高い精度でテキスト化できました。ざっと見た印象ですが、通常のビジネス書や技術書であれば、十分に実用的なレベルだと感じます。

NDLOCR-Liteは、従来のNDLOCRでは対応が難しかった英文や手書き文字にも実験的に対応しているとのことです。ただし、くずし字や漢籍などの古典籍資料については、専用の「NDL古典籍OCR-Lite」の利用が推奨されています。

動作環境としては、Windows 11、macOS 15、Ubuntu 22.04で動作確認済みとされており、PCのメモリに1GB以上の空きがあれば起動するとのことです。


この環境のビジネス的な可能性

今回の構築を通じて、特に感じたのは企業内資料のナレッジ化への可能性です。

多くの企業では、過去の報告書、マニュアル、議事録などが紙やスキャンPDFのまま眠っています。これらをテキスト化して検索可能にするだけでも大きな価値がありますが、セキュリティの観点からクラウドサービスに上げられないケースも多い。

NDLOCR-Liteなら、完全にローカル環境で処理できます。さらに、テキスト化したデータをRAG(検索拡張生成)のデータソースとして活用すれば、「社内資料に基づいて回答するAI」を外部にデータを出すことなく構築できます。

国立国会図書館がこうしたツールをオープンに公開してくださったことに、感謝しています。


まとめ

今回やったことを整理すると、以下の通りです。

  • Conda環境でNDLOCR-Liteを導入

  • PyMuPDFでPDFをページ画像に変換し、OCRでテキスト抽出

  • batファイルでドラッグ&ドロップ実行を実現

  • 完全ローカル・オフラインで動作する環境を構築

構築にはChatGPTとの対話(バイブコーディング)を活用しました。バイブコーディングとは、AIに自然言語で「やりたいこと」を伝え、AIがコードを生成・修正していく開発スタイルのことです。コードを一行一行自分で書くのではなく、AIと会話しながら形にしていく感覚で、プログラミング初心者でもこうしたツールを作れる時代になったと実感しています。


次のステップ

この環境は、次のような応用と組み合わせると、さらに面白くなります。

OCR → LLMで要約 — テキスト化した書籍をChatGPTやClaudeに投げて、章ごとの要約を自動生成する。

OCR → Obsidianに自動保存 — テキストをMarkdown化してObsidianに取り込めば、個人のナレッジベースとして蓄積できる。

OCR → RAG(検索拡張生成) — テキストデータをベクトルDBに登録し、自分専用のAI検索システムを構築する。

特に「OCRしたテキストをそのままAIに要約させる」ワークフローは、すぐに試せて効果も実感しやすいので、次の記事で取り上げたいと思っています。


参考リンク

いいなと思ったら応援しよう!

コメント

コメントするには、 ログイン または 会員登録 をお願いします。
国立国会図書館のOCR「NDLOCR-Lite」を使って、PDFをローカルでテキスト化する環境を作ってみた|ai_omoshiro
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1