Epson PM with lpd on pips
Postscriptプリンタなぞ買えない
基本的にUnix環境はハードコピーの出力先をPostscriptプリンタとして想定していると思います。Postscriptプリンタは高価なので自宅で所有しているひとはあまりいないと思います。それでは、FreeBSDからプリントアウトできないのか、というとGhostscriptを利用することで可能です。Ghostsciptは任意のPSファイルを出力対象とするプリンタのデータ方式に変換することができます。つまり以下のような図式になり、全体の系としてはPSプリンタとして見なせることができるわけです。
ところで、これを実現するためにはGhostsciptが当該プリンタのデータ形式を知っていなければいけません。EpsonのPMシリーズの場合、ESC/Pラスターのコマンド非公開となっていますので手も足も出ません。そこで、EPSON KOWA社が公開しているLinuxむけのデバイスドライバPIPSの登場になります。
PIPSとは
PIPSとは「Photo Image Print System」の略で、Linux上で「pngファイル」からPMシリーズのプリンタへの出力を可能にしたものです。「なんだ、png形式に変換しないといけないのか」という風に思われているかもしれません。ここに肝があるわけです。pipsにはfilter???,gsconfig???というフィルタが同梱されています。???にはPMシリーズの機種名です。FreeBSDからプリントアウトするには伝統的なlpdを利用するわけですが、当該プリンタに出力するときに任意のフィルタを設定することができます。fileter???はシェルスクリプトで、その中でgsconfig???が呼び出されています。gsconfig???はpsファイル→pngファイルに変換するものです。
ここまでを整理すると、lpdを使って、pipsをフィルタにし、PMプリンタに出力にするには、
- psファイルの場合
- 適切に設定された/etc/printcapの設定により、lpdに対して発生したジョブにフィルタ(/usr/local/libexec/pips/filter???)が通される。
- filter???の中ではgsconfig???が呼び出されこれにより当該psファイルはpngファイルに変換される。
- 変換されたpngファイルは最終的にpips???本体に読み込まれその標準出力がlpdによってプリンタに出力される。
以上、/etc/printcapを適切に設定すると自動的にしてくれるようになります。
- Plain Textの場合は??
- すでに系をPostscriptプリンタとして見なしています。Postscriptプリンタにプレインテキストを送ってはいけません。
- でもプレインテキストをプリントアウトしたいときもあります。
- そこで印刷すべきデータがプレインテキストの場合は、a2ps等のツールを使ってpsファイルに変換し、その後に上の「psファイルの場合」のプロセスに組み込みたいと思います。
- そして、印刷すべきデータがpsファイルか、プレインテキストかを判別し、それによって処理を自動的に変更するようにしたい。
これを/etc/printcapだけで実現するには別のプリンタとしてプレインテキスト印刷専用エントリを登録することが考えられますが、今回はひとつのプリンタ設定で自動的に行われるように、filter???を書き換えることにします。
実際の設定
さて、実際の設定に移りましょう。まずは、lpdの設定を適切にすることです。標準ではlpdデーモンは起動していないはずです。rootになって、lpdと入力するだけで立ち上がりますが、再起動するたびに自動的に立ち上がるように/etc/rc.confにlpd_enable="YES"を設定しておくと良いでしょう。
/etc/printcapの設定
まずは、FreeBSD Handbook Chap.11 プリンタの利用を熟読をお勧めします。まずは今回の/etc/printcapの最終形をお見せします。
prn|lp|Epson PM-760C:\
--------:sh:sd=/var/spool/lpd/prn: \
--------:lp=:rm=prn.f-bell.net:rp=lp:\
--------:if=/usr/local/libexec/pips760/filter760:
\
--------:lf=/var/log/lpd-errs:\
--------:mx#0:
まず注意することとして、エントリの最初の行は左端のカラムから始まります。それに続く行はTABひとつ分だけ字下げします。最後の行以外のすべての行は、行末にバックスラッシュを記述します。お気をつけください。
- プリンタの名前をつける(prn|lp|Epson PM-760C)
エントリの一行目はプリンタの名前です。気をつけることとして"lp"という名前のプリンタは少なくともひとつはなくてはなりません。 また、"|"を使って別名をことも可能です。上の設定では、"prn","lp","Epson PM-760C"という3つの名前がつけられていることになります。プリンタ名の最後にプリンタの機種名をつけるのは慣例のようです。
- ヘッダのプリンタを抑制する(sh)
デフォルトではジョブを要求したユーザ名、ジョブを送ったホスト名、ジョブ名を区別できるようなヘッダページをプリントします。これは、多くのユーザが利用しているシステムでは誰がプリントアウトしたのか区別するために有用ですが、個人で使っている場合は不要です。これはshを指定することで抑制することが可能です。
- スプールディレクトリを設定する(sd=/var/spool/lpd/prn)
プリンタに送られるジョブは, その印字が終了するまでこのディレクトリに置かれます。このディレクトリは慣例上以下のように設定されます。# mkdir /var/spool/printername
ネットワーク上に使用可能なプリンタがたく さんあるなら、LPDで印字するための専用のディレクトリに スプーリングディレクトリを置きたいと思うかもしれません。この場合は/var/spool/lpdというディレクトリを作成し、その下にプリンタ名のディレクトリを用意することが一般的なようです。# mkdir /var/spool/lpd
# mkdir /var/spool/lpd/prn
- デバイスの設定をする(lp=:rm=prn.f-bell.net:rp=lp)
ここはプリンタが直接つながっているか(また、パラレルか、シリアルか)、リモートなものなのか、で設定が違います。直接そのマシンにつながっている場合、いずれかのデバイスで認識されていると思うので、そのデバイスをlpで設定します。例えば、USBで認識されている場合は以下の設定がexampleです 。lp=/dev/ulpt0
リモートプリンタの場合、rmにリモートプリンタ名(dnsで設定されている名前)を設定します。その他、lpとrpも設定します。lp=:rm=prn.f-bell.net:rp=lp
- フィルタの設定をする
さて、このフィルタの設定が肝となります。まず、ここで想定しているpsファイルを印刷するためのフィルターを設定してみます。pipsをインストールすると/usr/local/libexec/pips???/filter???としてフィルタ用のシェルスクリプトが用意されています。これをフィルタとして利用するには、以下のように設定します。テキストファイルを印刷するための設定は後述します。if=/usr/local/libexec/pips760/filter760
- その他雑多な設定をする
エラーログの設定をlfでします。デフォルトではコンソールに出力されます。lf=/var/log/lpd-errs
最大ファイルサイズの設定をします。mxで設定をし、0は制限無しです。
mx#0
以上でとりあえず設定はおしまいです。lpdが起動していることを確認し、適当なpsファイルをプリントしてみましょう。
$ lpr -Plp tiger.ps
lprコマンドは-Pオプションでプリンタ名を指定します。省略すると、デフォルトのlpを指定します。どうでしたか?印刷できましたか?
印刷できない場合はprintcapを見直し、先にあげたドキュメントを参照してください。また、エラーログも見てみましょう。今回はpsファイルをできるようになったので、次回はテキストファイルを印刷できるようにします。
