ウチの中に紙がたくさんたまる。子供が持って帰ってくる手紙が中心だけれど、それなりに色々ある。
気にしないで捨ててしまえば良いのだが、そういうわけにもいかないと言われ、電子化して捨てようよ、と結論した。
とはいえ、ウチの複合機(DCP-J963N)はスキャンした情報を保管するためにPCを起動しておく必要がある。
フォルダへの保存も、メール送信(これはメーラーが起動するらしい)も、PCが起動していることが前提になっている。
Linuxサーバーはいつも起動しっぱなしなんだから、それを使えないものかと探していたら、スキャンキーツールというのが見つかった。
はじめに整理しておくこと
スキャンしてファイルが保管されるまでの違い
いままで会社で使っていた複合機はたいてい、保管先のSMB設定をしておいて、画像の取り込み条件(カラー/白黒、解像度、縦横、PDF/TIFF等の保存形式)を都度指定してスキャン、スタートボタンを押すとファイルが保存される、といった具合の動作をする。
ウチにあるBrotherのコンシューマー向け複合機(DCP-J963N)はそうではなく、Brother Utilitiesの中にある「スキャンキー設定」で保管先・画像の取り込み条件を指定しておき、複合機の側ではホストを指定してスキャンを開始するとファイルが保存される。
どちらが良い?といわれるとどちらも一長一短な気がしていて、
会社タイプ → SMBのパスワードを変えたとき、複合機のパスワードを変える必要がある。
Brotherタイプ → 実質、全てカラーで取らなきゃなので容量を食う。PDFの場合、縦横を後から編集する必要がある。
くらいの差だが、PDFの縦横を後から編集は結構めんどくさい。
特に、AlfrescoでPDF TOOLSが上手く動作させられないので、PDFの回転のためだけにPresto! PageManagerで編集するのがプチストレス。
この対策は後で考えることにして、今回はPDFを保管できるところまでに専念する。
ドライバとスキャンキーツール
ドライバ
ドライバはSANE(Scanner Access Now Easy)と連携してスキャナと通信する役割を担うらしい。
SANE自体が多くのスキャナをサポートしていて、USBでもネットワークでも使えるようだが、幾つかのメーカーはSANEと連携する独自のドライバを用意している。
ubuntu documentation / SANE
arch linux / SANE/スキャナー別の問題
スキャンキーツール
スキャンキーツールは、スキャナに向かって「ここに画像を取り込むホストがいるぞ!」と手を上げていて、指名される(複合機では [PC選択] とされている)とスキャナに「こんな条件で読み取って画像をくれ」と伝え、受け取った画像を保管する役割を担っている。
取り込む条件をテキストで指定し、画像を取り込んだ後の動作をスクリプトで定義しておけば動作する。
スキャンキーツールの使い方の説明になかなかたどり着けなかったのでメモしておく。
brother / DCP-J963N-B/W / スキャンキーツールの使い方(Linux)
インストール
ダウンロード
ここから、スキャナドライバとスキャンキーツールをダウンロードしてくる。
brother / DCP-J963N-B/W / スキャナードライバー Linux
この日にダウンロードしたパッケージのバージョンは brscan4-0.4.9-1.amd64.deb, brscan-skey-0.3.1-1.amd64.deb だった。
この後、スキャンキーツールは設定をいじるので、中身をメモしておく。
$ dpkg -c brscan-skey-0.3.1-1.amd64.deb drwxr-xr-x root/root 0 2019-11-27 16:31 ./ drwxr-xr-x root/root 0 2019-11-27 16:31 ./usr/ drwxr-xr-x root/root 0 2019-11-27 16:31 ./usr/share/ drwxr-xr-x root/root 0 2019-11-27 16:31 ./usr/share/doc/ drwxr-xr-x root/root 0 2019-11-27 16:31 ./opt/ drwxr-xr-x root/root 0 2019-11-27 16:31 ./opt/brother/ drwxr-xr-x root/root 0 2019-11-27 16:31 ./opt/brother/scanner/ drwxr-xr-x root/root 0 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/ -rw-r--r-- root/root 2789 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/LICENSE_JPN.txt -rwxr-xr-x root/root 24719 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/brscan_scantoemail -rw-r--r-- root/root 24 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/brscan-snmp.cfg -rwxr-xr-x root/root 212 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/mk_mailmessage.sh -rw-r--r-- root/root 288 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/brscan-skey.config -rwxr-xr-x root/root 219 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/scantoemail.config -rwxr-xr-x root/root 1078 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/brscan-skey -rwxr-xr-x root/root 219 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/scantoimage.config -rwxr-xr-x root/root 102 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/brscan_mail.config -rwxr-xr-x root/root 219 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/scantoocr.config -rwxr-xr-x root/root 219 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/scantofile.config -rwxr-xr-x root/root 129470 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/brscan-skey-exe drwxr-xr-x root/root 0 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/script/ -rwxr-xr-x root/root 1614 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/script/scantoimage.sh -rwxr-xr-x root/root 1238 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/script/scantoocr.sh -rwxr-xr-x root/root 1150 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/script/scantofile.sh -rwxr-xr-x root/root 5026 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/script/scantoemail.sh -rwxr-xr-x root/root 30585 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/skey-scanimage -rw-r--r-- root/root 1887 2019-11-27 16:31 ./opt/brother/scanner/brscan-skey/LICENSE_ENG.txt
SANEのインストール
まず、SANEをインストール。
$ sudo apt install sane-utils
ファイアウォールの必要ポートを開放。
■inbound 54925/udp
$ sudo ufw allow to any port 54925 proto udp from any
※黄色部分を宅内に絞れば良さそう。
■outbound 54921/tcp
※outboundを制限していないので特に何もしなかった。
ドライバのインストール
ダウンロードしてきたLinux用のドライバをダウンロードしてインストールする。
今回の場合は brscan4-0.4.9-1.amd64.deb だった。
$ sudo dpkg -i brscan4-0.4.9-1.amd64.deb
スキャナーを登録。
$ sudo brsaneconfig4 -a name=hostname model=DCPJ963N ip=172.16.nnn.nnn
登録の結果はココに書き込まれる。
/etc/opt/brother/scanner/brscan4/brsanenetdevice4.cfg
DEVICE=hostname , "DCPJ963N" , Unknown , IP-ADDRESS=172.16.nnn.nnn
※/etc/optってディレクトリはFHS(Filesystem Hierarchy Standard)で定義されているのだが、初めて見た。
スキャンキーツールのインストール
スキャンキーツールをインストールする。
$ sudo dpkg -i brscan-skey-0.3.1-1.amd64.deb
複合機で「PC選択」に表示されるPCの名前を設定する。
$ sudo brscan-skey -u hostname
※sudoを付けないと設定ファイルへの書き戻しができない模様。
※hostnameのところに任意のホスト名を入れれば良い模様。
結果は以下に書き戻された。
/opt/brother/scanner/brscan-skey/brscan-skey.config
password=
IMAGE="bash /opt/brother/scanner/brscan-skey/script/scantoimage.sh"
OCR="bash /opt/brother/scanner/brscan-skey/script/scantoocr.sh"
EMAIL="bash /opt/brother/scanner/brscan-skey/script/scantoemail.sh"
FILE="bash /opt/brother/scanner/brscan-skey/script/scantofile.sh"
SEMID=b
user=hostname
※赤文字の行が追加された。
動作確認
スキャンキーツールは常駐型のプログラム。
$ brscan-skey
※sudoしていない。
複合機でスキャンを開始すると、ディレクトリ ~/brscan が作成され、そこにファイルが保管される。
一度スキャンしてみたところ、96dpi、24bitのカラーTIFFファイルができあがった。OCRでもFILEでも結果は同じ、TIFFが保管される。
常駐を終了させるには -t パラメータを付ける。
$ brscan-skey -t
これで複合機から画像を取り込む準備ができた。
カスタマイズ
初期設定では、どの機能からスキャンしても96dpi、24bitのカラーTIFFファイルができるので、これをカスタマイズしていく。
スキャンキーツールの構造を整理すると…
- brscan-skey.config
複合機で選択するスキャンの種類4つ(OCR、ファイル、イメージ、Eメール添付)に対応して実行するコマンドラインを定義。
実際、"bash スクリプト"ってな具合で定義されているので、どんなことでもできそうな気配。
ホスト名もここに入れる。 - script/scantoocr.sh、script/scantofile.sh、script/scantoimage.sh、script/scantoemail.sh
呼び出されるスクリプト。
というところなので、スクリプトで何でもできそう。
ファイル
紙をスキャンしたらPDFにしてAlfrescoに登録、というのを目指している。
まずは、PDFにしてみよう。
TIFFをPDFに変換するために、tiff2pdfコマンドを利用する。
$ sudo apt install libtiff-tools
設定ファイルを変更する。
/opt/brother/scanner/brscan-skey/brscan-skey.config
#FILE="bash /opt/brother/scanner/brscan-skey/script/scantofile.sh" FILE="bash /opt/brother/scanner/brscan-skey/script/scantopdf.sh"
※オリジナルのファイルは残して、新たにscantopdf.shを作り、そこでやりたいことを書いてみる。
元のファイルをコピーして、中身を編集。
$ cd /opt/brother/scanner/brscan-skey $ sudo cp scantofile.config scantopdf.config $ sudo cp script/scantofile.sh script/scantopdf.sh
TIFFの解像度を100から300に変更。
/opt/brother/scanner/brscan-skey/scantopdf.config
… # resolution=100,150,200,300,400,600,1200,2400,4800,9600 #resolution=100 resolution=300 …
TIFFからPDFに変換するよう、スクリプトを変更。
/opt/brother/scanner/brscan-skey/script/scantopdf.sh
… 設定ファイルの読み込み先を変える #if [ -e ~/.brscan-skey/scantofile.config ];then # source ~/.brscan-skey/scantofile.config #elif [ -e /etc//opt/brother/scanner/brscan-skey/scantofile.config ];then # source /etc//opt/brother/scanner/brscan-skey/scantofile.config #fi if [ -e ~/.brscan-skey/scantopdf.config ];then source ~/.brscan-skey/scantopdf.config elif [ -e /opt/brother/scanner/brscan-skey/scantopdf.config ];then source /opt/brother/scanner/brscan-skey/scantopdf.config fi … TIFFとPDFの名前を決める。 #OUTPUT=~/brscan/brscan_"$(date +%Y-%m-%d-%H-%M-%S)".tif OUTBASE=~/brscan/"$(date +%Y%m%d%H%M%S)" OUTPUT=$OUTBASE.tif OUTPDF=$OUTBASE.pdf … TIFFができあがったらPDFに変換する。 $SCANIMAGE $OPT if [ ! -e "$OUTPUT" ];then sleep 1 $SCANIMAGE $OPT fi if [ -e "$OUTPUT" ];then tiff2pdf -z -o $OUTPDF $OUTPUT rm $OUTPUT fi #echo "$OUTPUT" is created. echo "$OUTPDF" is created.
※赤文字を追加した。TIFFは圧縮して容量を減らしている。
設定ができたら、スキャンキーツールを再起動する。
$ brscan-skey -t; brscan-skey
これで、PDFができるようになる。
PDF作成時に圧縮するように指定したが、この効果について適当なA4の紙1枚で試してみた。
解像度 | TIFFサイズ(多分どんなものでも変わらない) | PDFサイズ(どんな紙なのか?によって変わる) |
---|---|---|
100 dpi | 2,842,286 | 606,219 |
300 dpi | 25,579,310 | 3,601,253 |
300dpiはやっぱりでかいけれど、後で紙に出す可能性を考えると、せめてこのくらいの品質は欲しいだろう。
OCR
WindowsにインストールしたBrother Utilitiesでは、かなり精度の高いテキストに変換してくれる。
OCRはPresto! PageManagerで行っているようだ。
ただ…ウチでは、紙をスキャンしたらAlfrescoにPDFで登録されることを目指しており、そのPDFがより探しやすくなるための透明テキストをPDFに貼り付けたい。これは、標準とは少し違った動きではある。
OCRについてはTesseract OCRを使わせていただいているが、無圧縮のTIFFを変換すると、何故か文字がにじんでしまう。どうやら、変換の過程でJpeg圧縮がされている模様。
Output PDFs have decreased quality #125
そこで、OCRて抜き出せた文字だけをPDFにして、それをマージすることにした。
[Cross-posted from the Forum/Suggestion] Implement a way to integrate (original image file, detected text) →searchable PDF #660
$ sudo snap install pdftk ← なんか、やたらでかいのをダウンロードしてくる感じ。 $ sudo apt install qpdf ← Ubuntu20.04のバージョンなら、これでマージできそう。
以前、PDFを共有フォルダに置いたら、OCRを掛けてくれる環境を作っているので、ここではPDFができた後にOCRを掛ける処理だけを追加する。
※ImageMagicのPDFポリシーの設定を忘れませんように…。
$ cd /opt/brother/scanner/brscan-skey $ sudo cp scantopdf.config scantoocrpdf.config $ sudo cp script/scantopdf.sh script/scantoocrpdf.sh
/opt/brother/scanner/brscan-skey/brscan-skey.config
#OCR="bash /opt/brother/scanner/brscan-skey/script/scantoocr.sh" OCR="bash /opt/brother/scanner/brscan-skey/script/scantoocrpdf.sh"
先程作ったスクリプトをベースに、赤文字部分を追記する。
/opt/brother/scanner/brscan-skey/script/scantoocrpdf.sh
… 設定ファイルの読み込み先を変える if [ -e ~/.brscan-skey/scantoocrpdf.config ];then source ~/.brscan-skey/scantoocrpdf.config elif [ -e /opt/brother/scanner/brscan-skey/scantoocrpdf.config ];then source /opt/brother/scanner/brscan-skey/scantoocrpdf.config fi … TIFFとPDFの名前を決める。 #OUTPUT=~/brscan/brscan_"$(date +%Y-%m-%d-%H-%M-%S)".tif OUTBASE=~/brscan/"$(date +%Y%m%d%H%M%S)" OUTPUT=$OUTBASE.tif OUTPDF=$OUTBASE.pdf OUTOCR=${OUTBASE}_ocr.pdf OUTMRG=${OUTBASE}_OCR.pdf … できあがったPDFをOCRに掛けて透明テキストを作り、それを元のPDFにオーバーレイする。 if [ -e "$OUTPUT" ];then tiff2pdf -z -o $OUTPDF $OUTPUT rm $OUTPUT fi if [ -e "$OUTPDF" ];then #pdfsandwich "$OUTPDF" -verbose -rgb -tesso "-c textonly_pdf=1" -nthreads 1 -lang jpn+jpn_vert pdfsandwich "$OUTPDF" -verbose -rgb -tesso "-c textonly_pdf=1" -nthreads 1 -lang jpn pdftk $OUTOCR multibackground $OUTPDF output $OUTMRG rm $OUTPDF rm $OUTOCR fi #echo "$OUTPUT" is created. echo "$OUTMGR" is created.
設定ができたら、スキャンキーツールを再起動する。
$ brscan-skey -t; brscan-skey
正直なところ精度は落ちる。落ちるがある程度の検索キーは出せる。良しとする。
Ubuntu 20.04 ならば、試してないけど、こんな感じで動くんじゃないかと思われる。
qpdf 20210321140214.pdf --overlay 20210321140214_ocr.pdf -- out.pdf
スキャンキーツールの常駐
スキャンキーツールを常駐させるために、サービス登録したい。
起動用のユーザーを作る。
$ sudo useradd --system --user-group brscan-key
snapでインストールしたコマンドを使用するため、ホームディレクトリを作らねば…qpdfのバージョンが古かったのが痛い。
$ sudo mkdir /home/brscan-key $ sudo chown brscan-key:brscan-key /home/brscan-key コマンドが動作するかどうか確認しておく $ sudo -u brscan-key pdftk
スキャンしたドキュメントが保管される場所を作る。
どこでも良いと思われるが、全員がアクセスできる共有フォルダに「 scan 」というディレクトリを作ってみた。
$ sudo mkdir -p /var/sambashare/scan
/opt/brother/scanner/brscan-skey/script に配置されているスクリプト全てを開き、「 ~/brscan 」と扱っているところを全て /var/sambashare/scan に置き換える。
例) 作成した scantopdf.sh を修正。
#! /bin/bash # scantofile # #mkdir -p ~/brscan sleep 0.2 … #OUTPUT=~/brscan/brscan_"$(date +%Y-%m-%d-%H-%M-%S)".tif #OUTBASE=~/brscan/"$(date +%Y%m%d%H%M%S)" OUTBASE=/var/sambashare/scan/"$(date +%Y%m%d%H%M%S)" …
サービス定義のファイルを作成する。
/lib/systemd/system/brscan_key.service
[Unit] Description=Brother Scan Key Tool [Service] User=brscan-key Type=forking ExecStart=/opt/brother/scanner/brscan-skey/brscan-skey ExecStop=/opt/brother/scanner/brscan-skey/brscan-skey -t [Install] WantedBy=multi-user.target
サービスを認識させて、サービスを開始する。
$ sudo systemctl daemon-reload $ sudo systemctl enable brscan_key.service $ sudo systemctl start brscan_key.service
これで、再起動後もスキャンキーツールが動作する。
やったこと
デバイスの登録状況を確認
スキャンが上手く動作しなくなったとき、スキャナがちゃんと登録されているのか確認したくなった。
$ scanimage --list-devices device `brother4:net1;dev0' is a Brother *hostname DCPJ963N
探してきたPDF取得のスクリプト
PDFを取り込むスクリプトはココで紹介されている。
brother / Command List of brscan. (Linux)
ps2pdfというコマンドを利用するとのことで、ツールをインストールする。
$ sudo apt install ghostscript
その上で紹介されていたスクリプトを登録したものの、上手く動かなかった。
どうも、スキャンするためのコマンドのバージョンが合っていない模様。
そのため、brscan-skey-0.3.1-1.amd64.debで提供されているスクリプトを改造することにした。
PDF変換時に出力される警告
2枚の紙をスキャンして取得したTIFFを、tiff2pdfでPDF変換するときに以下のワーニングが出た。
TIFFFetchNormalTag: Warning, ASCII value for tag "ImageDescription" does not end in null byte.
これはImageDescriptionというタグの最後にNULLが入っていないと言っているが、クリティカルな問題ではないよ、ということらしい。
でも、せっかくなのでもうちょっと調べてみよう。
1枚の紙を取り込んだTIFFのタグを表示してみたところ、ImageDescriptionには何も入っていない模様。
$ tiffinfo -D ~/brscan/20210303072441.tif TIFF Directory at offset 0x8 (8) Subfile Type: (0 = 0x0) Image Width: 2448 Image Length: 3483 Bits/Sample: 8 Compression Scheme: None Photometric Interpretation: RGB color Samples/Pixel: 3 Rows/Strip: 3483 Planar Configuration: single image plane ImageDescription:
※2枚の紙を取り込んだTIFFのタグを表示すると、この表示が2回繰り返される。
1枚のスキャン結果を試してみたところ、ワーニングは表示されない。
$ tiff2pdf -z -o ~/brscan/a.pdf ~/brscan/a.tif
2枚のスキャン結果だと、ワーニングが表示される。
$ tiff2pdf -z -o ~/brscan/b.pdf ~/brscan/b.tif TIFFFetchNormalTag: Warning, ASCII value for tag "ImageDescription" does not end in null byte. TIFFFetchNormalTag: Warning, ASCII value for tag "ImageDescription" does not end in null byte. TIFFFetchNormalTag: Warning, ASCII value for tag "ImageDescription" does not end in null byte.
TIFFを分割して情報を見てみると、エラーは出ない。分割時に適切な値がセットされるのだろう。
$ tiffsplit ~/brscan/b.tif ~/brscan/bz TIFFFetchNormalTag: Warning, ASCII value for tag "ImageDescription" does not end in null byte. $ ll ~/brscan … -rw-rw-r-- 1 rohhie rohhie 51158612 Mar 3 07:59 b.tif -rw-rw-r-- 1 rohhie rohhie 25600214 Mar 3 08:36 bzaaa.tif -rw-rw-r-- 1 rohhie rohhie 25600214 Mar 3 08:36 bzaab.tif $ tiffinfo -D ~/brscan/bzaaa.tif TIFF Directory at offset 0x1864e98 (25579160) Subfile Type: (0 = 0x0) Image Width: 2448 Image Length: 3483 Bits/Sample: 8 Compression Scheme: None Photometric Interpretation: RGB color Samples/Pixel: 3 Rows/Strip: 1 Planar Configuration: single image plane ImageDescription: $ tiffinfo -D ~/brscan/bzaab.tif TIFF Directory at offset 0x1864e98 (25579160) Subfile Type: (0 = 0x0) Image Width: 2448 Image Length: 3483 Bits/Sample: 8 Compression Scheme: None Photometric Interpretation: RGB color Samples/Pixel: 3 Rows/Strip: 1 Planar Configuration: single image plane ImageDescription:
ということで、何かタグをセットしようと考えたときtiffsetというコマンドがあり、そのコマンドはtag numberを要求する。
ImageDescriptionは何番だろう?と思って調べてみたら 270 と分かった。
$ tiffset -s 270 'a\x00b' ~/brscan/b.tif
こんな形でセットできることはできるのだけれど、結局ワーニングは消えなかった。
さいごに
ようやくスキャナが本気で動き出す。
買ってから何年経ってるんだ…という話ではあるが、できないままよりずっとマシ。
後は、Alfrescoへの自動登録だ。
コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他