仕事でもプライベートでもペーパーレス化が進み、プリンタの出番が減りつつあるなぁと感じる今日この頃です。印刷するのは、年賀状と・・・不慣れな山域へ入るときに持って行く地形図の印刷でしょうか。
スマホから印刷したい
そんなこんなで、すっかり埃をかぶってしまっている我が家のプリンタですが、スマホから印刷したいという妻からのリクエストにお応えして試行錯誤していると、案外簡単に実現できました。
スマホから印刷したい事なんてあるんだ?と聞くと「スマホから新型コロナウイルスワクチン接種予約をしたら予約票をPDFでダウンロードするようになってて、それを印刷したい」んだそうです。
なるほど、そういう需要もあるんだなぁと調べてみると、最近のプリンタには、スマホから直接印刷できるという機能が搭載されている機種が多いようです。残念ながら自宅で使用しているプリンタは購入から10年近く経っているOKI C310dnという古い機械で、そのような機能はサポートされていませんでした。
しかーし、自宅ではルータとしてLinuxが24時間稼働しています。そのLinuxルータをprint spooler として動かしスマホから印刷ジョブを受け付けるようにすればスマホから印刷が可能になります!
ルータとしてlinuxを置いている家庭は少ないかもしれませんが、print spooler 程度なら古い Raspberry Pi でも十分ですから、スマホからの印刷に未対応なプリンタをお持ちの方は試してみる価値はあるかと思います 🙂
想定する環境
OS | Debian stable |
Printer | OKI C310dn (color LED laser) |
Printer driver | foo2zjs |
print spooler | cups |
スマホには大きく分けて、iOSが動くApple製品(iPhoneやらiPadやら)とgoogleのAndroidが載っているスマホの2種類があります。
Apple(iOS)では AirPrint という仕組みで印刷を実現しています。
一方のAndroidは各社印刷用のアプリが用意されていたりとプリンタ会社によって対応がまちまちに見えます。しかしAndroidも AirPrint と似た IPP Everywhere という仕組みで印刷するようなので、Linuxに行う設定は基本的に同じでいけました。
linuxからC310dnを使えるように設定しておく
スマホからlinuxを経由して印刷するわけですから、linuxから印刷可能である事が必須条件です。
普段Linuxはルータとして利用しています。ルータから印刷する事は通常無いのでプリンタの設定はしていませんでした。なので、まずは Linux から印刷できるように環境を整えます。
昔はいろいろとありましたが、現在 Linuxから印刷する時はcups一択だと思います。今回もcupsを利用します。cupsは、ブラウザ上からプリンタの設定なども行えてとても便利なのです。
自宅のプリンタ(C310dn)はTCP/IPを話す独立したネットワークプリンタとして設置しています。もしwindowsから共有されているプリンタを利用したい等の場合は、smbclient を組み合わせる事を検討する必要があるでしょう。この辺りの自由度がUNIXの楽しいところですね。
まずは cupsを導入します。
1 |
$ apt-get install cups cups-browsed cups-ipp-utils |
OKI C310dnのドライバは core-drivers
には含まれていません。OpenPrinting.org にdriver databaseがあります。ここで検索して適合するドライバを導入します。
1 |
$ apt-get install printer-driver-foo2zjs |
cupsの設定
cups関連の設定ファイルは/etc/cups/
以下に置かれ、その中のcups-browsed.conf
を修正していきます。
ネットワーク上にあるプリンタを自動認識できるようにする為、下記一行を有効にします。
1 |
CreateIPPPrinterQueues All |
修正したら、設定を反映させる為にプロセスの再起動をしておきます。
1 |
$ systemctl restart cups cups-browsed |
mDNSの導入
最近のディストリビューションでは最初から動いていると思いますが、もしも導入されていなければ avahi-daemon
をインストールしておきましょう。
1 2 3 4 5 |
$ apt-get install avahi-daemon avahi-utils $ systemctl start avahi-daemon # 機器一覧が取れるか確認 $ avahi-browse -at |
プリンタの追加
さて、これで準備ができました。http://LinuxルータのIPアドレス:631/
にブラウザでアクセスして管理画面からプリンタを追加していきましょう。
っと、その前にデフォルト設定で動かすと 0.0.0.0:631
でListenしてしまいます。必要なネットワークのみListenするよう明示的に記述したほうが良いと思います。
1 2 3 4 5 6 7 |
$ diff -u0 cupsd.conf{.before,} --- cupsd.conf.before 2021-05-03 01:03:27.413723312 +0900 +++ cupsd.conf 2021-05-06 16:12:44.063825889 +0900 @@ -5 +5,2 @@ -Port 631 +#Port 631 +Listen 192.168.0.1:631 |
WebUIからプリンタの追加
アクセスしたら、管理
→ プリンターの追加
へ進みます。
※ 途中で認証を求められるかもしれません。ぼくの環境では、rootのパスワードを求められました。
linux上で認識されていれば、印刷Jobを流したいプリンタが表示されていると思います。表示されなければ、明示的にプロトコルを指定して(LPD, http, ipp など) IPアドレスを指定します。
プリンタに名前や説明を付与できます。複数のプリンタを管理下に置く場合は分かりやすい名前をつけましょう。ここで設定する名前が、mDNSで検索した時に表示されますので、日本語でもかまいませんが、できればASCII文字のみが良いと思います。
次は重要です。モデル
を適切に選ばないと印刷に失敗してしまいます。先のOpenPrinting のDataBaseによれば、OKI C310dnは foo2hiperc
というドライバを利用するように書かれていて、ドライバをインストールしました。
そのドライバが認識され recommended
になっていますね。正しいドライバを選択したら、プリンタの追加
ボタンを押して次へ。
プリンタのデフォルト設定は、好みのパラメータを入れればOKです。最初は、白黒モードになっていたので、カラーモードに変更しました。
設定完了とテスト印刷
設定が完了してもまだ気は抜けません。プロトコルやドライバの選択が間違っているとプリンタjobは受け付けられても印刷物は出てきません。
プリンター
タブから追加したプリンタを選択し、テスト印刷jobを投げてみましょう。
ドキドキ。
スマホから印刷してみる
iOS (iPhone, iPad)から印刷
ブラウザで適当なページを印刷してみます。
- アドレスバー右側のアイコンをタッチ
- メニュー一覧から
印刷
を選択 - ページ全体が印刷されてしまうので、オプションから1ページだけを印刷指示
印刷物
ブラウザの画面なので、変な矢印がはいっちゃってますが、写真やPDFファイルなら綺麗に出力できました!
Andriodから印刷
Android端末は、ほとんど利用していないのですが、Android 9が載っているタブレットからは、iOS同様に印刷できました。
しかし、Android 7.0が載っている古いスマホは、印刷メニューでプリンタを見つけることができずJobを投げられませんでした。
まとめ
今回、携帯端末から印刷したい!というモチベーションを基に、ルータとして24時間動かしているlinuxをprint spoolerとして設定しました。
linuxをルータとして使っている方は最近ではあまりいない気もしますが、今回のプリントスプーラ程度の仕事なら Raspberry Pi 等の省電力マシンでも十分にこなせます。Raspberry PiでNTPサーバを動かしている方などは、片隅にcupsを入れてチャレンジしてみるのも楽しいのではないでしょうか。