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なりを使えばよろしい。