家庭の書類をスキャンしてクラウドにアップロードしたい要件で、FAX機能が無いレーザー複合機 ブラザーDCP-L2550DW を買いました。

763cbbceee0b21d75354702dd8e490b2

買ってから気が付いたのですが、クラウドアップロード機能はFAX付き機種しか対応していないようでした。

仕方がないので、複合機本体のスキャンボタンに反応してネットワーク越しに画像を取り込み、OneDriveにアップロードするツールを作りました。

Dockerで動きます。

常時動作しているWindowsマシンがあれば、公式アプリControlCenterを起動しておき、画像の保存先にOneDriveフォルダを指定すれば実現できますが、あいにくそのようなマシンはありません。
その代わり、Google Homeを喋らせたり、空気感を取得するために動かしているラズパイもどきのNano Piがあります。

f8b0a00c74cf2e95bc8f9067b0ed5c05

Nano PiにControlCenter相当のスキャンボタンに反応する機能を実装し、スキャンした画像をOneDriveにアップロードすれば実現できると考えました。

動作の概要は、リポジトリのREADME.mdに記載がある通りです。

実現にあたって所感です。

アーキテクチャを跨ぐ必要がある

Nano PiはARMアーキテクチャですが、ブラザー公式のスキャナドライバやツール類はx86アーキテクチャ向けに作られています。
エミュレータQEMUを用いればアーキテクチャを跨いで目的のプログラムが動作します。

Nano Piでは、この他にGoogle Homeを喋らせるなど前述のいくつかのプログラムを動かしています。
これらに影響を与えず、また省サイズでポータブルにするためbinfmts-misc+chroot+debootstrapではなく、ユーザランドで動作するQEMUを組み込んだDockerイメージにしました。
少し手抜きして multiarch/qemu-user-static を用いたかったのですが、残念ながらarm向けのイメージが無かったため自前で準備しました。

はじめは、OSのパッケージ管理にある qemu-user-static を用いていましたが、バージョンが古く思ったように動きませんでした。
最新のQEMU 5.0.0を自前でビルドして組み込んだところ、思った通りに動作しました。


また、資源の少ないNano Pi上でコンテナイメージをビルドするわけにもいかず、手元のPCでビルド環境を構築しました。
x86_64でビルドしたarm32v7向けのコンテナイメージを、aarch64で動かしてi386バイナリを実行するという複雑な関係になりました。

スキャナを自動探索する

ブラザー複合機のスキャナをLinuxでネットワーク越しに使うには、専用のコマンド brsaneconfig を用いて登録する必要があります。
Dockerを用いるためコンテナを起動するたびに登録する必要があります。
また複合機のIPアドレスを動的に設定している場合は考慮が必要です。

Windowsではネットワークを開くと探索したZeroconf対応機器を一覧できます。
LinuxでもAvahiを用いると、Windowsのようにネットワーク上のZeroconf対応機器を一覧できます。
Zeroconfの仕組みを使い、_uscans._tcpで識別されるネットワークスキャナをbrsaneconfigに登録しています。

Avahiの動作にdbusを用いるため、/sys/fs/cgroupをroマウントする必要があります。

OCRする

OneDriveには書類に含まれる文字列を検索して一覧する機能があります。
この機能を活用するには、画像内の文字列を抽出して識別しておく必要があります。
※最近は自前で文字列を抽出しなくても、画像から勝手に文字起こしをしてくれるらしい? (未確認)

ENABLE_OCR=1に設定して、複合機でOCRを選択してスキャンボタンを押下したとき、tesseractで文字認識をしてPDFで保存する作りにしました。

画像の傾きによって識字率が大きく左右されてしまいますが、簡易の文字起こしとして単語で検索するには十分です。
プロセッサが非力なNano Piでは文字認識に時間がかかるため、連続した処理には向いていないようです。

OneDriveに送信する

最大の目的であるクラウド送信ですが、送信の仕組みの選定が最も大変でした。
OneDriveのクライアントはクラウドストレージと同期することに重点が置かれ、アップロードに特化したものは数えるほどしかありません。

ビルドする必要がなく動作に特別なプログラムが不要な、bash-onedrive-uploadを採用しました。

oauthが正しく動作しない問題は、POSTするパラメータの順序を調整することで回避できる様子。

OneDriveでは、特殊なフォルダもAPIで扱えるようです。
手元では、special/documents の スキャン画像 フォルダにアップロードし、家族と共有しています。

これらを組み合わせて、複合機のスキャンボタンを押して画像を読み取ると、画像や文字検索ができる書類の形式でOneDriveにアップロードできる仕組みが構築できました。
コロナ禍で暇なGWにはちょうど良い工作でした。
クラウド送信をするなら、FAX付きのMFC-L2750DWにしましょう。
おわり。