参考文献は,はねひでや氏の「Japanese Printing mini HOWTO」,「Networking Linux」p.185〜の「プリンタの共有」,「Linux/FreeBSD日本語環境の構築」p.135,Unix Magazineの連載「Unixの道具箱」の「第2回フォントのインストールとPSプリンタ」(94年10月号)といったところ。
ここでは具体的にRedHat4.2+PJE-0.1.1cmをインストールしてある2台のLinuxマシン
hostname IP adress
sc122 133.xxx.yyy.zzz
sc209 133.lll.mmm.nnn
のsc122をプリンタサーバーとし(つまりローカルプリンターをつなぐわけ),sc209はsc122につながったプリンターをリモートプリンターとして使うという状況を例にとる。
0.プリンタポートのデバイス名の確認
プリンタポートのデバイスファイル名は大抵の場合/dev/lp0か/dev/lp1のどちらか。dmesgコマンドで調べると分かる。あと
# cat test.txt > /dev/lp0
# cat test.txt > /dev/lp1
などとして直接適当なテキストファイルを垂れ流して出力が出たほうが使えるデバイスファイル,と確認する方法もある。なんでこんなことを書くのかというとDELL DIMENSION XPS D300 + RedHat4.2の時はそのままではデバイスファイルが使えなくてBIOSの設定をいじる必要があったという経験があるから。詳しくは別項「プリンターデバイスを認識させる」参照。
1. ローカルプリンターの設定
(1)まずデーモンlpdが動いているか
% ps -ax | grep lpd
なんぞで確認する。普通は動いているはず。
(2−a)PostScriptファイル印刷用の設定(これをdefault printerとする=プリンター名はlp)
プリンターがPostScriptプリンターなら設定は簡単なのだが,そうでないプリンターの場合はPostScriptファイルをプリンターが理解できるページ記述言語(ESC/PとかLIPSとか)に変換するソフトであるフィルターというものが要る。RedHatにはいろいろfilterがついていて,それを使うなら,(rootになって)コントロールパネルを起ち上げて「Printer Configuration」で簡単に設定ができるんやけど,それでは日本語に対応していない(やったかな)。んで,日本語対応Ghostscript(これはPJE-0.1.1cmに入っている)のフィルターを使うことにする,ということでGUIの「Printer Configuration」は使えないのでフィルターのスクリプトを自分で書いて,/etc/printcapというプリンターの設定ファイルも自分で書くことになる(ちなみに「Printer Configuration」は勝手に/etc/printcapやspoolディレクトリなんかを勝手に作ってくれるわけ)。
(2−a−1)フィルタースクリプトを書く(rootになってやる,でないと/usr/localの下には書き込めんわなあ)
filterスクリプトとして/usr/local/lib/print_filters/ps2lips3というのを以下のように書いた(chmod +xで実行権を与えるのを忘れないように)。なお/usr/local/libの下のprint_filtersというディレクトリは自分が作ったフィルター置き場用に俺が作ったもの。
/usr/local/lib/print_filters/ps2lips3の中身
#!/bin/sh
#
# Filter to change PostScript to Canon LIPS III
# Requires ghostscript (usr/local/bin/gs and support files)
# This shell script was written Y. Kakehi on 98/04/24.
#
/usr/local/bin/gs -q -r600 -sDEVICE=lips3 -dNOPAUSE -sPAPERSIZE=a4 -sOutputFile=- -
exit 0
要は/usr/local/bin/gsをいろんなオプションつきで実行しとるだけなんやけど,各オプションの意味は
-q → Ghostscriptのメッセージ表示を「しない」
-r600 → 解像度(resolution)を600dpiにする
-sDEVICE=lips3 → 出力デバイスにlips3(PostScriptをLIPS IIIに翻訳する)を使う
-dNOPAUSE → showpage時の特殊プロンプトの表示を「しない」
-sPAPERSIZE=a4 → 紙の大きさをA4に指定
-sOutputFile=- → 出力ファイル名を指定しとるんやけど-なら標準出力になる,とmanにある
- → こうするとgs実行時の引数が入力ファイル名になるらしい,manを見ると
といったあたりか(最後の2つはようわからんけど)。そうそう,ここでスペースを1個どっか余分に入れてしもとって2時間程悩んだことがあった。
(2−a−2)設定ファイル/etc/printcapをいじって(なけりゃ作る。これも当然rootになって)以下のようにする(ただし\はバックスラッシュ)。
(プリンタサーバーの)/etc/printcapの中身
# /etc/printcap
# for printing PostScript files using Canon LASER SHOT LBP-450
lp|Canon LASER SHOT LBP-450:\
:sd=/var/spool/lpd/lp:\
:mx#0:\
:sh:\
:lp=/dev/lp1:\
:if=/usr/local/lib/print_filters/ps2lips3:\
:lf=/var/spool/lpd/lp/lpr-error:
詳しい説明は参考文献を見てもらうとして,簡単に触れておくとプリンター名はlp(lpという名のプリンターはdefault printerとなる)で,他の項目は
sd= → spoolディレクトリ(印刷データファイルが一時的に置いとかれるとこ)を指定
mx#0 → 一度に出力できるファイルサイズは無制限
sh → ヘッダページは(紙の無駄なので)印刷しない
lp → プリンタポートのデバイスファイル名を指定
if → input filterを指定
lf → エラーのログファイルを書き込むファイル名を指定
ということ。
(2−a−3)spoolディレクトリ/var/spool/lpd/lpを作る(これも当然rootで)
(2−b)テキストファイル印刷用の設定(プリンター名はtxtとすることにする)
(2−a−0)lipsfのインストール
Canon LASORSHOT LBP-450にはESC/Pエミュレーション機能もあるし,escpfを使えばええんやけど「Linux/FreeBSD日本語環境の構築」p.135にlipsfなるCanon LASOR SHOT用フィルターがあると書いてあるので,あるならこれを使いましょう,と。で,しかもこれはrpm形式のをftpでとってくることができるのでインストールも楽チン。ありかは
ftp.linux.or.jp/pub/RPM/ALL/lipsf-1.13d-1.i386.rpm
JRPMの皆様に感謝。/usr/local/binの下にlipsfとpolsというプログラムがインストールされる。あとはdocとmanが/usr/docと/usr/local/manの下に。
(2−b−1)フィルタースクリプトを書く(rootになってやる,でないと/usr/localの下には書き込めんわなあ)
/usr/local/lib/print_filters/a2lipsという名前で以下のようなスクリプトを書いた。実行権を与えるのを忘れずに。なお,これはlinux-users-MLの吉田智彦さんの記事([linux-users: 17040])とman lipsf(日本語のmanになっている)を参考にした。
/usr/local/lib/print_filters/a2lipsの中身
#!/bin/sh
#
# Filter to change ASCII to Canon LIPS
# This shell script was written Y. Kakehi on 98/06/02.
#
/usr/local/bin/lipsf -p a4 -s 40 -C\\ -c 80 -T 10 -B 10 -L 30 -R 25 -H"||\f%y/%m/%d %H:%M\f" -F"|- %p -|" <(nkf -j -)
lipsfのオプションの意味は以下の通り(man lipsfによる)。
-p a4 → 紙のサイズはA4(default通りなんやけど)
-s 40 → 文字のサイズは40ドット
-C\\ → 装飾文字開始の合図は\(バックスラッシュ)
-c 80 → 1行は80文字
-T 10 → 上マージンは10mm
-B 10 → 下マージンは10mm
-L 30 → 左マージンは30mm
-R 25 → 右マージンは25mm
-H"||\f%y/%m/%d %H:%M\f" → ヘッダは右寄せで「yy/mm/dd hh:mm」にする
-F"|- %p -|" → フッタはセンタリングで「- ページ番号 -」
ほんまはヘッダはファイル名にしたかったんやけど(full pathで書くなら%F/%f),ここでファイル名を書くと/tmpに置かれるテンポラリファイルの名前になってしまうのであきらめた。ええ方法ないんかな。
なお,フィルタースクリプトを別に書かずに,/etc/printcapの中で
:if=/usr/local/bin/lipsf -p a4 -s 40 (以下オプション):\
と書いて直にlipsfを呼ぶ方法も試したけど,ちゃんと出力はするもののオプションが一切効かんのでやめた。
(2−a−2)設定ファイル/etc/printcapに以下を追加する(ただし\はバックスラッシュ)。
(サーバーの)/etc/printcapに以下を追加
# for printing text files using Canon LASER SHOT LBP-450
txt|Canon LASER SHOT LBP-450:\
:sd=/var/spool/lpd/txt:\
:mx#0:\
:sh:\
:lp=/dev/lp1:\
:if=/usr/local/lib/print_filters/a2lips:\
:lf=/var/spool/lpd/txt/lpr-error:
(3)lpdの再起動
/etc/printcapの設定を有効にするためにrootになって
# /usr/sbin/lpc restart all
と実行する。そうすると
lp:
no daemon to abort
lp:
daemon started
txt:
no daemon to abort
txt:
daemon started
という「再起動したよ」というメッセージが出るはず。なおこれはコントロールパネルの「Printer Configuration」のメニュー「lpd」で「restart lpd」を選ぶのと同じ(「Printer Configuration」の方やとメッセージはもちろん出んけど)。
(4)印刷してみる
PostScriptファイルtiger.psを印刷するなら,プリンター名はlpだから
% lpr -Plp tiger.ps
なのだが,lpはdefault printerだからプリンター名指定の部分-Plpは省略できる(ーPはプリンター名を指定するオプション)。
テキストファイルtest.txtを印刷するなら,プリンター名はtxtだから
% lpr -Ptxt test.txt
でよろしい。LBP-450の液晶窓を見ているとテキストを印刷しているときは「N201」と表示されている。LIPSモードで印刷しとるんとちゃうんやなあ。なんでやろ。PostScriptを印刷しとるときは「LIPS」と出るんやけど。
2.リモートプリンターの設定
クライアントマシンsc209において,sc122のlp,txtという名前のプリンターをlp,txtという名前のリモートプリンターとして使うことにする。
2−a.サーバー側の設定(sc122)の設定
(1)/etc/hostsにクライアントマシンのIPアドレスとhostnameの対応を書き加えておく。具体的には以下の通り。
(プリンタサーバーの)/etc/hostsの中身
127.0.0.1 localhost localhost.localdomain
133.xxx.yyy.zzz sc122
133.lll.mmm.nnn sc209 ←ここを追加
これをやっておくと,IPアドレスでなくhostnameでクライアントマシンを認識するのに,DNSの名前引きに頼るより速く認識してくれる。つまりこの作業はやった方が得やけど必須ではないということ。
(2)クライアントマシンsc209に「わしをリモートプリンターとして使てええで」という許可情報を設定する。具体的には/etc/hosts.lpdというファイル(なければ作る)に以下のようにクライアントのhostnameを記す。
(プリンタサーバーの)/etc/hosts.lpdの中身
#
# hosts.lpd
#
# This file describes the names of the hosts which are
# allowed to use the remote printer services of this
# host. This file is used by the LPD system. This file
# was made by Y. Kakehi on 98/06/02.
sc209
こりゃコメントばっかりで意味のあるんは最後の1行だけやな。
2−b.クライアント側(sc209)の設定
(1)まずサーバマシンとクライアントマシンの双方でデーモンlpdが動いているかを
% ps -ax | grep lpd
なんぞで確認。普通は動いているはず。
(2)/etc/hostsにサーバーマシンのIPアドレスとhostnameの対応を書き加えておく。具体的には以下の通り。
(プリンタサーバーの)/etc/hostsの中身
127.0.0.1 localhost localhost.localdomain
133.lll.mmm.nnn sc209
133.xxx.yyy.zzz sc122 ←ここを追加
これをやっておくと,IPアドレスでなくhostnameでサーバーマシンを認識するのに,DNSの名前引きに頼るより速く認識してくれる。つまりこの作業はやった方が得やけど必須ではないということ。
(3)フィルターを使わない(フィルターはプリンタサーバーに任せる)のでGUIの「printer configuration」が使える。rootになってコントロールパネルの「printer configuration」でリモートプリンターを登録する。設定は以下の通り。
defaultのPostScriptファイル用のは
Names (name1|name2|...) lp ← 自分のマシンで何と名付けるか
Spool Directory /var/spool/lpd/lp
File Limit in Kb (0=no limit) 0
Remote Host sc122
Remote Queue lp ← リモートホスト(sc122)で何と名付けられているか
Input Filter (何も入れない)
テキストファイル用のは
Names (name1|name2|...) txt ← 自分のマシンで何と名付けるか
Spool Directory /var/spool/lpd/txt
File Limit in Kb (0=no limit) 0
Remote Host sc122
Remote Queue txt ← リモートホスト(sc122)で何と名付けられているか
Input Filter (何も入れない)
これは,rootになって手で/etc/printcapを以下のように書いて(コメント行はどうでもええとして),spoolディレクトリを作ってやるのと同等である。
(クライアントの)/etc/printcapの中身
# /etc/printcap
#
# Please don't edit this file directly unless you know what you are doing!
# Be warned that the control-panel printtool requires a very strict format!
# Look at the printcap(5) man page for more info.
#
# This file can be edited with the printtool in the control-panel.
##PRINTTOOL3## REMOTE
lp:\
:sd=/var/spool/lpd/lp:\
:mx#0:\
:sh:\
:rm=sc122:\
:rp=lp:
##PRINTTOOL3## REMOTE
txt:\
:sd=/var/spool/lpd/txt:\
:mx#0:\
:sh:\
:rm=sc122:\
:rp=txt:
(4)lpdを再起動する(rootで)
コントロールパネルの「Printer Configuration」のメニュー「lpd」で「restart lpd」を選べばよい。これはrootで
# /usr/sbin/lpc restart all
とするのと同じ。
(5)印刷してみる。これはローカルプリンターの場合と全く同じ。試してみるべし。