2012年3月14日水曜日

CUPSで一苦労 (2)


CUPS 続きっぽいの。

"駅すぱあと" のページを印刷してみたが、ローカルから raw プリンタ相手に送ると (ローカルから誰が造ったか不明の pdf が送られてサーバの gs で処理) 印刷まで 3 分以上、ローカルで ps プリンタ相手に送ると (ローカルの cups が生成した postscript が送られてサーバの gs で処理) 1 分強、firefox が吐いた ps を lpr で送ると (firefox の ps を サーバの gs で処理) 数秒。小さくても画像が入ると遅くなるかんじ?
ちょっと設定が簡単になったりネットワーク上のプリンタを見つけ易くなったりした代償がこれでは割に合わん。

サーバの debian squeeze にいれた lprng は、apt-get dist-upgrade したら削除されてしまった (そういえばそれで何の不満もなかった lprng から乗り換えようかと思ったんだった)。今は "echo 'lprng hold' | dpkg --set-selections" で hold してあるが、これって新しいバージョンが来た時はどうなるんだろう? (そうそうは来ないだろうが)
unhold するには "echo 'lprng install' | dpkg --set-selections" だそうな。

でもまあ、問題が判ったので cups でもなんとかなるか (というより lprng にしても解決しない)。要するに、gs に pdf が渡らないようにすればそれなりに使えるはず。
サーバのほうは 3 つのキューを造った。

1. raw (プリンタ直結っぽい、windows 用)
2. Epson-LP-xx00-escpage.ppd を使うやつ (内部的には gs -sDEVICE=escpage)
3. Epson-LP-2200-eplaser-jp.ppd を使うやつ (内部的には gs -sDEVICE=lp2200)

2 と 3 とは似たようなもんだが、変換は 3 が速く、データは 2 が小さい (ので転送時間が短い)。
それから、後の利用も考えて cups-lpd も設定した。余計なポートが開かないように inetd ではなく tcpserver で起動する。

/usr/bin/tcpserver -H -R -u 7 -g 7 -x /etc/tcpserver/cups-lpd.cdb 0 515 /usr/lib/cups/daemon/cups-lpd -o document-format=application/octet-stream &

uid 7 は lp、アクセス制御ファイルである cups-lpd.cdb は、localhost と プライベートアドレスのみに限定する内容。

クライアントのほうからはサーバで設定したプリンタが全部見えているが、そのまま使うとクライアントから pdf が飛んでいくことになって、Epson-LP-xx00-escpage のほうはエラーを吐いて止まるし、Epson-LP-2200-eplaser-jp のほうはえらいな時間がかかる (3 分コース)。そこで、

プリンタードライバー: Generic PostScript Printer Foomatic/Postscript (recommended)
接続先: http://print_server/printers/escpage

なエントリを作成してそれを使う。つまりクライアントの cups を経由してサーバの cups に転送する設定を造ったわけだ (馬鹿みたいだが)。こうすることにより、クライアントから pdf が飛ばず、cups が造った postscript が送られることになる。これも大概遅いが (1 分コース)、pdf を送った時程でもない。

サーバに lpd を入れたのは、クライアントの lpr を使えるようにするためだ。サーバはそのまんまで cups のキューが見えているが、クライアントのほうは /etc/printcap を設定する必要がある。昨日と同じだが、
lp|remote printer:\
        :lp=:\
        :rm=192.168.9.1:\
        :rp=escpage:\
        :mx#0:sh:

としてやれば、アプリが造った ps を使い、クライアントから "lpr output.ps" で印刷できる。もちろんこれが最速だ (秒殺)。

もしかしたら遅いのって EPSON プリンタだけなのかなあ?