その事前準備のライブラリをインストールする
# yum install autoconf automake libtool # yum install libpng-devel libjpeg-devel libtiff-devel zlib-devel # yum install libicu-devel # yum install pango-devel
途中のmakeでmakeでICU(文字コード変換ライブラリ)が必要になるらしいが、
パッケージが無いので、
icu4c をmakeからインストールする
# cd /usr/local/src/ # sudo wget http://download.icu-project.org/files/icu4c/56rc/icu4c-56_rc-src.tgz # tar zxf icu4c-56_rc-src.tgz # cd icu/source/ # ./configure # make # make install
Leptonica という画像解析ライブラリも必要なので、
こちらも、makeからインストール 1.76が最新
# cd /usr/local/src/# wget http://www.leptonica.com/source/leptonica-1.76.0.tar.gz
# tar -xzvf leptonica-1.76.0.tar.gz # cd leptonica-1.76.0 # ./configure # make # make install
tesseract-ocrと辞書のインストール
# cd /usr/local/src/# wget https://github.com/tesseract-ocr/tesseract/archive/3.04.01.tar.gz
# mv 3.04.01.tar.gz tesseract3.01.01.tar.gz
# tar -zxvf tesseract3.01.01.tar.gz
# cd tesseract-3.04.01/
#./autogen.sh
# LDFLAGS="-L/usr/local/lib" CFLAGS="-I/usr/local/include" ./configure --with-training-tools
# make
# make install
# ldconfig
更に、設定ファイルを定義
取敢えず英語の場合、
tesseract-ocr-3.02.eng.tar.gzをどこからか探してくる。
/usr/local/share/tessdate/配下に 中身をコピーする。
これで、ようやくocrが使える。
# pdftoppm 0000.pdf 0000out これで、0000ont.ppmが生成されるので、
これをocrに掛ける。
画像が大きい場合は、optionでトリミングしたりする。
$ pdftoppm /storage1/scanedPdf/20180613133511305.pdf -f 1 -l 1 -mono -x 110 -y 45 -W 140 -H 35 -png /storage1/scanedPdf/mono
こんな感じで使う。
mono-1.pngをocrに掛ける。
$ tesseract /storage1/scanedPdf/mono-1.png /storage1/scanedPdf/mono
mono.txtが生成されるので、
これをトリミングして、
欲しい部分だけにする。
$ cat ./mono.txt|tr -d '\n''' > ./mono0.txt
$ cat ./mono0.txt|tr -d ' ' > ./mono1.txt
これで、mono1.txtには
10xx-1XXXXXX が記載されている。
これを使って元のPDFのリネームを行いたい。
ハイフンの全角「ー」と「-」半角を認識する様で、
全角で読み込んでしまうことが有ったので、
nkf コマンドですべて半角にしてしまう事にする。
# yum install nkf
コマンドの際は、
cat $filename-0.txt|nkf -Z4 > $filename.txt
-Zで 全角⇒半角だが、 helpによると-Z4は
JISX0208 Katakana to JISX0201 Katakanaとなっており、
どうもこの方が精度が良いようなので、-Z4でやってみる。
#!/bin/bash
#tesseractのパスを通す
export PATH="/usr/local/bin:$PATH"
#ディレクトリ移動
echo "ディレクトリを移動"
cd /storage1/scanedPdf/
#while用にディレクトリ内のファイル数をカウント
count=$(ls | wc -w)
echo "ディレクトリ内のファイル数:"$count
#カウントが0以上なら、ループ処理を行う。
#-ne not equal
while [ $count -ne 0 ]
do
#一行づつ処理するために念のため仕掛ける。いきなり変数でも問題ない。
for file in `\find . -maxdepth 1 -name '*.pdf'| head -n1`; do
basename $file .pdf
done
#変数定義
filename=$(basename $file .pdf)
#pdftoppmでpdfデータの左上(0,0)基準の座標(100,45)から座標(290,80)までを切り出しモノクロのpngを生成する。
pdftoppm $filename.pdf -f 1 -l 1 -mono -x 100 -y 45 -W 190 -H 35 -png /storage1/scanedPdf/$filename
#上記のpngをOCRで読み取り、テキストファイルを生成する。
#-1は「ファイル名-1.png」が生成されてしまうため、この-1が必要となる。
tesseract $filename-1.png -psm 6 $filename-1
#テキストデータ内の半角スペースを削除する
cat $filename-1.txt|tr -d ' ' > $filename-2.txt
#テキストデータ内の全角―を半角-に書き換える
cat $filename-2.txt|nkf -Z4 > $filename.txt
#変数定義
pdfname=$(head -n 1 $filename.txt)
echo $pdfname
#pdfの名称を1xxx-1xxxxxの形に変更して、/storage1/pdf/に移動
mv ./$filename.pdf /storage1/pdf/$pdfname.pdf
#作業ファイルを削除
rm $filename*
#カウントのデクリメント
count=$(( count -1))
done
上手く動いた。
当初、パスを通していなかったため、上手く動かなかったが、cronでも問題なく動いた。
複合機で一つ一つのファイルを開いて中身を確認して名称を付けるのは非常に面倒くさいし、もの凄い時間を浪費する。
これは、かなり便利だと思う。