はじめに
HyperEstraier は全文検索エンジンです.私は,手元にかき集めた論文なんかを検索するのに利用しています.近年はあまりアップデートされていませんし,各 Linux Distribution のレポジトリにも見つからない場合もありますが,長らく愛用しています.
HyperEstraier は,普通のテキストファイルの検索だけではなく,いくつかのフィルタ機能を用いて MS Word ファイルや PDF ファイルなどを検索対象とすることも可能です.HyperEstraier に予め同梱されているフィルタはシェルスクリプトで書かれており,ちょっといじれば他の形式の文書を検索することができます.
最近のプリンタはスキャン機能を搭載していて,紙に印刷された文書をPDFファイルに変換して取り込めますが,(勤め先のプリンタと同様に)OCR機能が備わっていなければ,いわゆるハードコピーだけが保管されます.論文のPDFファイルではテキスト情報も保管されているため,HyperEstraier で本文検索をすることができますが,このような"写真PDF"ではそのまま検索することができません.
そこで,Tessarect を使って,ハードコピーされたPDFファイルを検索できるようにしました.
ハードコピーPDFを検索する方法
準備するもの
ハードコピーPDF検索用のフィルタ
#! /bin/sh
#================================================================
# extscannedpdftotxt
# Convert Scanned PDF into plain text.
#================================================================
# set variables
PATH="$PATH:/usr/local/bin:$HOME/bin:." ; export PATH
progname="estscannedpdftotxt"
# check arguments
if [ $# -lt 1 ]
then
printf '%s: usage: %s infile [outfile]\n' "$progname" "$progname" 1>&2
exit 1
fi
infile="$1"
outfile="$2"
if [ -n "$ESTORIGFILE" ] && [ -f "$ESTORIGFILE" ]
then
infile="$ESTORIGFILE"
fi
# check the input
if [ "!" -f "$infile" ]
then
printf '%s: %s: no such file\n' "$progname" "$infile" 1>&2
exit 1
fi
# initialize the output file
if [ -n "$outfile" ]
then
rm -f "$outfile"
fi
# function to output
output(){
if [ -n "$outfile" ]
then
cat >> "$outfile"
else
cat
fi
}
# limit the resource
ulimit -v 262144 -t 10 2> "/dev/null"
# output the result
TMPNAME=`mktemp`
PDF_PAGE_LIMIT=10
pdftoppm -l $PDF_PAGE_LIMIT -png $infile $TMPNAME
for fn in $TMPNAME*png
do
tesseract $fn stdout -l jpn | output
rm $fn
done
rm $TMPNAME
# exit normally
exit 0
# END OF FILE
"# output the result" までは他のスクリプトと同内容です.pdftoppm により PDF ファイルの各ページを png ファイルに変換します.色々な文書を変換している際に,100ページを超えるファイルを処理しようとして hung up したので,念のため PDF_PAGE_LIMIT でページ数の制限を設けることにしました.
/tmp 以下に出力された各 png ファイルに対し,tesseract を用いてテキストに変換し,output に加えていきます.処理の済んだ png ファイルは順次消します.最後に /tmp 以下に作成されたディレクトリを削除して,PDFファイル1つが処理されたことになります.
estscannedpdftotxt を HyperEstraier の filter ディレクトリに配置したら,res ディレクトリに検索対象のPDFファイルを移動し,以下のスクリプトを実行します.HyperEstraier は仮に /home/user に置いてあるものとしています.
estcmd gather -lf -1 -cm -sd -fx ".pdf" "T@/home/user/hyperestraier/filter/estscannedpdftotxt" casket res