Ubuntu

Ubuntu22.04 Brother Scan Key Tool

ホームラボでは、7年前に購入したDCP-J963Nが現役で稼働している。
Windows 11時代になって、Windowsからの操作がイマイチ上手くいかないのと、コア分離で何か起きている感じがするものの、本体側はとても良く動いている。

インストール

スキャナードライバーとスキャンキーツールをダウンロードしてくる。
brother / DCP-J963N-B/W / スキャナードライバー Linux

以前の記事を見ながら実行しているけれども、どうやらちょっとずつ間違っていた感じがする。
良い機会なので訂正していく。

SANE

SANE(Scanner Access Now Easy)をインストールする。

$ sudo apt install sane-utils

スキャナードライバー

Linux用のドライバーをダウンロードしてきて、インストールする。
ドライバはSANEと連携してスキャナと通信する役割を担うらしい。

この日のバージョンは brscan4-0.4.9-1.amd64.deb であった。

$ sudo dpkg -i brscan4-0.4.9-1.amd64.deb

SANEにスキャナーを登録する。

$ sudo brsaneconfig4 -a name=DCP-J963N model=DCP-J963N ip=<IPアドレス>

nameはフレンドリー名で、モデル名を入力するところ。
modelは /opt/brother/scanner/brscan4/models4 に対応プリンターの一覧が入っているのだけれど、そこに書かれている形式で書くと0x4f9:0x397等のコードが入る仕組み。

結果はこちらに書き込まれる。

/etc/opt/brother/scanner/brscan4/brsanenetdevice4.cfg

DEVICE=DCP-J963N , "DCP-J963N" , 0x4f9:0x397 , IP-ADDRESS=nnn.nnn.nnn.nnn

※以前はDCPJ963Nとハイフンなしで入力していて、結果としてコード部分がUnknownになっていたが、それでも動いてはいた。

スキャンキーツール

スキャンキーツールは、スキャナに向かって「ここに画像を取り込むホストがいるぞ!」と手を上げていて、スキャナー側の「PC選択画面」で指定されると、スキャナーに「こんな条件で読み取って画像をくれ」と伝え、受け取った画像を保管するようになっている。

この日のバージョンは brscan-skey-0.3.1-2.amd64.deb であった。

$ sudo dpkg -i brscan-skey-0.3.1-2.amd64.deb

ホスト名を決める。
ここで指定したホスト名が、スキャナーのPC選択画面に表示される。

$ sudo brscan-skey -u hostname

結果は以下に書き込まれる。

/etc/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

ポートの開放

ポートの開放について、こちらのQ&Aに書かれている。
brother / 【インクジェット/レーザー プリンター・スキャナー】スキャン機能を使用するために事前に必要な準備について(Linux)

$ sudo ufw allow 54925/udp comment "brother Scan Key Tool"
$ sudo ufw allow 54921/tcp comment "brother Scan Key Tool"

スキャンキーツールの常駐

サーバーが起動すると同時に常駐し、スキャナーから画像を取り込んだら、既定のディレクトリにファイルが入るようにしたい。

ユーザーの作成

スキャンキーツール起動用のユーザーを作る。

$ sudo useradd --system --user-group brscan-key

スキャンしたファイルはSambaの共有フォルダ /home/samba/share/スキャン に置きたい。
一方で、ファイルを保存するスクリプトを見ると ~/brscan にファイルを置くことになっている。

そこで、以下のような設定をした。

$ sudo mkdir /home/brscan-key
$ sudo chown brscan-key:brscan-key /home/brscan-key

$ sudo ln -s /home/samba/share/スキャン  /home/brscan-key/brscan

こうすれば、スクリプトが ~/brscan にファイルを置くと、それが狙っている /home/samba/share/スキャン に置かれる。

サービスとして登録

スキャンキーツールは常駐型のプログラム。

$ brscan-skey

で常駐し、

$ brscan-skey -t

で終了する。

これをユニットファイルに書いておく。

/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

これで、起動する度にスキャンキーツールが常駐する。

スキャンキーツールの設定

スキャンキーツールの使い方は、Q&Aで説明されている。
brother / 【インクジェット/レーザー プリンター・スキャナー】Linuxでの使用方法、トラブルについて

ここで、「スキャンについて」を選択して、情報をたどっていく感じ。

機能の計画

スキャナーから呼び出せる機能は4つあり、呼び出されるスクリプトがこのファイルに定義されている。

/etc/opt/brother/scanner/brscan-skey/brscan-skey.config
→ 実態は /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

設定ファイルは、/etc/opt/brother/scanner/brscan-skey にあるがシンボリックリンクで、
/opt/brother/scanner/brscan-skey に実体がある。

今回は、以下の機能を実装する。

スキャナーの表記スクリプト設定ファイル(個人用がなければ)機能変更内容
OCRscantoocr.shscantoocr.configPDF(300DPI/フルカラー)にしてOCRに掛けて、Nextcloudへ登録
ファイルscantofile.shscantofile.configPDF(300DPI/フルカラー)にして、Nextcloudへ登録
イメージscantoimage.shscantoimage.configTIFF(600DPI/フルカラー)にして、所定のディレクトリに保管
Eメール添付scantoemail.shscantoemail.configJPEG(600DPI/フルカラー)にして、所定のディレクトリに保管

OCR(PDFにしてOCRに掛ける)

スキャナーで画像が取り込まれると、TIFFで保管されるので、次の通りに処理する。

  • TIFFをPDFに変換する。
  • Tesseract OCRとpdfsandwichを使って、PDFに透明テキストを貼り付ける。
  • NextcloudにPDFを登録する。

Tesseract OCRとpdfsandwichのインストールについては、こちらを参照

まず、解像度を変更。

/opt/brother/scanner/brscan-skey/scantoocr.config

resolution=300

スクリプトを変更して、OCRに掛けた後、Nextcloudへの登録スクリプトを呼び出す。
著作権を考慮して、元ソースは位置が分かる程度の表記にとどめ、変更内容を記すことにする。

/opt/brother/scanner/brscan-skey/script/scantoocr.sh

...
SCANIMAGE="/opt/brother/scanner/brscan-skey/skey-scanimage"
#OUTPUT=~/brscan/brscan_"$(date +%Y-%m-%d-%H-%M-%S)".tif
SCBASE=~/brscan/"$(date +%Y%m%d%H%M%S)"
OUTPUT=${SCBASE}.tif
OUTPDF=${SCBASE}.pdf
OUTOCR=${SCBASE}_ocr.pdf
OPT_OTHER=""
...
if [ ! -e "$OUTPUT" ];then
   sleep 1
   $SCANIMAGE $OPT
fi

if [ -e "$OUTPUT" ];then
   tiff2pdf -o $OUTPDF $OUTPUT
   rm $OUTPUT
fi

if [ -e "$OUTPDF" ];then
    #pdfsandwich "$OUTPDF" -rgb -lang jpn+jpn_vert
    pdfsandwich "$OUTPDF" -rgb -lang jpn
    rm $OUTPDF
fi

if [ -e "$OUTOCR" ];then
    echo "$OUTOCR" is created.
fi

/opt/brother/scanner/brscan-skey/script/nc-entry.sh $OUTOCR
#rm $OUTOCR

※運用が安定してきたら、Nextcloudにファイル登録が終わったら、ファイルを消してしまおうかと思う。

Nextcloudへの登録スクリプトを新規に作成。
以前にやり方は調べてあったので、それでどうにか登録できた。
実際に自分の環境でやるときには、ユーザー、パスワード、curlでアクセスするURLが変わるはずなので注意。

/opt/brother/scanner/brscan-skey/script/nc-entry.sh

#!/bin/bash
ADMNID="admin"
ADMNPS="adminpass"

NCBASE=`basename $1`

curl -X PUT -u ${ADMNID}:${ADMNPS} https://nextcloud.hogehoge.jp/remote.php/dav/files/admin/Documents/${NCBASE} -T $1

※起動時のパラメーターとして、登録するフルパスファイル名が渡されるようにしてある。

といった具合。

登録に管理者を使うのか問題もあるけれど、とりあえずパスワードが簡単に見えないようにだけはしておこう。

$ sudo chmod 500 /opt/brother/scanner/brscan-skey/script/nc-entry.sh
$ sudo chown brscan-key:brscan-key /opt/brother/scanner/brscan-skey/script/nc-entry.sh

機能が設置できたので、スキャナーからOCRを選択し、このホストを選択すれば、今回仕掛けたスクリプトが起動する。

ファイル(PDFにする)

スキャナーで取り込まれる画像は無圧縮なので、なかなかにサイズが大きい。
OCRの方では、pdfsandwichが処理の過程でJPEG変換をするので、サイズはだいぶ小さくなる。
同じように、JPEG変換して画像を圧縮する。

まず、解像度を変更。

/opt/brother/scanner/brscan-skey/scantofile.config

resolution=300

スクリプトを変更する。

/opt/brother/scanner/brscan-skey/script/scantofile.sh

...
SCANIMAGE="/opt/brother/scanner/brscan-skey/skey-scanimage"
#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
OPT_OTHER=""
...
if [ ! -e "$OUTPUT" ];then
   sleep 1
   $SCANIMAGE $OPT
fi

if [ -e "$OUTPUT" ];then
   tiff2pdf -j -q 60 -o $OUTPDF $OUTPUT
   rm $OUTPUT
fi

if [ -e "$OUTPDF" ];then
    echo "$OUTPDF" is created.
fi

/opt/brother/scanner/brscan-skey/script/nc-entry.sh $OUTPDF
#rm $OUTPDF

tiff2pdf の -q パラメーターで渡している数値が圧縮時の品質を表しているようなのだが、イマイチ意味が分からない。
やってみた感じだと、「変換結果の画像の品質」を表していて、上のように60と書くと60%程度にするということのように見える。

  • 10にしてみたところ、微妙な色が消えてブロックノイズが出た。
  • 数字を大きくするほど画質が良くなり、ファイルのサイズが大きくなる。

という特徴があった。

Nextcloudへの登録は、OCRの方で作ったものを呼び出している。

イメージ(TIFFにする)

A4サイズで画像をスキャンしたとき、解像度600DPIで100MB、1200DPIで400MB程度になる。
読み取った画像によって圧縮率は変わるはずだけれど、わら半紙(グレースケール的な印刷)で試したところが以下。

形式600DPI1200DPI
無圧縮 : no compression97.8MB391MB
JPEG : JPEG encoding15.6MB(16%)変換不能(Rows/Stripが8の倍数でないため)
ZIP : Zip/Deflate encoding69.4MB(71%)247MB(63%)
LZW : Lempel-Ziv & Welch encording85.0MB(87%)323MB(83%)

JPEGはかなり小さくなり、それでいて実用的。
可逆圧縮だとZIPが小さい。

1200DPIはスキャンにとても時間が掛かる上に、サイズが大きすぎて、処理するコマンドのメモリーリミットを解除する必要があった。
会社の複合機での印刷が確か600DPIだから、600DPIで読み取れば十分かなと思う。

これらを踏まえて、解像度を600に変更。

/opt/brother/scanner/brscan-skey/scantoimage.config

resolution=600

スクリプトを変更する。
取り込んだTIFFをZIP形式に変換して、サイズを少しだけ小さくする。
また、元の処理を見ると、evince等を探し、これらがなければgimpを起動するアプリケーションとして、TIFFを渡して起動しているので、この処理をコメントアウトしておく。

/opt/brother/scanner/brscan-skey/script/scantoimage.sh

...
SCANIMAGE="/opt/brother/scanner/brscan-skey/skey-scanimage"
#OUTPUT=~/brscan/brscan_"$(date +%Y-%m-%d-%H-%M-%S)".tif
OUTBASE=~/brscan/"$(date +%Y%m%d%H%M%S)"
OUTPUT=${OUTBASE}.tif.work
OUTDST=${OUTBASE}.tif
OPT_OTHER=""
...
if [ ! -e "$OUTPUT" ];then
   sleep 1
   $SCANIMAGE $OPT
fi

if [ -e "$OUTPUT" ];then
    tiff2rgba -c zip $OUTPUT $OUTDST
    rm $OUTPUT
fi

if [ -e "$OUTDST" ];then
    echo "$OUTDST" is created.
fi

<< COMMENT
sleep 1
if [ "$(which evince 2>/dev/null)" != '' ];then
...
echo "$APL $OUTPUT  2>/dev/null" \;sleep 2\;rm -f "$OUTPUT" | bash &
COMMENT

TIFFで取り出したファイルは、PCで編集することが前提なので、Nextcloudへの登録はしなかった。
日頃使っているツールでTIFFを開いてみたけれども、どれでも開くことができたので、これでOKとした。

Eメール添付

最初は機能変更しないつもりだったけれども、TIFFのサイズが大きいなと思ったので、JPEGに変換する機能を実装することにした。

まず、解像度を600に変更。

/opt/brother/scanner/brscan-skey/scantoemail.config

resolution=600

sendmailを使用して、保存したTIFFをメールで送信するスクリプトになっている。
/opt/brother/scanner/brscan-skey/script/scantoemail.sh

ザックリと流れを見ると、スキャナーからTIFFを取り出すところまでは同じ。
brscan_mail.configというファイルから、From、To、Subject等を取り出して、メールを送っている。

メールを送るための処理があるので、バッサリ落としつつ、こんな感じにしてみた。

/opt/brother/scanner/brscan-skey/script/scantoemail.sh

...
<< COMMENT
SENDMAIL="$(which sendmail   2> /dev/null)"
...
FILENAME=brscan_skey.tif
COMMENT

...
#OUTPUT=~/brscan/brscan_"$(date +%Y-%m-%d-%H-%M-%S)".tif
OUTBASE=~/brscan/"$(date +%Y%m%d%H%M%S)"
OUTPUT=${OUTBASE}.tif
OUTDST=${OUTBASE}.jpg
OPT_OTHER=""

...
if [ ! -e "$OUTPUT" ];then
   sleep 1
   $SCANIMAGE $OPT
fi

if [ -e "$OUTPUT" ];then
    convert -quality 92 $OUTPUT $OUTDST
    rm $OUTPUT
fi

if [ -e "$OUTDST" ];then
    echo "$OUTDST" is created.
fi

<< COMMENT
FLABEL='^FROM'
...
rm -f "$OUTPUT"
COMMENT

convertの品質は、デフォルトで92%となっている(実際にやってみたら、その値になった)。
stack overflow / Does ImageMagick decrease image quality by default?

例の97.8MBのTIFFは、11.5MBになった。
色々と試してみて、品質・サイズのバランスが良い数字をセットすればOK。

さいごに

OSが新しくなっても、何の問題もなく動作するドライバーとツール。
これは、OSの側が基本機能を変わらずに提供しているということなのかなと思った。

ホームラボでは、12年もののPCが現役でサーバーとして稼働している。
電源の交換、GPUの交換、メモリの増設、SSDへの換装と、それなりにパーツの交換はしているけれども、24時間電源入れっぱなしで問題なく動いているのは凄いことだ。

DCP-J963NもPCも、機能・性能共に全く不満はなく、もっと先まで元気に動いていて欲しいと思うのだった。

広告

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