ホームラボでは、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 に実体がある。
今回は、以下の機能を実装する。
スキャナーの表記 | スクリプト | 設定ファイル(個人用がなければ) | 機能変更内容 |
---|---|---|---|
OCR | scantoocr.sh | scantoocr.config | PDF(300DPI/フルカラー)にしてOCRに掛けて、Nextcloudへ登録 |
ファイル | scantofile.sh | scantofile.config | PDF(300DPI/フルカラー)にして、Nextcloudへ登録 |
イメージ | scantoimage.sh | scantoimage.config | TIFF(600DPI/フルカラー)にして、所定のディレクトリに保管 |
Eメール添付 | scantoemail.sh | scantoemail.config | JPEG(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程度になる。
読み取った画像によって圧縮率は変わるはずだけれど、わら半紙(グレースケール的な印刷)で試したところが以下。
形式 | 600DPI | 1200DPI |
---|---|---|
無圧縮 : no compression | 97.8MB | 391MB |
JPEG : JPEG encoding | 15.6MB(16%) | 変換不能(Rows/Stripが8の倍数でないため) |
ZIP : Zip/Deflate encoding | 69.4MB(71%) | 247MB(63%) |
LZW : Lempel-Ziv & Welch encording | 85.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も、機能・性能共に全く不満はなく、もっと先まで元気に動いていて欲しいと思うのだった。
コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他