Ubuntu

Ubuntu18.04 Brother スキャンキーツール

ウチの中に紙がたくさんたまる。子供が持って帰ってくる手紙が中心だけれど、それなりに色々ある。
気にしないで捨ててしまえば良いのだが、そういうわけにもいかないと言われ、電子化して捨てようよ、と結論した。



広告


とはいえ、ウチの複合機(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 dpi2,842,286606,219
300 dpi25,579,3103,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のバージョンなら、これでマージできそう。

qpdfはこう言っている

以前、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への自動登録だ。

広告

コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他