読者です 読者をやめる 読者になる 読者になる

野次馬エンジニア道

野次馬な気持ちでプログラミングをあれこれと綴ります

TesseractOCRのPythonバインディングでPDFからデータ抽出

PythonでPDFをOCRをかけてテキストデータに変換してみる。

PDFから画像に変換

PDFMinerが便利そう。早速

pip install pdfminer

画像の抜き出しは、

  • -O 画像の出力先
  • -p ページ数 (指定しない場合は全ページ)
pdf2txt.py -O image/ -p 4 source.pdf

Tesseract-OCRPythonバインディング

Tesseract-OCRPythonバインティングであるpython-tesseractを試す。

インストール方法は、HowToCompileForHomebrewMacを参考のこと

(2014/12/4時点の情報) この方法に従うと下記のバージョンになる

  • leptonica 1.7
  • tesseract 3.03

学習ツール

Tesseract 3.03

Tesseract-OCR Wiki:Compiling によると

make training

sudo make training-install

が必要。実際 /usr/local/Library/Formula/tesseract.rb を見てみると

system "./configure", "--disable-dependency-tracking", "--prefix=#{prefix}"

system "make install"

brewのインストールでは学習用の各種ツールがビルドされない。

ビルド

まず Tesseract-OCR Wiki: Compilingにある"(if you plan to make the training tools)"にある依存のライブラリをインストールする。

brew install icu4c pango cairo freetype

自分の環境ではXQuartzにも依存していた。ビルド自体はconfigureしてmake trainingするだけ*1

Leptonica 1.7

/usr/local/Library/Formula/leptonica rb を見ると、

depends_on 'libtiff' => :optional

入力データにtiffを使う場合は、:recomendedにしてからビルドした方がよい。

学習データの生成

詳細はTesseract-OCR Wiki: TrainingTesseract3

学習データはフォント(言語)毎に分かれる。下記の手順でunicharset、inttemp、normproto、pfftable というファイルを生成して統合する。

学習用の画像の生成

テキストからフォントを指定して生成することが可能。

text2image --text=training_text.txt --outputbase=[lang].[fontname].exp0 --font='Font Name' --fonts_dir=/path/to/your/fonts

利用できるフォント名は、

text2image --list_available_fonts

でも表示される。

Boxファイルの作成

ファイルの命名ルールは、

tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox

ここでは、英語でフォントが不明なもののデータを作ってみる。

tesseract test.jpg eng.Unknown.exp0 batch.nochop makebox
cp test.jpg eng.Unknown.exp0.png #名前を揃える

これが学習データ。テキストエディタで修正する*2 修正する場合、(0,0)が左上ではなくて左下なので注意。

学習(.trファイルの生成)

上記データを元に学習

tesseract eng.Unknown.exp0.png eng.Unknown.exp0 box.train.stderr

CharacterSetの生成

出現する可能性のある文字のセットを特定する。

unicharset_extractor eng.Unknown.exp0.box

unicharsetが生成される。

font_properties

フォントのスタイル(斜体とか太字など)に関する情報を別ファイルで与える。

Unknown 0 0 0 0 0

font_propertiesという名前で生成

クラスタリング

mftraining -F font_properties -U unicharset -O eng.unicharset eng.Unknown.exp0.box.tr eng.Unknown.exp1.box.tr

成功すると、inttemp、shapetable、pffmtableが生成される。

複数画像がある場合は、ここでまとめる。

cntraining eng.Unknown.exp0.box.tr eng.Unknown.exp1.box.tr

normprotoが生成される。

ファイルのマージ

inttemp、shapetable、pffmtable、normproto をリネームして頭に言語(ここでは、eng)をつけて下記を実行

combine_tessdata eng.

生成されたeng.traineddataを、環境に応じてtessdataにコピーする。

テスト

カレントにあるtessdataを見にいく

import tesseract
api = tesseract.TessBaseAPI()
api.Init(".","eng",tesseract.OEM_DEFAULT)
api.SetVariable("tessedit_char_whitelist", "0123456789abcdefghijklmnopqrstuvwxyz")
api.SetPageSegMode(tesseract.PSM_AUTO)
mImgFile = "test.jpg"
mBuffer=open(mImgFile,"rb").read()
tesseract.ProcessPagesBuffer(mBuffer,len(mBuffer),api)
result = api.GetUTF8Text()
print result

参考

*1:もし引っかかったら、training/Makefileを直接修正すると早い

*2:補助ツールなども色々ある模様 esseract-OCR Wiki: AddOns