国立国会図書館(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