はじめに
スキャナーで取り込んだ書籍や,ダウンロードしてきた論文pdf等は,内部にテキストデータが保持されていません。よって,検索などの機能を使うことができず,不便な思いをすることがありました。
そこで,OCR(光学文字認識)エンジンであるTesseractを用いて,画像から文字の抽出を行い,それらの文字データをpdfに埋め込んだ形でpdfファイルに保存する方法を調べてみました。
大まかな手順は
- pdf から 画像形式(png or ppm)へ変換
- 画像ファイルに対し,tesseractを用いて文字認識,抽出,文字データの埋め込まれたpdfの作成
- 作成されたpdfファイル群を一つのpdfファイルにまとめる
です。以下では,順に説明していきます。
0. tesseractのインストール
と,その前に,tesseractのインストールを行います。Wikiにも書いてあることをそのまま書きます。詳しくはそちらを見てください。
Linux の場合:
apt
sudo apt-get install tesseract-ocr tesseract-ocr-jpn
pacman
pacman -S tesseract tesseract-data-eng tesseract-data-jpn
rpm
tesseract Download (DEB, RPM, TGZ, TXZ)
Mac OS X の場合:
MacPorts
sudo port install tesseract tesseract-jpn
Homebrew
brew install tesseract tesseract-jpn
Windows の場合:
ここ(https://github.com/tesseract-ocr/tesseract/wiki)からインストーラをダウンロードしてインストール
日本語データはtesseract-ocr/tessdataからzipダウンロードできるので,ダウンロード,解凍して,C:\Program Files\Tesseract OCR\tessdata
的なところにおく。
1. pdfから画像へ変換
僕がUbuntuを使用しているので,それに従った形で進めていきます。ご了承ください。
pdftoppm
コマンドを用いて,pdfをpng形式に変換します。
mkdir foo.d
pdftoppm -png foo.pdf foo.d/page
のようにすると,foo.dディレクトリ以下に,page-nnnnnn.png
(nnnnnn
はページ番号)のように画像ファイルが作られていきます。
ページ端に黒い線があったりする場合には,この時点で-x
,-y
,-W
,-H
オプションを指定することによって切り取っておくことをおすすめします。
2. 画像ファイルに対し,tesseractを用いて文字抽出,文字データの埋め込まれたpdf作成
Wikiにあるとおり,言語を指定したり,バージョン3.03以降であればデータが埋め込まれた状態でpdf出力することができます。
したがって,先ほどの例で言えばfoo.d
ディレクトリ以下のpage-001.png
みたいなファイルに対して,それぞれ
tesseract page-001.png -l eng+jpn pdf
のようにすれば,文字認識され,そのデータが埋め込まれたpage-001.pdf
が作成されます。
find "./foo.d" -type f -name "*.png" | sed 's/\.png$//' | xargs -P8 -n1 -I% tesseract %.png % -l eng+jpn pdf
のようにxargs
を使えば,foo.d
以下のpngファイルに対し,並列処理で実行できます。
3. 作成されたpdfファイル群を一つのpdfファイルにまとめる
pdftk
コマンドを使います。
foo.d
ディレクトリ以下のpdfファイルを,ページ番号順にまとめてfoo-ocr.pdf
として保存したいとき,以下のようにします。
pdftk ./foo.d/*.pdf cat output "foo-ocr.pdf"
残ったpngファイルやpdfファイルが不要な場合はfoo.d
ディレクトリを削除します。
シェルスクリプト化 (pdfocr)
以上の3つの過程をシェルスクリプトにまとめたものです。ご自由にお使いください。
pdfocr foo.pdf
とすると,同じディレクトリ内に文字データが埋め込まれたfoo-ocr.pdf
というpdfファイルが作成されます。
まとめ
スキャンしたpdfに対しても検索出来るようになり,便利になりました。ただし,tesseractが動いている間はCPU使用率がマックスになりますし,できた後のpdfは大体2倍くらいの容量になるので注意してください。また,自分でtesseract触ったことのある人なら分かるかと思いますが,まだまだ精度的な面で発展の余地があります。気休め程度に思って使ってみるのがいいと思います。