AlfrescoにOCR機能を追加してみる

会社では言うまでもないが、自宅でもOCR機能が必須。学校で配られたプリントが溜まっていくのを、写真やらスキャナやらで取り込んでデータとして溜め込むように変えられたら、狭い家が少しだけ広くなるだろう。

ということで、AlfrescoにOCR機能を入れてみたい。





色々と考えてみたり試してみたりした結論のソリューションは…

  • PDFをアップロードしたら、OCRが走って全文検索ができるようになる。
  • 写真はスマホ側で角を補正してPDF化し、それをアップロードする。

である。OCRはもう少し学習が必要な気がするものの、キーワードは引っ掛けてくれる程度には使える。また、写真の角補正はスマホにいっぱいあって、なんてーのか、餅は餅屋的な感覚で手軽だ。


やることは以下の通り。記事は試行錯誤を含むので、道標として。

  • Tesseract OCRのインストール
  • pdfsandwichのインストール
  • Alfresco Simple OCR Actionのインストール
  • Alfresco Simple OCR 呼び出し設定

OCRはもう少し学習したら本当に凄いことになりそうだけど、今回の記事を書いた時点でもかなり実用的。


■Tesseract OCRのインストール

最終目標のAlfrescoからOCR機能を呼び出す!はアドオンで実現。
Alfresco Simple OCR Action

これは、Alfresco上でフォルダに「ルールとして登録」するもので、起動されるとOCRソフトを呼び出すようになっている。では、サポートするOCRソフトは?というと、

  • pdfsandwich
  • OCRmyPDF
  • Windows.Media.OCR

と書かれている。この中で、Ubuntuで使えそうなのはpdfsandwichとOCRmyPDFだが、どちらもTesseract OCRというOCRソフトを利用している。

最初はUbuntuの標準パッケージ(3.02)をインストールしたが、試してみた結果、最新バージョンの4.00の方が一段と認識精度が高い。ということで、ソースから最新バージョンを構築する過程を記載する。

構築方法については、ここに詳しく書かれている。
Compilation guide for various platforms

まずは、構築に必要なアプリケーションやライブラリのパッケージをインストールする。

$ sudo apt-get install autoconf automake libtool autoconf-archive pkg-config libpng12-dev libjpeg8-dev libtiff5-dev zlib1g-dev

続いて、Tesseractが必要とする画像処理ライブラリ Leptonica のコンパイル。ソースはここからダウンロードして、展開、コンパイルする。
Leptonica ※この日の最終バージョンは Latest version: 1.74.1 (1/3/17) だった。

nbsp;wget http://www.leptonica.org/source/leptonica-1.74.1.tar.gz $ tar -zxvf leptonica-1.74.1.tar.gz $ cd leptonica-1.74.1/ $ ./configure $ make $ sudo make install Making install in src make[1]: ディレクトリ '/home/hogeuser/work/Leptonica/leptonica-1.74.1/src' に入ります make[2]: ディレクトリ '/home/hogeuser/work/Leptonica/leptonica-1.74.1/src' に入ります /bin/mkdir -p '/usr/local/lib' /bin/bash ../libtool --mode=install /usr/bin/install -c liblept.la '/usr/local/lib' libtool: install: /usr/bin/install -c .libs/liblept.so.5.0.1 /usr/local/lib/liblept.so.5.0.1 libtool: install: (cd /usr/local/lib && { ln -s -f liblept.so.5.0.1 liblept.so.5 || { rm -f liblept.so.5 && ln -s liblept.so.5.0.1 liblept.so.5; }; }) libtool: install: (cd /usr/local/lib && { ln -s -f liblept.so.5.0.1 liblept.so || { rm -f liblept.so && ln -s liblept.so.5.0.1 liblept.so; }; }) libtool: install: /usr/bin/install -c .libs/liblept.lai /usr/local/lib/liblept.la libtool: install: /usr/bin/install -c .libs/liblept.a /usr/local/lib/liblept.a libtool: install: chmod 644 /usr/local/lib/liblept.a libtool: install: ranlib /usr/local/lib/liblept.a libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/sbin" ldconfig -n /usr/local/lib ---------------------------------------------------------------------- Libraries have been installed in: /usr/local/lib If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the `LD_RUN_PATH' environment variable during linking - use the `-Wl,-rpath -Wl,LIBDIR' linker flag - have your system administrator add LIBDIR to `/etc/ld.so.conf' See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. ---------------------------------------------------------------------- /bin/mkdir -p '/usr/local/include/leptonica' /usr/bin/install -c -m 644 allheaders.h alltypes.h array.h arrayaccess.h bbuffer.h bilateral.h bmf.h bmfdata.h bmp.h ccbord.h dewarp.h endianness.h environ.h gplot.h heap.h imageio.h jbclass.h leptwin.h list.h morph.h pix.h ptra.h queue.h rbtree.h readbarcode.h recog.h regutils.h stack.h stringcode.h sudoku.h watershed.h '/usr/local/include/leptonica' make[2]: ディレクトリ '/home/hogeuser/work/Leptonica/leptonica-1.74.1/src' から出ます make[1]: ディレクトリ '/home/hogeuser/work/Leptonica/leptonica-1.74.1/src' から出ます Making install in prog make[1]: ディレクトリ '/home/hogeuser/work/Leptonica/leptonica-1.74.1/prog' に入ります make[2]: ディレクトリ '/home/hogeuser/work/Leptonica/leptonica-1.74.1/prog' に入ります /bin/mkdir -p '/usr/local/bin' /bin/bash ../libtool --mode=install /usr/bin/install -c convertfilestopdf convertfilestops convertformat convertsegfilestopdf convertsegfilestops converttopdf converttops fileinfo printimage printsplitimage printtiff splitimage2pdf xtractprotos '/usr/local/bin' libtool: install: /usr/bin/install -c .libs/convertfilestopdf /usr/local/bin/convertfilestopdf libtool: install: /usr/bin/install -c .libs/convertfilestops /usr/local/bin/convertfilestops libtool: install: /usr/bin/install -c .libs/convertformat /usr/local/bin/convertformat libtool: install: /usr/bin/install -c .libs/convertsegfilestopdf /usr/local/bin/convertsegfilestopdf libtool: install: /usr/bin/install -c .libs/convertsegfilestops /usr/local/bin/convertsegfilestops libtool: install: /usr/bin/install -c .libs/converttopdf /usr/local/bin/converttopdf libtool: install: /usr/bin/install -c .libs/converttops /usr/local/bin/converttops libtool: install: /usr/bin/install -c .libs/fileinfo /usr/local/bin/fileinfo libtool: install: /usr/bin/install -c .libs/printimage /usr/local/bin/printimage libtool: install: /usr/bin/install -c .libs/printsplitimage /usr/local/bin/printsplitimage libtool: install: /usr/bin/install -c .libs/printtiff /usr/local/bin/printtiff libtool: install: /usr/bin/install -c .libs/splitimage2pdf /usr/local/bin/splitimage2pdf libtool: install: /usr/bin/install -c .libs/xtractprotos /usr/local/bin/xtractprotos make[2]: 'install-data-am' に対して行うべき事はありません. make[2]: ディレクトリ '/home/hogeuser/work/Leptonica/leptonica-1.74.1/prog' から出ます make[1]: ディレクトリ '/home/hogeuser/work/Leptonica/leptonica-1.74.1/prog' から出ます make[1]: ディレクトリ '/home/hogeuser/work/Leptonica/leptonica-1.74.1' に入ります make[2]: ディレクトリ '/home/hogeuser/work/Leptonica/leptonica-1.74.1' に入ります make[2]: 'install-exec-am' に対して行うべき事はありません. /bin/mkdir -p '/usr/local/lib/pkgconfig' /usr/bin/install -c -m 644 lept.pc '/usr/local/lib/pkgconfig' make[2]: ディレクトリ '/home/hogeuser/work/Leptonica/leptonica-1.74.1' から出ます make[1]: ディレクトリ '/home/hogeuser/work/Leptonica/leptonica-1.74.1' から出ます

これで、/usr/local/bin にファイルができあがるらしい。

さあ、Tesseract OCR をコンパイルしよう。

$ sudo apt install git
$ git clone https://github.com/tesseract-ocr/tesseract.git
$ cd tesseract
$ ./autogen.sh
$ ./configure
$ LDFLAGS="-L/usr/local/lib" CFLAGS="-I/usr/local/include" make
$ sudo make install
Making install in arch
make[1]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/arch' に入ります
make[2]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/arch' に入ります
make[3]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/arch' に入ります
 /bin/mkdir -p '/usr/local/include/tesseract'
 /usr/bin/install -c -m 644 dotproductavx.h dotproductsse.h simddetect.h '/usr/local/include/tesseract'
・
・
・
make[3]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/tessdata/tessconfigs' から出ます
make[2]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/tessdata/tessconfigs' から出ます
make[2]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/tessdata' に入ります
make[3]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/tessdata' に入ります
make[3]: 'install-exec-am' に対して行うべき事はありません.
 /bin/mkdir -p '/usr/local/share/tessdata'
 /usr/bin/install -c -m 644 pdf.ttf '/usr/local/share/tessdata'
make[3]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/tessdata' から出ます
make[2]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/tessdata' から出ます
make[1]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/tessdata' から出ます
Making install in doc
make[1]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/doc' に入ります
make[2]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/doc' に入ります
make[2]: 'install-exec-am' に対して行うべき事はありません.
make[2]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/doc' から出ます
make[1]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/doc' から出ます
$ sudo ldconfig

トレーニングってなんだろ?と疑問に持ちつつも、ヘタレてついでにインストール。

$ sudo apt install libicu-dev libpango1.0-dev libcairo2-dev
$ ./configure
$ make training
$ sudo make training-install
make[1]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/training' に入ります
make[2]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/training' に入ります
 /bin/mkdir -p '/usr/local/bin'
 /bin/bash ../libtool --mode=install /usr/bin/install -c ambiguous_words classifier_tester cntraining combine_tessdata dawg2wordlist lstmeval lstmtraining mftraining set_unicharset_properties shapeclustering text2image unicharset_extractor wordlist2dawg '/usr/local/bin'
libtool: install: /usr/bin/install -c .libs/ambiguous_words /usr/local/bin/ambiguous_words
libtool: install: /usr/bin/install -c .libs/classifier_tester /usr/local/bin/classifier_tester
libtool: install: /usr/bin/install -c .libs/cntraining /usr/local/bin/cntraining
libtool: install: /usr/bin/install -c .libs/combine_tessdata /usr/local/bin/combine_tessdata
libtool: install: /usr/bin/install -c .libs/dawg2wordlist /usr/local/bin/dawg2wordlist
libtool: install: /usr/bin/install -c .libs/lstmeval /usr/local/bin/lstmeval
libtool: install: /usr/bin/install -c .libs/lstmtraining /usr/local/bin/lstmtraining
libtool: install: /usr/bin/install -c .libs/mftraining /usr/local/bin/mftraining
libtool: install: /usr/bin/install -c .libs/set_unicharset_properties /usr/local/bin/set_unicharset_properties
libtool: install: /usr/bin/install -c .libs/shapeclustering /usr/local/bin/shapeclustering
libtool: install: /usr/bin/install -c .libs/text2image /usr/local/bin/text2image
libtool: install: /usr/bin/install -c .libs/unicharset_extractor /usr/local/bin/unicharset_extractor
libtool: install: /usr/bin/install -c .libs/wordlist2dawg /usr/local/bin/wordlist2dawg
make[2]: 'install-data-am' に対して行うべき事はありません.
make[2]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/training' から出ます
make[1]: ディレクトリ '/home/hogeuser/work/tesseract-ocr/tesseract/training' から出ます

よくわからないけど、デバッグに活用できるらしいこれも作っておいた。

$ make ScrollView.jar

Tesseractは言語データを使って文字を解析するらしいので、これを用意する。用意する先は /usr/local/share/tessdata になっている。日本語と英語のデータをダウンロードしておく。

$ cd /usr/local/share/tessdata/
$ sudo wget https://github.com/tesseract-ocr/tessdata/raw/3.04.00/osd.traineddata
$ sudo wget https://github.com/tesseract-ocr/tessdata/raw/3.04.00/equ.traineddata
$ sudo wget https://github.com/tesseract-ocr/tessdata/raw/4.00/eng.traineddata
$ sudo wget https://github.com/tesseract-ocr/tessdata/raw/4.00/jpn.traineddata
$ ll
合計 87008
drwxr-xr-x 4 root root     4096 5月 28 19:02 ./
drwxr-xr-x 9 root root     4096 5月 28 18:42 ../
drwxr-xr-x 2 root root     4096 5月 28 18:42 configs/
-rw-r--r-- 1 root root 31873501 5月 28 19:01 eng.traineddata
-rw-r--r-- 1 root root  2251826 5月 28 19:00 equ.traineddata
-rw-r--r-- 1 root root 44380238 5月 28 19:02 jpn.traineddata
-rw-r--r-- 1 root root 10562727 5月 28 19:00 osd.traineddata
-rw-r--r-- 1 root root      572 5月 28 18:42 pdf.ttf
drwxr-xr-x 2 root root     4096 5月 28 18:42 tessconfigs/

こんな感じでファイルがダウンロードできた。

※このtraineddataだが、tessdataではなくtessdata_fastから持ってくるのが正しい。2chに当記事が取り上げられているのを発見、適用時の注意点として記載されていたことから確認したところ、tessdata_fastが配布されるべきファイルと記載されている。また、jpn_vertに縦書きの対応が入っているとのこと。2018/04/15追記

試してみる。

$ sudo tesseract test.tif result -l jpn --psm 6 --oem 2
$ sudo tesseract photo.jpg result -l jpn --psm 6 --oem 2

前処理を全く行っていないので、認識精度は低い。けれども、その段階でも 3.02 と 4.00 で比較してみたら、4.00 の方が正しく認識できた単語が多かった。

とはいえ、この段階では「これで認識できるのかな?」と少し不安になるレベル。実はこの後に準備する pdfsandwich が文書の角度をきちんと揃える等の前処理を行ってくれることで、OCRの精度が格段に向上するので、もう少し頑張ってみよう。
※もっとも、商用レベル?といわれるとそれほどでも…このあたりは求めるレベルで判断が変わってくるので、試してみて欲しい。

※縦書きへの対応には -l jpn+jpn_vert とパラメータを与えるのが正しいと件のレスに記載されていたことも記しておきます。2018/04/15追記


■pdfsandwichのインストール

OCRでテキストを読み出したとして、それはどこに保存されるの?と思ったら、なんとそれはPDFの中に埋め込まれるのだ。それぞれの文字の上に、抽出した文字が透明な文字列として貼られ、これが検索時に使われるのだ!

今回は pdfsandwich を利用することにした。

まずは、pdfsandwich が利用する Unpaper を用意する。これは、標準パッケージで大丈夫。

$ sudo apt install unpaper

次に、pdfsandwich を構築する。やり方はここに書いてある。
pdfsandwich: A tool to make “sandwich” OCR pdf files

実は、pdfsandwichのパッケージはdeb形式が用意されているが、今回はTesseract OCRを手作業で作成したことから、依存関係が解決できなくなるためインストールできなかった。仕方がないので、ソースから構築することに。

$ sudo apt install ocaml-nox
$ svn checkout svn://svn.code.sf.net/p/pdfsandwich/code/trunk/src pdfsandwich
$ cd pdfsandwich/
$ ./configure
$ make
echo "let pdfsandwich_version=\"0.1.6\";; (*automatically generated from file pdfsandwich_version*)" > pdfsandwich_version.ml
ocamlopt -thread -w s str.cmxa unix.cmxa threads.cmxa -c pdfsandwich_version.ml
ocamlopt -thread -w s str.cmxa unix.cmxa threads.cmxa -o pdfsandwich pdfsandwich_version.cmx pdfsandwich.ml
# you need gawk for this:
./txt2man -t PDFSANDWICH manual.txt | gzip -9 > pdfsandwich.1.gz
$ ./txt2man -t PDFSANDWICH manual.txt | gzip -9 > pdfsandwich.1.gz
$ sudo make install
(umask 0022; mkdir -p /usr/local/bin /usr/local/share/doc/pdfsandwich /usr/local/share/man/man1)
install -s pdfsandwich /usr/local/bin
cp copyright changelog /usr/local/share/doc/pdfsandwich
gzip -9 /usr/local/share/doc/pdfsandwich/changelog
cp pdfsandwich.1.gz /usr/local/share/man/man1
chmod 644 /usr/local/share/doc/pdfsandwich/* /usr/local/share/man/man1/*

黄色部分は手順に書かれていなかったけれども、makeの結果出力されたことなのでやってみたもの。

これでpdfsandwichが構築できた。バージョンを調べてみると…

$ pdfsandwich -version
pdfsandwich version 0.1.6

大丈夫みたい。


■Alfresco Simple OCR Actionのインストール

いよいよ、Alfrescoにアドインを追加する。

Alfresco Simple OCR Actionのインストール方法はここに。
Simple OCR action for Alfresco

ここでは、AMPファイルをダウンロードしてくるのだが、そのAMPのインストール方法はここに。
Install the AMP file

一言で言うと、

  • Alfrescoの追加パッケージはamp(Alfresco Module Package)という形式のファイル。
  • ampをtomcat/webapps/にあるalfresco.warに追加する。

ということの模様。

前回の記事でインストール先は /usr/share/alfresco とした。その前提で、ampファイルをダウンロードし、alfresco.warへの追加について事前チェックをしてみる。

$ cd /usr/share/alfresco/amps
$ sudo wget https://github.com/keensoft/alfresco-simple-ocr/releases/download/1.1.1/simple-ocr-repo.amp
$ cd /usr/share/alfresco
$ sudo java -jar bin/alfresco-mmt.jar install amps/simple-ocr-repo.amp tomcat/webapps/alfresco.war -preview
Installing AMP 'amps/simple-ocr-repo.amp' into WAR 'tomcat/webapps/alfresco'
INFO: Checking the war version using /WEB-INF/classes/alfresco/version.properties
Adding files relating to version '1.1.1.1609250928' of module 'simple-ocr-repo'
 - File '/WEB-INF/lib/simple-ocr-repo.jar' added to war from amp
 - File '/WEB-INF/classes/alfresco/module/simple-ocr-repo/context/bootstrap-context.xml' added to war from amp
 - File '/WEB-INF/classes/alfresco/module/simple-ocr-repo/context/model-context.xml' added to war from amp
 - File '/WEB-INF/classes/alfresco/module/simple-ocr-repo/context/service-context.xml' added to war from amp
 - Directory '/WEB-INF/classes/alfresco/module/simple-ocr-repo/context' added to war
 - File '/WEB-INF/classes/alfresco/module/simple-ocr-repo/messages/simple-ocr-repo.properties' added to war from amp
 - File '/WEB-INF/classes/alfresco/module/simple-ocr-repo/messages/simple-ocr-repo_de.properties' added to war from amp
 - File '/WEB-INF/classes/alfresco/module/simple-ocr-repo/messages/simple-ocr-repo_es.properties' added to war from amp
 - File '/WEB-INF/classes/alfresco/module/simple-ocr-repo/messages/simple-ocr-repo_it.properties' added to war from amp
 - File '/WEB-INF/classes/alfresco/module/simple-ocr-repo/messages/simple-ocr-repo_pt.properties' added to war from amp
 - Directory '/WEB-INF/classes/alfresco/module/simple-ocr-repo/messages' added to war
 - File '/WEB-INF/classes/alfresco/module/simple-ocr-repo/model/ocr-model.xml' added to war from amp
 - Directory '/WEB-INF/classes/alfresco/module/simple-ocr-repo/model' added to war
 - File '/WEB-INF/classes/alfresco/module/simple-ocr-repo/alfresco-global.properties' added to war from amp
 - File '/WEB-INF/classes/alfresco/module/simple-ocr-repo/log4j.properties' added to war from amp
 - File '/WEB-INF/classes/alfresco/module/simple-ocr-repo/module-context.xml' added to war from amp
 - Directory '/WEB-INF/classes/alfresco/module/simple-ocr-repo' added to war

事前チェックでは行けそうな気配。では、実際にalfresco.warに追加する。

$ sudo java -jar bin/alfresco-mmt.jar install amps/simple-ocr-repo.amp tomcat/webapps/alfresco.war
$ sudo service alfresco restart
$ java -jar bin/alfresco-mmt.jar list tomcat/webapps/alfresco.war
Module 'alfresco-aos-module' installed in 'tomcat/webapps/alfresco.war'
 - Title: Alfresco Office Services Module
 - Version: 1.1.5
 - Install Date: Sun May 21 20:30:44 JST 2017
 - Description: Allows applications that can talk to a SharePoint server to talk to your Alfresco installation
Module 'simple-ocr-repo' installed in 'tomcat/webapps/alfresco'
 - Title: simple-ocr-repo Repository AMP project
 - Version: 1.1.1.1609250928
 - Install Date: Mon May 29 05:58:13 JST 2017
 - Description: Manages the lifecycle of the simple-ocr-repo Repository AMP (Alfresco Module Package)
Module 'org.alfresco.integrations.google.docs' installed in 'tomcat/webapps/alfresco.war'
 - Title: Alfresco / Google Docs Integration
 - Version: 3.0.3
 - Install Date: Sun May 21 20:30:43 JST 2017
 - Description: The Repository side artifacts of the Alfresco / Google Docs Integration.
Module 'alfresco-share-services' installed in 'tomcat/webapps/alfresco.war'
 - Title: Alfresco Share Services AMP
 - Version: 5.2.0
 - Install Date: Sun May 21 20:30:37 JST 2017
 - Description: Module to be applied to alfresco.war, containing APIs for Alfresco Share

本当はこれで追加されたampが表示されると思ったのだが…いやはや、Alfrescoのマニュアルにあるようには表示されなかった。でも、ちゃんと動作はする。
追加されたampが表示される。
※表示がされていなかったのは、alfresco.warというファイルではなく、alfrescoディレクトリに追加をしてしまっていたから。2017/6/13追記


■Alfresco Simple OCR 呼び出し設定

このアドインではPDFの中身を分析しないので、登録されたPDFがテキストデータを含んでいても関係なく全てを処理する。よって、OCRに掛けたいPDFを投入するフォルダを決めておいて、そこにアドインを呼び出すルールを適用して運用してくことになる。

まずは、Aflrescoの設定を一部変更し、アドインが動くようにする。
/usr/share/alfresco/tomcat/shared/classes/alfresco-global.properties
…

### External executable locations ###
ooo.exe=/usr/share/alfresco/libreoffice/program/soffice.bin
ooo.enabled=true
ooo.port=18100
#img.root=/usr/share/alfresco/common
#img.dyn=${img.root}/lib
#img.exe=${img.root}/bin/convert
img.root=/usr/share/doc/imagemagick
img.dyn=/usr/lib/x86_64-linux-gnu
img.exe=/usr/bin/convert### Alfresco Simple OCR ###
ocr.command=/usr/local/bin/pdfsandwich
ocr.output.verbose=true
ocr.output.file.prefix.command=-o

ocr.extra.commands=-verbose -rgb -lang jpn
ocr.server.os=linux

imgの設定は、ImageMagickをパッケージ内包バージョンの呼び出しから、現在の環境で準備しているImageMagickの呼び出しに変更をするもの。内包しているコマンドを使うとpdfsandwichの処理でエラーが解消できなかった。
以下の情報を問題解消の参考にした。
How to install Alfresco 5.0.a Community Edition on Ubuntu 14.04 LTS

Alfresco Simple OCR のセクションは手動で追加する。

次に、OCRを掛ける事に決めたフォルダに「Alfresco Simple OCRを呼び出すルール」を作る。
作成したルールは以下。

  • 名前:PDFにOCRをかける
  • 説明:何でも良さそう、適当に入れてみた
  • 実行条件1:アイテムがこのフォルダに作成または入力された時
    実行条件2:アイテムが更新された時
  • 「すべての条件をみたす場合」にチェックを入れて、
    MIMEタイプがAdobe PDF Document、
    実行するアクションとしてExtract OCRを選択、
    「Continue on error」にチェック
  • その他オプション
    ルールをバックグラウンドで実行する のみチェック

きっと、ルールというものをもっと分かってくれば、もっと便利で使いやすいルールが作れそうな予感がするが、まずはOCR機能を呼び出せるようにしよう。

このフォルダにスキャンしたPDFをアップロードしてみると…通常とは違い、何か時間がかかる。って当たり前で、pdfsandwichが一生懸命OCR処理をしてくれ、バーション1.0の元ドキュメント、バージョン1.1の透明テキストが付いたドキュメントが登録される。

モノによっては結構な認識をする、ちょっといい感じ!ダメなときはとことんダメだけど…。


■ケータイ端末にアプリケーションを導入

2つのアプリケーションをインストール。

まずは、写真をPDFにしてくれるソフト。今回はどんなアプリケーションを使っても、PDFにできればいいと思う。私が選んだのは Genius Scan – PDF Scanner 。iPhone時代からお世話になっていて、便利に使えていたもの。どんなアプリケーションでもきっと大丈夫だろうと思う。

紙を撮影しようとしたら、四角を自動認識してくれて、自動でシャッターが切られた。以前に比べてだいぶ進化しているようだった。SDカードにPDFというフォルダを作って保存してみた。

続いて、Alfresco Content Services 。インストールして接続先を設定、ユーザー&パスワードを入れるとログインできた。なお、httpsで接続する場合には、CAの証明書をインストールしておけばOK(実際、最初はhttpsで接続するときにこのサーバー怪しいけど?って怒られたw)。

ファイルをアップロードする操作について、AlfrescoではSDカードに保存したPDFフォルダが見つけられなかった。そこで、アプリケーション「ファイルマネージャー(私が使っているASUSの端末にあるアプリ)」を選んでファイル選択をしてみたところ、アップロードができた。
ただし、この方法だと複数ファイルを一括で処理できないので、保存先をSDカードではなく本体にするなど、何らかの方法を探さなければ…というところ。

なお、先程ルール作成のタイミングで「ルールをバックグラウンドで実行する」をチェックしたけど、チェックしないとOCR処理が終わるまで待たされることに。結構な時間がかかって待ちきれない自分が居たので、バックグラウンドで実行することにした。
実際、ファイルはサクサク登録できたほうが精神衛生的にいい。しばらく放っておけばOCR処理されたバージョン1.1の文書ができあがるんだから。


■所感

いままでこうした処理はEvernoteでやろうと思ってた。で、Evernoteが端末台数を制限し始めたからOneNoteに移行、これはこれで便利だ!って思ってた。でも、その感覚は家族に通じない…

今回の場合は、写真を撮っておいてくれさえすれば、オペレータをやってもいいかなぁ、と思える。だって、ユーザーやグループ、アクセス権のコントロールは全て自分で設定できるんだから。

そして、結果、ブラウザでそのファイルにアクセスできる、簡単に検索できる、となれば彼らもその気になるだろう…と期待。


■今回やったけど失敗したこと(Ubuntu16標準のTesseract OCRインストール)

Ubuntu16にTesseract OCRをインストール方法はここに。

Tesseract OCR: Installation and Usage on Ubuntu 16.04

早速、インストール。

$ sudo apt install tesseract-ocr tesseract-ocr-eng tesseract-ocr-jpn

ImageMagicというのも必要だが、これは既にインストールされているハズ。

$ convert -version
Version: ImageMagick 6.8.9-9 Q16 x86_64 2017-03-14 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC
Features: DPC Modules OpenMP
Delegates: bzlib cairo djvu fftw fontconfig freetype jbig jng jpeg lcms lqr ltdl lzma openexr pangocairo png rsvg tiff wmf x xml zlib

手元にあったPDFをTIFFに変換。

$ convert test.pdf test.tif

このTIFFをOCRにかけてみる。

$ tesseract test.tif -l jpn result
Tesseract Open Source OCR Engine v3.04.01 with Leptonica
TIFFFetchNormalTag: Warning, ASCII value for tag "ICC Profile" does not end in null byte. Forcing it to be null.
Warning in pixReadFromTiffStream: bpp = 64; stripping 16 bit rgb samples down to 8
Page 1
Detected 28 diacritics
TIFFFetchNormalTag: Warning, ASCII value for tag "ICC Profile" does not end in null byte. Forcing it to be null.

前処理を掛けていないから仕方がないのだが、ほとんど認識しなかった。
そのため、最新バージョンを使うことを思い立った。最新バージョンも前処理を掛けて居ないがゆえに認識精度は低かったが、それでも精度は上がったのでこれで行ってみようと考えた。


■今回やったけど失敗したこと(パッケージ内包のImageMagickをpdfsandwichで呼び出す)

意識していたわけではないが、結果的には「手動で作成したpdfsandwich」→「パッケージ内包のImageMagick」という呼び出しになっていた。

これだと、何度やってもエラーになる。

2017-05-29 07:31:33,948 INFO  [es.keensoft.alfresco.ocr.OCRTransformWorker] [http-apr-18080-exec-3] EXIT VALUE: 2
2017-05-29 07:31:33,948 INFO  [es.keensoft.alfresco.ocr.OCRTransformWorker] [http-apr-18080-exec-3] STDOUT: pdfsandwich version 0.1.6
Checking for convert:
convert -version
Version: ImageMagick 6.9.1-10 Q16 x86_64 2015-08-12 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC Modules
Delegates (built-in): freetype jng jpeg ltdl png tiff wmf

Checking for unpaper:
unpaper -V
6.1
Checking for tesseract:
tesseract -v
tesseract 4.00.00alpha
 leptonica-1.74.1
  libjpeg 8d (libjpeg-turbo 1.4.2) : libpng 1.2.54 : libtiff 4.0.6 : zlib 1.2.3

 Found SSE
Checking for gs:
gs -v
GPL Ghostscript 9.18 (2015-10-05)
Copyright (C) 2015 Artifex Software, Inc.  All rights reserved.
Checking for pdfinfo:
pdfinfo -v
Checking for pdfunite:
pdfunite -v
Input file: "/usr/share/alfresco/tomcat/temp/Alfresco/OCRTransformWorker_source_2139719507575381418.pdf"
Output file: "/usr/share/alfresco/tomcat/temp/Alfresco/OCRTransformWorker_source_2139719507575381418_ocr.pdf"
Number of pages in inputfile: 1
More threads than pages. Using 1 threads instead.
Processing page 1.
identify -format "%w\n%h\n"  "/tmp/pdfsandwich_inputfile63abdd.pdf[0]"
convert -units PixelsPerInch  -type Bilevel -density 300x300  "/tmp/pdfsandwich_inputfile63abdd.pdf[0]" /tmp/pdfsandwich436dfb.pbm

2017-05-29 07:31:33,948 INFO  [es.keensoft.alfresco.ocr.OCRTransformWorker] [http-apr-18080-exec-3] STDERR: unpaper: /usr/share/alfresco/common/lib/libz.so.1: no version information available (required by /usr/lib/x86_64-linux-gnu/libavformat-ffmpeg.so.56)
unpaper: /usr/share/alfresco/common/lib/libz.so.1: no version information available (required by /usr/lib/x86_64-linux-gnu/libavcodec-ffmpeg.so.56)
gs: /usr/share/alfresco/common/lib/libz.so.1: no version information available (required by /usr/lib/x86_64-linux-gnu/libgs.so.9)
gs: /usr/share/alfresco/common/lib/libz.so.1: no version information available (required by /usr/lib/x86_64-linux-gnu/libcups.so.2)
pdfinfo version 0.41.0
Copyright 2005-2016 The Poppler Developers - http://poppler.freedesktop.org
Copyright 1996-2011 Glyph & Cog, LLC
pdfunite version 0.41.0
Copyright 2005-2016 The Poppler Developers - http://poppler.freedesktop.org
Copyright 1996-2011 Glyph & Cog, LLC
Syntax Error (24): Illegal character '}'
identify: UnableToOpenConfigureFile `delegates.xml' @ warning/configure.c/GetConfigureOptions/706.
identify: NoDecodeDelegateForThisImageFormat `PDF' @ error/constitute.c/ReadImage/501.
Warning: could not determine page size; defaulting to A4.
convert: UnableToOpenConfigureFile `delegates.xml' @ warning/configure.c/GetConfigureOptions/706.
convert: NoDecodeDelegateForThisImageFormat `PDF' @ error/constitute.c/ReadImage/501.
convert: NoImagesDefined `/tmp/pdfsandwich436dfb.pbm' @ error/convert.c/ConvertImageCommand/3230.
ERROR: Command "convert -units PixelsPerInch  -type Bilevel -density 300x300  "/tmp/pdfsandwich_inputfile63abdd.pdf[0]" /tmp/pdfsandwich436dfb.pbm" failed.
Terminating pdfsandwich. All temporary files are kept.

2017-05-29 07:31:33,948 WARN  [es.keensoft.alfresco.ocr.OCRExtractAction] [http-apr-18080-exec-3] workspace://SpacesStore/609d4f69-6528-4687-b004-3124eb794a32: Node does not exist: workspace://SpacesStore/609d4f69-6528-4687-b004-3124eb794a32 (status:null)

理由は、Alfresco内蔵のImageMagickを利用していたから…らしい。

トラブル解決のために色々と調べてみると、元々あるパッケージを使ったシステムに変えていくこともできるかなー、という気になってくる。たとえばLibreOfficeとか、今になると元々あるパッケージを使えそうな気がする。


■今回やったけど失敗したこと(アドインの追加先誤り)

Alfrescoの起動と終了に物凄く時間がかかる…どういうこと?と調べてみたら、こんなことに。

$ ll /usr/share/alfresco/tomcat/webapps/
合計 323528
drwxr-xr-x 13 root root      4096 6月 13 06:16 ./
drwxr-xr-x 12 root root      4096 5月 21 20:30 ../
drwxr-xr-x  6 root root      4096 5月 21 20:35 ROOT/
-rw-r--r--  1 root root    274613 2月 15 01:13 ROOT.war
drwxr-xr-x  4 root root      4096 5月 21 20:35 _vti_bin/
-rw-r--r--  1 root root    763358 12月 19 23:13 _vti_bin.war
drwxr-xr-x 10 root root      4096 6月 13 06:16 alfresco/
drwxr-xr-x 10 root root      4096 5月 21 20:32 alfresco-1495973256362.bak/
drwxr-xr-x 10 root root      4096 5月 28 21:07 alfresco-1496005089894.bak/
drwxr-xr-x 10 root root      4096 5月 29 05:58 alfresco-1497302196614.bak/
-rw-r--r--  1 root root 156168051 5月 21 20:30 alfresco.war
drwxr-xr-x  5 root root      4096 5月 21 20:29 host-manager/
drwxr-xr-x  5 root root      4096 5月 21 20:29 manager/
drwxr-xr-x 14 root root      4096 6月 13 06:16 share/
-rw-r--r--  1 root root  73639664 5月 21 20:30 share.war
drwxr-xr-x  8 root root      4096 5月 21 20:34 solr4/
-rw-r--r--  1 root root 100380074 2月 15 01:01 solr4.war

結果として、起動時にAlfrescoが3つ重なって起動することに。終了時には色々不具合が起きるらしく、途方もない時間がかかるようになる。

原因は、

$ sudo java -jar bin/alfresco-mmt.jar install amps/simple-ocr-repo.amp tomcat/webapps/alfresco.war

とすべきところ、

$ sudo java -jar bin/alfresco-mmt.jar install amps/simple-ocr-repo.amp tomcat/webapps/alfresco

としてしまったこと。

問題解決には以下を行う。

  • Alfrescoを停止させる。
  • bakの付いたディレクトリを削除する。
  • /usr/share/alfresco/bin/apply_amps.sh を実行する。
  • Alfrescoを開始する。

apply_amps.shは amps と amps_share に格納されているAMPファイルを組み込み、tomcatのキャッシュをクリアする。ココで書いた手順通りなら、AMPファイルは上記2つのディレクトリに入っているから、alfrescoにモジュールを追加してくれる。

お気軽にどうぞ ~ 投稿に関するご意見・感想・他

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です