Oct 24 1996
最近はネットワーク(TCP/IPプロトコル)対応のプリンタが多く発売されるよう になりました.UN*Xから非ポストスクリプトプリンタへ出力する場合,なにかフィ ルタを通さなければなりません.しかし,/etc/printcapのエントリに「if=(フィ ルタ)」の項が入るとlpdの仕様上ローカルのデバイスファイルへの出力に限 定され,ネットワークを介する出力が普通の方法では不可能となります. そこで,これを実現させるための方法を紹介します.
many network printers support two-way communication, and you might want to take advantage of that (to get printer status, perform accounting, etc.).とあります.どなたか作ってみてはいかがでしょうか.
lj-5:remote-hplj:\
:lp=/dev/null:sh:mx#0\
:sd=/var/spool/lpd/lj-5:\
:if=/usr/local/sbin/filter-lj-5:
lj-5-remote:\
:lp=/dev/null:sh:\
:rm=printer.name.com:\
:rp=raw:\
:sd=/var/spool/lpd/lj-5-raw:
原因を追求してませんがFreeBSDではlj-5とlj-5-remoteのスプールディレクトリ
を同じにした場合はうまく動きません.また,/var/spool/lpd/lj-5-rawを含む
パーティションはラスタイメージが置かれるので十分空き容量がある場所にした
方が良いでしょう.
フィルタfilter-lj-5は
#!/bin/sh
gs < options > -q -dSAFER -sOutputFile=- - | \
/usr/local/bin/lpr-raw -Plj-5-remote
などとします.標準のlprコマンドを用いてバイナリファイルを出力する場合,
/etc/printcapのエントリ(上記のlj-5-remote)に「mx#0」の項を入れても
「copy file is too large」というエラーを出します./usr/local/bin/lpr-raw
はこれを回避するためにlprのソースを変更したコマンドです(もっとスマート
な方法があるかも知れませんが)./usr/src/usr.sbin/lpr/lpr/lpr.cの
(961014-SNAPでは) 412行あたりの
if (MX > 0 && nr > MX) {
printf("%s: %s: copy file is too large\n", name, n);
break;
}
を
/*if (MX > 0 && nr > MX) {
printf("%s: %s: copy file is too large\n", name, n);
break;
}*/
としてコンパイルし,
install -c -s -o root -g daemon -m 6555 lpr /usr/local/bin/lpr-rawでインストールします.以上の設定で
lpr -Plj-5 hoge.psとすることで出力できます.
参考文献:Grant Taylor,
FreeBSDの広場へ