2016年12月10日土曜日

Canon PIXUS iP2700をFreeBSDからLPDで使う

0. 前置き

最近、うちのプリンタ(Canon BJ S500、2001年発売。2008年頃ヘッドを交換した)の調子が悪かった。

LEDで「サービスが必要なエラー」だと訴えかけてきて、バキバキと異音を発していたのだ。結局、分解して歯車を手で回したりしたら生き返ったのだが、治るまでの間に、後継機種がFreeBSDで使えるかを検討したので、その記録をここに公開する。

注意!!!実機では試していないので、本当に印刷できるかは確認していません!!!

1. 機種の選定

うちのプリンタは、
 出かけるときに地図を印刷する。
 論文等をちょっと印刷する。
 航空券などのeチケットを印刷する。
ような感じで、使っている。BJ S500で何も不満はない。

また、手元のFreeBSDビギナーズバイブル(改訂第2版、2005/09)[1]に記載されている非ポストスクリプトプリンタは、CanonのPIXUS 2機種である(なお、PIXUSは、Wonder BJシリーズの後継である)。これらの理由から、CanonのPIXUSを第1候補に考えた。

次に、Canonの「PIXUS選べるガイド」ページに行く。http://cweb.canon.jp/pixus/special/room/index.html?id=pix1 (公式サイトのPIXUSのトップhttp://cweb.canon.jp/pixus/からタイミング良くクリックするべし。)
「くらべてわかる早見表」から、iP2700で十分と思った。
価格.comを見ると、3000円代であり、これにしようと考えた。

[1] 後藤大地著、FreeBSDビギナーズバイブル、ISBN978-4839918941、http://www.amazon.co.jp/FreeBSDビギナーズバイブル-MYCOM-UNIX-Books-後藤/dp/4839918945

2. CUPS

FreeBSDでの印刷は、「CUPSプリンタドライバを使い、CUPSで印刷する方法」「LPD用のフィルタを使い、LPDで印刷する方法」の2つに大別される。

今のBJ S500はquantumの記録:FreeBSDからCanon BJ S500で印刷できた で書いたようにLPDで使っている。

前述したような用途で使っているので、pdfをatril経由で印刷するか、firefoxからpdfに保存して、atril経由で印刷することがほとんどである。したがって、CUPSはいらなくて、LPDで動けば十分である。(なお、ヘッドの位置合わせやスリープ設定等は、windows機でやればいいと割りきっている。)

一方、CUPSは色々できるが、構成が大きくて、動作させるまでもっていくのが大変そうである。(そもそもLinux用ドライバをFreeBSDで動かすのだ、困難は少ない方がいい。)

これらの理由から、iP2700のLPDでの動作確認をすることとした。

3. 予習

ビギナーズバイブルにはPIXUS iP4100が載っている。
「ip4100 linux」でググって、「Canon Bubble Jet Print Filter Ver 2.50 for Linux」のダウンロードページに行く。
共通パッケージ、機種別パッケージ、LPRng追加パッケージがダウンロードできるようになっていて、それぞれ、rpmがダウンロードされる。
tar xvf *.rpm で展開すると、usrディレクトリができる。(5年前から知っているけど、tarでrpmも展開できる)
ビギナーズバイブルを見ると必要なファイルは usr/local/bin/bjfilterpixusip4100 (あえて相対パスで書いた)で、それもusrディレクトリの下にできる。これはフィルタである。

4. iP2700のドライバを試す

前提条件

マシンはFreeBSD 11.0-stable #3。Linux互換も動くように設定してある。現在BJ S500が使えていて、使えるようにしたときの記録は、quantumの記録:FreeBSDからCanon BJ S500で印刷できた に公開している。
この記事の後、linux-baseをf10からc6に変更した。また、graphics/linux-f10-png10に穴が開いていて、portsで追いかけるのがしんどくなったので、必要なライブラリを確保して、パッケージをアンインストールしたあと、BJ S500のために必要最低限のライブラリだけを/compat/linux/usr/lib/に書き戻す作業もしている。(ノートに記録はあるのだが、blogでの公開はしていない。)
なお、前述のようにプリンタ本体はないので、印刷できるかまでは試していない。

4.0 ダウンロードする

「ip2700 linux」でググって、「IJ Printer Driver Ver.3.30 for Linux」のダウンロードページに行く。rpm版をダウンロードする。以下/tmp/にcnijfilter-ip2700series-3.30-1-i386-rpm.tar.gzをダウンロードしたとする。

4.1 展開する

まず展開する。
$ cd /tmp/
$ tar xvf cnijfilter-ip2700series-3.30-1-i386-rpm.tar.gz
/tmp/cnijfilter-ip2700series-3.30-1-i386-rpm/ ディレクトリができる。
その下に、install.sh、packages、resourcesがあって、packagesの下には、2つのrpmがあるので、とりあえず展開する。
$ cd cnijfilter-ip2700series-3.30-1-i386-rpm/packages
$ tar xvf cnijfilter-ip2700series-3.30-1.i386.rpm
$ tar xvf cnijfilter-common-3.30-1.i386.rpm
usr/ディレクトリができる。usr/local/bin/下にいくつかファイルがある。どれかがフィルタだとうれしい。どれだろう。lddしてみる。
$ ldd usr/local/bin/* |less
ここで、予習で用意したbjfilterpixusip4100のlddの出力と比較すると、usr/local/bin/cifip2700がフィルタのようだ。

4.2 動作させる

動作確認する。
Linuxバイナリのライブラリパスの設定とかやや面倒だから、/compat/の下に置いてしまう。
# cp usr/local/bin/cifip2700 /compat/linux/usr/local/bin/
動作確認には、今使ってる(/etc/printcapでif設定されている)/usr/local/libexec/canonを流用する。コピーして(canon_ip2700と名前を変えた)、フィルタ名を書き換えたものを次に示す。

#!/bin/sh

/usr/local/bin/gs \
    -q -r600 -dNOPROMPT -dSAFER -sPAPERSIZE=a4 -sDEVICE=ppmraw \
    -sOutputFile=- - quit.ps | \
    /compat/linux/usr/local/bin/cifip2700 --full --imageres 600 --lgmon

exit 0

おもむろに実行する
$ ./canon_ip2700
とライブラリ libcnbpcmcm364.soが足りないと言われる。
$ ls usr/lib/*
すると、libcnbpcmcm364.so.8.0.1と長いファイル名で、一式ライブラリファイルがあるが、短いファイル名のシンボリックリンクはない。tarなら、シンボリックリンク普通に使えるのになぜに?と思いながら作る。
$ cd usr/lib
$ for i in *.so do ln -s $i ${i%%.so.*}.so
/compat/の下にコピーする。
# cd ../../
# cp usr/lib/*.so* /compat/linux/usr/local/bin/

再挑戦する。
$ ./canon_ip2700
とライブラリ libpng12.so.0が足りないと言われる。portsから入れられそう。
$ ls -ld /usr/ports/*/*png*
すると、/usr/ports/graphics/の下に、linux-c6-png、linux-c7-png、linux-f10-pngがある。どれを使えばいいのだ?
$ pkg info -xI linux_base
linux_base-c6-6.8_6が現在のうちのマシンのlinux-base。5年前はf10だが変えたのだな。
# cd /usr/ports/
# portupgrade -N graphics/linux-c6-png

再挑戦する。
$ ./canon_ip2700
--lgmon: unknown optionと出た。ライブラリは揃って動き出したようだ。./canon_ip2700スクリプトから --lgmonを削除する。

再挑戦する。
<?xml version="1.0" encoding="utf-8" ?> (snip) </cmd>□□BJLSTART
ControlMode=Common
SetTime=2016 (snip)
BJLEND□

と出力始めるので、Ctrl-Cで止める。この出力は、今の/usr/local/libexec/canonとよく似ているので、とりあえず良さそうだ。

5. 補足

iP4100をLinux+lpdで使う場合にも、この記事は参考になるであろう。/compat/linux/を/(すらるーと)に読み替えて、portsの代わりにrpmなりを使えばよろしい。