adbird(広告鳥) 備忘録

NDLOCR-LiteでOCRして、透明テキストの付いたPDFを作成

国立国会図書館(NDL)がGPUを必要としないOCRツール NDLOCR-Liteアプリケーション を公開した。 https://github.com/ndl-lab/ndlocr-lite

これを利用すると、紙ベースで書類等をスキャンしたPDFデータをOCRできるだけでなく、PDFに透明テキストをつけることができる。

下準備

1.NDLOCR-Lite ダウンロード

  • NDLOCR-Liteアプリケーションのリポジトリのリリースページより、アプリケーションファイル(Windowsの場合はzip)をダウンロード。
    ダウンロード後、右クリックして展開。
    • ※リリースされたばかりでバージョンアップが激しいので、こまめにリリースを確認する
  • Zipを展開したできたフォルダを日本語(全角文字)を含まない場所に配置
    • NDLOCR-Liteの使い方に「デスクトップアプリケーションを利用する際には、日本語(全角文字)を含まないパスにアプリケーションを配置してください。全角文字を含む場合に起動しないことがあります。」という注意事項がある。

2.PDFTKのインストール

Windowsの場合

Powershellで以下を実行でインストール。

winget install --id=PDFLabs.PDFtk.Server 

Macの場合

ターミナルで

brew install pdftk-java 

Linux(Ubuntu)の場合

sudo apt install pdftk-java 

3. python、PyMuPDFライブラリのインストール

初心者がpythonを入れるのは、PCのMicrosoft Storeからインストールのが一番楽だと思う。

PyMuPDFライブラリは、Powershellで以下を実行してインストール。

pip install pymupdf

4. pyhton スクリプト(pdftopng.py)作成

PDFを各ページごとのpng画像にするためのスクリプト。なお、ChatGPTに作ってもらった。

メモ帳などのテキストエディタで以下の内容を pdftopng.py として保存。

import sys
import os
import fitz
from multiprocessing import Pool, cpu_count

def convert_pages(args):
    pdf_path, pages, outdir = args

    doc = fitz.open(pdf_path)

    for page_num in pages:
        page = doc.load_page(page_num)
        pix = page.get_pixmap(matrix=fitz.Matrix(2,2), alpha=False)
        pix.save(f"{outdir}/image-{page_num+1:04d}.png")

    doc.close()

def main():

    if len(sys.argv) < 2:
        print("使い方: python3 pdftopng.py ファイル名.pdf")
        sys.exit()

    pdf = sys.argv[1]

    if not pdf.lower().endswith(".pdf"):
        pdf += ".pdf"

    outdir = os.path.join("OCR", "image")
    os.makedirs(outdir, exist_ok=True)

    doc = fitz.open(pdf)
    total_pages = len(doc)
    doc.close()

    cores = cpu_count()

    page_lists = [[] for _ in range(cores)]
    for i in range(total_pages):
        page_lists[i % cores].append(i)

    tasks = [(pdf, pages, outdir) for pages in page_lists if pages]

    with Pool(cores) as p:
        p.map(convert_pages, tasks)

if __name__ == "__main__":
    main()

5. PDFやテキストを結合などするスクリプトを作成

結合.bat 作成(Windowsの場合)

メモ帳などのテキストエディタで、以下の内容を「結合.bat」として保存。

cd OCR/image
pdftk *.pdf cat output ..\OCR_PDF\%1.pdf
powershell -Command "Get-Content -Encoding UTF8 .\*.txt | Out-File -FilePath ..\OCR_TXT\%1.txt -Encoding UTF8"
rm *.pdf
rm *.txt
rm *.png

結合.sh 作成(Linuxの場合。Macでも?)

メモ帳などのテキストエディタで、以下の内容を「結合.sh」として保存。

cd OCR/image
pdftk *.pdf cat output ../OCR_PDF/$1.pdf
cat *.txt > ../OCR_TXT/$1.txt
rm *.pdf
rm *.txt
rm *.png

6. ディレクトリ構成

ディレクトリ(フォルダ)構成を以下のようにする。

任意ディレクトリ
 ├─入力.pdf
 ├─pdftopng.py
 ├─結合.bat
 └─OCR
    ├─image
    ├─OCR_PDF
    └─OCR_TXT

任意ディレクトリにOCRをしたいPDF、pdftopng.py、結合.bat(Linux、macの場合は、結合.sh)を入れ、
その下位ディレクトリにOCRフォルダ、
さらに下位ディレクトリにimageフォルダ、OCR_PDFフォルダ、OCR_TXTフォルダを配置する。

作業手順

1.PDF→png

PDFやpdftopng.pyが入っているフォルダ内で右クリック、「ターミナルで開く」でPowerShellを起動。以下を実行。 pdfが各ページごとのpngファイルに変換され、OCR>imageフォルダに入る。

python3 pdftopng.py "入力.pdf"

"入力.pdf"のところは、""(ダブルクォーテーションマーク)の中にカーソルを持ってきて、pdfファイルをドラッグ・アンド・ドロップをすればよい。

2.NDLOCR-LiteでOCR

  • NDLOCR-Liteを起動(前述のフォルダ内の「ndlocr_lite_gui.exe」をダブルクリックで起動。 )
    • 初回だけ「WindowsによってPCが保護されました」→「詳細情報」→「実行」。
    • アプリのウィンドウが起動しても、ウィンドウの中身がなかなか表示されないが気長に待つ(特に初回)。
    • 一度起動さえすれば、タスクバーに表示されたアイコン上で右クリック>「タスクバーにピン留めする」をしておけば便利。
  • 「フォルダ内の画像を処理する」をクリックして、「image」フォルダを指定する。
    • 「image」フォルダ内は事前に空になっていることを確認する。
  • 「出力先を選択する」をクリックして、同じ「image」フォルダを指定。
  • 「出力形式の選択」をクリックして、以下のように設定する。(適宜、必要に応じてチェックを入れる)
    • 「認識箇所の可視化画像を保存する」のチェックを外す。
    • 「出力形式の選択」 > 「TXT形式」と「透明テキスト付PDF(ベータ)」にチェックを入れる。
    • それ以外のチェックを外す。
  • 「OCR」をクリック。
    • PC能力によるが、ページ数が多いと、そこそこ時間がかかる。

3.PDFやTXTを結合

OCR後、以下を実行。

OCR_PDFフォルダに透明テキスト付PDFが、OCR_TXTフォルダに結合されたテキストファイルが入って、imageフォルダ内のpdf、txt、pngファイルが削除される。

Windowsの場合

./結合.bat 出力ファイル名

※出力ファイル名に拡張子(.txtや.pdf)はつけない

Linuxの場合

sh 結合.sh 出力ファイル名

おまけ:テキスト内のキーワード検索

「OCR-TXT」フォルダ内の全てのtxtファイルを対象に、一瞬でキーワード検索できる。
「OCR-TXT」フォルダ内で右クリック、「ターミナルで開く」でPowerShellを起動。以下のように実行。

Windowsの場合

Select-String "検索したいキーワード" *.txt | Format-Table Filename, LineNumber, Line

and検索の例

Select-String "師範學校" *.txt | Select-String "鹿兒島" | Format-Table Filename,LineNumber,Line

MacやLinuxの場合

grep --color=always -n -H "検索したいキーワード" *.txt | column -t -s ":"

and検索の例

grep --color=always -n -H "師範學校" *.txt | grep --color=always -n -H "鹿兒島" | column -t -s ":"

余談

ターミナルのフォントはUDEV Gothicを使うと良い。
yuru7/udev-gothic: UDEV Gothic