家庭の書類をスキャンしてクラウドにアップロードしたい要件で、FAX機能が無いレーザー複合機 ブラザーDCP-L2550DW を買いました。
買ってから気が付いたのですが、クラウドアップロード機能はFAX付き機種しか対応していないようでした。
仕方がないので、複合機本体のスキャンボタンに反応してネットワーク越しに画像を取り込み、OneDriveにアップロードするツールを作りました。
Dockerで動きます。
常時動作しているWindowsマシンがあれば、公式アプリControlCenterを起動しておき、画像の保存先にOneDriveフォルダを指定すれば実現できますが、あいにくそのようなマシンはありません。
その代わり、Google Homeを喋らせたり、空気感を取得するために動かしているラズパイもどきのNano Piがあります。
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を自前でビルドして組み込んだところ、思った通りに動作しました。
yasuhide@yasu_hide案の定嵌まりにハマって、saneがqemuの出すSEGILLで死ぬので、本家のqemuをビルドしてる。--privileged付けて--cap-add=allだからcapabilityでは無いと思うんだがなあ。
2020/05/03 20:42:48
また、資源の少ないNano Pi上でコンテナイメージをビルドするわけにもいかず、手元のPCでビルド環境を構築しました。
x86_64でビルドしたarm32v7向けのコンテナイメージを、aarch64で動かしてi386バイナリを実行するという複雑な関係になりました。
yasuhide@yasu_hideamd64な環境でmultiarch/qemu-user-staticを使ってaarch64用イメージをビルドし、イメージにはqemu-i386-staticを組み込んでi386バイナリを動かすというよくわからないことになった
2020/05/04 01:51:53
スキャナを自動探索する
ブラザー複合機のスキャナを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にしましょう。
おわり。
コメント