プリンタの利用

著者 &a.kelly;30 September 1995

訳者 &a.kimura;3 September 1996 FreeBSD でプリンタを使用するためには, バークレイラインプリンタ スプーリングシステム (LPDスプーリングシステムとしても知られて います) が機能するようにプリンタをセットアップする必要がありま す. 本節では, LPDスプーリングシステム (大抵の場合, 単にLPDと呼 ばれる) について紹介します. もし, LPDや他のプリンタスプーリングシステムについて既に詳しい 知識をお持ちの方は, 「」から読み始めて も結構です. スプーラは何をするか

LPDはあるホストのプリンタに関する制御の一切をおこないます. こ こで言う制御としては, 次のことが挙げられます. ホストに接続されたプリンタ, あるいはネットワーク 上の他ホストに接続されたプリンタに対するアクセスを制御しま す. ファイルをプリントする要求に対して許可を与えます. この要求は特に 各々のプリンタの シリアルポートに接続したプリンタ用に通信パラ メータを管理します. ネットワーク経由で他のホスト上の, 別のLPDスプーラにジョ ブを送ることができます. 様々なプリンタ言語やプリンタの能力に応じてジョブの 形式を整えるため, 特別なフィルタを起動することができます. プリンタの使用に対して課金をおこなうことができます. 設定ファイルを通して, また, 特別なフィルタプログラムを供給 することにより, 多種多様なプリンタ機器に対して, 上述の機能の 全部または一部をLPDシステムにおこなわせることができます. どうしてスプーラを使うべきなのか

あなたのシステムを利用するのがあなた一人だけだとしたら, ア クセス制御もヘッダページもプリンタ利用に対する課金も必要ないのに, なぜわざわざスプーラに煩わされなければならないのか疑問に思うか もしれません. プリンタに対する直接アクセスを許可することもできるので すが, とにかくスプーラを使用するべきです. その理由は, LPDはジョブをバックグラウンドで処理します. データが プリンタに送信されるまで待つ必要はありません. LPDではジョブをフィルタを通してプリントすることが簡 単にできます. これにより, 印刷物のヘッダに時刻や日付を入れ たり, 特別なファイル形式 (TeX の DVI ファイルなど) をプリン タが処理できる形式に変更することができます. これらの作業を 手動でおこなう必要がなくなります. プリント処理をおこなうフリーのまたは商用のプログラムの ほとんどは, システムのスプーラとやりとりするように作られて います. スプーリングシステムをセットアップすることで, 今後 加えるかもしれない, あるいは, 既に持っている別のソフトウエ アをより簡単にサポートすることができるでしょう. スプーリングシステムのセットアップ

LPDスプーリングシステムを用いてプリンタを使用するためには, プリンタ機器とLPD用ソフトウェアの両方を準備する必要があります. 本ドキュメントでは次の2段階のレベルに分けて説明をします. プリンタを接続する方法, プリンタにどの ように通信するかをLPDに指示する方法や, プレインテキスト をプリンタで印字する方法については, 「」をご覧ください. 様々な形式のファイルを印字する方法, ヘッダページを 印字する方法, ネットワーク経由でプリンタに印字する方法, プリンタを制御する方法, プリンタの使用に対する課金をおこなう 方法については「」をご覧ください. プリンタ設定導入編

この節では, プリンタ機器やプリンタを使用するためのLPD用ソフ トウェアを設定する方法について述べます. この節の概要は次の通り です. 」では, プリンタをコンピュータに接 続するためのヒントがいくつか書かれています. 」では, LPDのスプーラ設定ファイル /etc/printcapの設定方法について書かれています. データをプリンタに送るためにシリアルまたはパラレルインタフェー スではなく, ネットワークプロトコルを使用する場合は, 「」をご覧くださ い. この節のタイトルは「プリンタ設定導入編」ですが, 実際の設定は かなり複雑です. プリンタをコンピュータに接続し, LPDスプーラを 起動させることは一番困難な作業です. ヘッダページを出力させたり, 課金したりするオプションの設定は, 一度プリンタがうまく動くよう になれば, とても簡単です. プリンタ機器の設定

この節では, プリンタにPCを接続するための様々な方法について 説明しています. ここでは, ポートやケーブルの種類, FreeBSDが プリンタとの通信に必要なカーネルコンフィグレーションについて も言及しています. もし, プリンタが既に接続されていて, 他のオペレーティングシステ ム上でプリンタからの印字に成功している場合は, 「」まで読み飛 ばすことが多分できるでしょう. ポートとケーブル

最近のPC用のプリンタほとんどには次のインタフェースの一つ もしくは両方がついています. パラレルインタフェースは「セントロニクス」インタフェー スとして知られています. これは, プリンタ用のコネクタタ イプとして採用された後に名付けられました. シリアルインタフェースはパラレルインタフェースより も普通はデータの伝送速度が遅くなります. パラレルインタフェースで は, 通常, (コンピュータからプリンタへの) 単方向通信のみをおこな うのに対して, シリアルインタフェースは双方向通信をおこないます. 最近のパラレルポートの多くはプリンタ側からデータを受けとる こともできますが, コンピュータ側にデータを送り返すことが必 要となるプリンタはほとんどありません. さらに, FreeBSDでは 双方向のパラレル通信をまだサポートしていません. 通常, プリンタで双方向通信が必要となるのは, プリンタが PostScript 言語に対応しているときだけです. PostScript プリ ンタは非常に冗長に動作させることができます. 事実, PostScript によるジョブでは, プログラムを本当にプリンタ に送信します. このことは, 印字作業を必ずしもする必要がない ことを意味し, また, プログラムの結果をコンピュータに直接返 されるかもしれません. PostScript プリンタでは, 双方向 通信を使って, PostScript プログラムのエ ラーや紙づまりといった問題をコンピュータに報告します. ユー ザはそれらの情報を知りたいと思うかもしれません. さらに, PostScript プリンタで課金作業をもっとも効率よくおこなうため には双方向通信が必要となります. この方法では, まず, プ リンタの現在のページカウント (起動してから今まで何枚の紙を 印字したか) の情報を得ます. 次に, ユーザのジョブをおこない, 終 了後, 再びページカウントを得ます. この2数を差によって, 課 金対象となる紙の枚数を知ることができます. それでは, どちらのインタフェースを使うべきなのでしょうか. 双方向通信が必要なら, シリアルポートを使ってくださ い. FreeBSDではパラレルポート上での双方向通信はまだサポー トされていません. 双方向通信の必要がなく, パラレルかシリアルかの選 択ができる場合はパラレルインタフェースを使うのが好ましい です. これにより, シリアルポートを他の周辺機器 (端末やモ デムのなど) のために残しておくことができます. また, パラ レルインタフェースの方がほとんどの場合高速であり, 設定も より簡単になっています. 結局のところは動いてくれるものを使えばよいのです. パラレルポート

プリンタをパラレルインタフェースを使って接続する場合は, セントロニクスケーブルでプリンタとコンピュータをつないでくださ い. 詳しい説明はプリンタ, コンピュータ, あるいは両方に付属す る説明書に書かれているはずです. その際, どのパラレルポートを使用したかを覚えておいてください. FreeBSDでは最初のポートは /dev/lpt0, 2番目は /dev/lpt1 であ り, 3番目以降も同様に続きます. シリアルポート

シリアルインタフェースを使ってプリンタを使う場合は, 適切 なシリアルケーブルでプリンタとコンピュータを接続してください. 詳しい説明はプリンタ, コンピュータ, あるいは両方に付属する説 明書に書かれているはずです. 「適切なシリアルケーブル」がよくわからないときは, 次のどれか を試してみてください. A この他に, プリンタ用の通信パラメータを設定する必要がありま す. 通常, プリンタのフロントパネルやDIPスイッチによって制 御します. コンピュータとプリンタの双方で設定できる最高の通 信速度[bps] (ビット/秒. ソフトウェアの設定

本節ではFreeBSDのLPDスプーリングシステムで印字をおこなうために 必要となるソフトウェアの設定について説明しています. 本節の概要は次のようになります. プリンタで使用するポートのために, 必要があれば, カー ネルの書き変えをおこないます. 「」で, このためにしなくてはなら ないことを説明しています. パラレルポートを使用している場合は, パラレルポートの ための通信モードの設定します. 詳細は, 「」で説明しています. オペレーティングシステムからプリンタにデータが送ら れているかをテストします. 「」で, どのように テストするかの提案をいくつかおこなっています. ファイル/etc/printcapを変更し, LPDの設定を おこないます. 「」で, どのように変更するかを 説明しています. カーネルの変更

オペレーティングシステムのカーネルのコンパイルをおこなうこと によって, 指定されたのデバイスが機能するようになります. シリ アル, または, パラレルインタフェースをプリンタで使用する場合, 必要なデバイスがこの指定の中に含まれていなくてはなりません. したがって, 必要なデバイスがカーネルに組み込まれていない場合, 追 加のシリアル, または, パラレルポートをサポートするために, カー ネルの再コンパイルが必要となるかもしれません. シリアルポートが現在使用しているカーネルでサポートされている かどうかを調べるためには, 次のように入力します. dmesg | grep sio ここで, sio2 at 0x3e8-0x3ef irq 5 on isa sio2: type 16550A パラレルポートが現在使用しているカーネルでサポートされている かどうかを調べるためには, 次のように入力します. dmesg | grep lpt ここで, lpt0 at 0x378-0x37f on isa 上記の出力が得られない場合, プリンタを使うため, オペレーティ ングシステムにパラレル, または, シリアルポートを認識し, 使用 できるようにするためにはカーネルを変更する必要があります. シリアルポートをサポートさせるには, 「」の節をご覧く ださい. パラレルポートをサポートさせる場合も, その節と, ポート用エントリを /dev に追加する

カーネルがシリアル, または, パラレルポートを通じての通 信をサポートしていたとしても, システム上で動いているプログ ラムがデータの送受信をおこなうためのソフトウェアインタフェース がさらに必要になります. そのインタフェースは, /dev ディレクトリにあるエントリに相当します. /dev エントリにポートを加えるために /dev ディレクトリに移動します. cd /dev 次のように入力します. ./MAKEDEV ここで, 次を入力し, デバイスのエントリができたか確認し ます. ls -l パラレルポートの通信モードを設定する

パラレルインタフェースを使用している場合, FreeBSDでは, 割り込み駆動型にするか, プリンタとの通信の状況をカーネルに監 視させるかのいずれかを選択できます. GENERIC カーネルでは 割り込み駆動方式は, いくらか高速になりますが, 貴重な IRQ ラインを一つ消費します. うまく機能するものをお使いください. 通信モードを設定するためには2つの方法があります. 1つはカー ネルを変更することで, もう一つは カーネルを設定することによって, 通信モードを変更す る. カーネルコンフィグレーションファイルを変更しま す. イベント駆動方式にする場合は, device lpt0 at isa? port? tty irq ここで, 監視方式を使用する場合は, device lpt0 at isa? port? tty vector lptintr ファイルをセーブし, config プログラムを起動 し, カーネルの構築, インストールをおこないます. そして, リ ブートしてください. 詳細は, 「」を参照 してください. lptcontrol -i -u lptcontrol -p -u これらのコマンドを /etc/rc.local ファイルに追加 しておくと, システムをブートする度に通信モードを設定する ことができます. 詳細については, lptcontrol(8) をご覧くだ さい. プリンタとの通信状況を調べる

スプーリングシステムの設定に進む前に, オペレーティング システムがプリンタにデータを送ることに成功しているかどうか を確かめるべきでしょう. これにより, 印字がうまくいかないと き, プリンタとの通信が問題なのか, スプーリングシステムが問 題なのかを分けて調べることがかなり容易になります. プリンタをテストするためには, プリンタに何かのテキストを送 信してみます. 送信した文字をすぐに印字してくれるプリンタに は, %!PS 100 100 moveto 300 300 lineto stroke 310 310 moveto /Helvetica findfont 12 scalefont setfont (Is this thing working?) show showpage パラレルポートのプリンタとの接続を調べる

この節では, FreeBSDがパラレルポートに接続されたプリ ンタと通信できているかどうかを調べる方法について説明し ています. パラレルポートのプリンタをテストするために プリンタにデータを送ります. プリンタがプレインテキストを印字できる場 合, lptest > /dev/lpt ここで, プリンタが PostScript か他のプリンタ 言語を使用している場合, そのプリンタに簡単なプロ グラムを送信してください. 次のように入力します. cat > /dev/lpt そして, 一行一行, プログラムを もしくは, プログラムを入力したファイルがある 場合は, 次のように入力してください. cat /dev/lpt ここで, これで何かがプリントされることでしょう. 印字されたテキ ストがおかしくても心配しなくても構いません. それについ ては, 後で修正します. シリアルポートのプリンタとの接続を調べる

この節では, FreeBSDがシリアルポートに接続されたプリ ンタと通信できているかどうかを調べる方法について述べられ ています. シリアルポートのプリンタをテストするために /etc/remote ファイルを編集します. 次の エントリを加えてください. printer:dv=/dev/ ここで, 次の例は, プリンタをシリアルケーブルでパリティなし, 転送速度19200bpsで第3番目のシリアルポートに接続した場 合です. printer:dv=/dev/ttyd2:br#19200:pa=none tip printer これがうまくいかなかった場合は, /etc/remoteを 編集して, /dev/ttydの代わりに /dev/cuaaを試してみてください. プリンタにデータを送ります. プリンタがプレインテキストを印字できる場 合, ~$lptest プリンタが PostScript か他のプリンタ 言語を使用している場合, そのプリンタに簡単なプロ グラムを入力します. 一行一行, プログラムを もしくは, プログラムを入力したファイルがある 場合は, 次のように入力してください. ˜> ここで, これで何かがプリントされることでしょう. 印字されたテキ ストがおかしくても心配しなくても構いません. それについ ては, 後で修正します. スプーラに許可を与える: /etc/printcap ファイル

ここまでで, プリンタはコンピュータに接続され, (必要なら) プリンタと通信できるようにカーネルを変更し, 簡単なデータをプ リンタに送信することができているはずです. これで, LPDにプリ ンタへのアクセスを制御させる設定をおこなう準備が整いました. LPDの設定は /etc/printcap を編集することでおこないます. LPDスプーリングシステムはスプーラが使われる毎にこのファイル を参照します. そのため, ファイルを更新するとすぐにその変更が 反映されます. /etc/printcap の編集はお好みのテキストエディタをお 使いください. このファイルの書式は, /usr/share/misc/termcap/etc/remote といった他のケイパビリティファイルと一致しています. この書式 のついての詳細な情報については cgetent(3) をご覧ください. スプーラの単純な設定法は, 次のステップでおこないます. プリンタに名前 (と簡単な別名2〜3個) を付け, それを /etc/printcap ファイルに記述します. これについ ては, 「」 を参照してください. 」 を参照してください. スプール用のディレクトリを作成し, その位置を 」 を参照してください. プリンタを使用するために /dev エントリを 設定し, /etc/printcap」 を参照してください. プリンタをシリアルポートに接続した場合は, 」 を参照してください. プレインテキスト用の入力フィルタのインストールを おこないます. 「」 を参照してください. を参照してください. 」で, そ れをどのようにおこなえばよいのかが説明されています. プリンタに名前を付ける

最初の (簡単な) ステップで, プリンタの名前を考えます. プ リンタには別名をいくつか付けることもできるので, 機能的な名前 でも風変わりな名前でもどちらを選んでもまったく問題はありません. 少なくとも1つのプリンタには, /etc/printcap の中 で, /etc/printcap ファ イルに設定します. プリンタ名は一番左のカラムから書き始めま す. 別名はそれぞれ縦棒によって区切られ, 最後の別名の後ろに コロンを置きます. 次の例では, 2台のプリンタ (Diablo 630 ラインプリンタと Panasonic KX-P4455 PostScript レーザライタプリンタ) が定義 されている /etc/printcap のスケルトンを記しています. # # /etc/printcap for host rose # rattan|line|diablo|lp|Diablo 630 Line Printer: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4: この例では, 最初のプリンタに ヘッダページの印字を禁止する

LPDスプーリングシステムでは, デフォルトでジョブ毎に/etc/printcap にあるプリンタのエントリに /etc/printcap の例を示しま す. # # /etc/printcap for host rose - no header pages anywhere # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh: この書式を正しく使うための注意をしておきます. 最初の行は左 端のカラムから始まります. それに続く行は TAB ひとつ分だけ 字下げします. 最後の行以外のすべての行は, 行末にバックスラッ シュを記述します. スプーリングディレクトリの作成

スプーラの簡単な設定の次のステップでは, /var/spool の下に置きます. また, スプーリングディレクトリの内容はバックアップをす る必要はありません. mkdir /var/spool/printer-name しかしながら, ネットワーク上に使用可能なプリンタがたく さんあるならば, LPDで印字するための専用のディレクトリに スプーリングディレクトリを置きたいと思うかもしれません. 例に出てきたプリンタ mkdir /var/spool/lpd mkdir /var/spool/lpd/rattan mkdir /var/spool/lpd/bamboo chown daemon.daemon /var/spool/lpd/rattan chown daemon.daemon /var/spool/lpd/bamboo chmod 770 /var/spool/lpd/rattan chmod 770 /var/spool/lpd/bamboo 最後に, /etc/printcap ファイルで, これらのディ レクトリの位置を LPD に伝える必要があります. スプーリ ングディレクトリのパス名は # # /etc/printcap for host rose - added spooling directories # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo: プリンタ名が最初のカラムから始まっており, そのプリンタ に関して記述される他のエントリは TAB で字下げされてい ること, 各行がバックスラッシュで終わっていることに注意 してください. /var/spool/lpd デフォルト値として使用します. プリンタデバイスの特定

」では, FreeBSD でプリン タとの通信に使用される /dev ディレクトリ内の エントリを特定します. そして, LPD にその情報を伝えま す. 印字するジョブを受け取ると, スプーリングシステムは, (プリンタにデータを渡す義務がある) フィルタプログラムに 代わって指定されたデバイスをオープンします. /etc/printcap ファイルで /dev エントリを記入します. ここでの例では, /etc/printcap には 次のようになります. # # /etc/printcap for host rose - identified what devices to use # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5: /etc/printcap でプリンタの /dev/lp を使用します. /dev/lp は, 現在の FreeBSD には存在していません. 設置したプリンタがパラレルポートに接続されている場合は, 「」まで読み飛ばしてください. そうでない場合は, 次節の説明に続いてください. スプーラのための通信パラメータの設定

シリアルポートにプリンタを接続した場合, プリンタにデー タを送信するフィルタプログラムに代わり, 通信速度やパリ ティ, その他のシリアル通信パラメータを設定することがで きます. このことによる利点は, /etc/printcap を編集するだけで, 様々な 通信パラメータを試してみることができます. フィルタプロ グラムを再コンパイル必要はありません. スプーリングシステムで, シリアル通信の設定が異 なっているかもしれない複数のプリンタに同じフィルタプロ グラムを使うことが可能になります. 次の /etc/printcap の項目で, br#/ デバイスの通信速度を fc#/ デバイスをオープンした後で, fs#/ xc#/ デバイスをオープンした後で, ローカルモードビット xs#/ ローカルモードビット /usr/include/sys/ioctl_compat.h を参照してく ださい. 項目 bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:fs#0x82000c1:xs#0x820: テキストフィルタのインストール

ここまでで, プリンタにジョブを送るために使うテキストフィ ルタを LPD に設定する準備が整いました. 」をご覧ください. ここでの簡単なプリンタ設定では, プリンタにジョブを送るため, /bin/cat を実行するだけの簡単なシェルスクリプ トで間に合います. FreeBSD に標準で付属している 」で詳しく説明します. 最初に, 簡単なテキストフィルタであるシェルスクリプト /usr/local/libexec/if-simple を作ってみましょ う. 次のテキストをお好みのテキストエディタでファイルに 書き込んでください. #!/bin/sh # # if-simple - Simple text input filter for lpd # Installed in /usr/local/libexec/if-simple # # Simply copies stdin to stdout. Ignores all filter arguments. /bin/cat && exit 0 exit 2 そして, このファイルを実行可能にします. chmod 555 /usr/local/libexec/if-simple LPD にこのテキストフィルタを使うことを設定するためには, /etc/printcap/etc/printcap の例のプリンタ 2台に, このフィルタを加えてみましょう. # # /etc/printcap for host rose - added text filter # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:\ :if=/usr/local/libexec/if-simple: 印字してみよう

簡単な LPD 設定も終わりにたどり着きました. 残念ながら, 設定はこれでおしまいというわけではありません. なぜなら, さらに, 設定をテストし, すべての問題点を解決しなくては ならないからです. 設定をテストするために, 何かを印字し てみましょう. LPD システムで印字をするためには, 」で紹介した, あるテスト用のテキストを生成してくれる 簡単な LPD 設定をテストするために:

次のように入力してください. lptest 20 5 | lpr -P ここで, /etc/printcap で指定したプリンタ名 (もしくはその別名) です. デフォルト のプリンタを使用する場合は, !"#$%&'()*+,-./01234 "#$%&'()*+,-./012345 #$%&'()*+,-./0123456 $%&'()*+,-./01234567 %&'()*+,-./012345678 更にプリンタをテストしたい場合は, (言語ベースのプリン タのための) もっと大きなプログラムを送信するか, 引数を 変えて 」をご覧ください. トラブルシューティング

/usr/local/libexec/if-simple を次のように変更して, プリンタへジョブを送信した後に FROM FEED 文字を印字させるようにします. #!/bin/sh # # if-simple - Simple text input filter for lpd # Installed in /usr/local/libexec/if-simple # # Simply copies stdin to stdout. Ignores all filter arguments. # Writes a form feed character (\f) after printing job. /bin/cat && printf "\f" && exit 0 exit 2 !"#$%&'()*+,-./01234 "#$%&'()*+,-./012345 #$%&'()*+,-./0123456 あなたは プリンタが CR を受け取ったとき CR 動作 (復帰) をおこなう. プリンタが LF を受け取ったとき CR + LF 動作 (復帰, 改行) をおこなう. このように動作させるための方法がいくつかあります. これらの文字の解釈を変えるために, プリンタ の設定スイッチかコントロールパネルを操作する方 法. どのようにして設定をするかはプリンタのマニュ アルを参照してください.

自動的に LF を CR+LF に変換してくれる FreeBSD 用のシリアルドライバを入手する方法. も ちろん, このドライバはプリンタ専用に接続される シリアルポート/etc/printcap ファ イルで対象プリンタの LF 文字の扱いを一時的に変更するための 次に, Hewlett Packard 社の PCL エスケープコー ドに対応しているプリンタのためのテキストフィル タの例を示します. このフィルタでは, プリンタ に LF 文字を LF と CR の2文字として扱わせます. その後に, プリンタにジョブを送ります. 最後に, ジョブの最終ページの紙を排出するため, FROM FEED 文字を送ります. このフィルタは Hewlett Packard 社のほとんどすべてのプリンタで機能するは ずです. #!/bin/sh # # hpif - Simple text input filter for lpd for HP-PCL based printers # Installed in /usr/local/libexec/hpif # # Simply copies stdin to stdout. Ignores all filter arguments. # Tells printer to treat LF as CR+LF. Writes a form feed character # after printing job. printf "\033&k2G" && cat && printf "\f" && exit 0 exit 2 ホスト orchid にある /etc/printcap の 例を以下に示します. ここには, 一番目のパラレル ポートにプリンタ (Hewlett Packard LaserJet 3Si) が一台接続されており, そのプリンタ名は # # /etc/printcap for host orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/hpif: if-simple の cat の部分 を置き換えればよいわけです. 具体的にどのように するかは, 読者への練習問題としましょう. プリンタが CR を受け取ったとき CR 動作 (復帰) をおこなう. プリンタが LF を受け取ったとき CR + LF 動作 (復帰, 改行) をおこなう. if-simple の cat の部分を置き換えればよいわけ です. 具体的にどのようにするかは, 読者への練習問題とし ましょう. プリンタが XON/XOFF のフロー制御をサポート している場合は, 項目 プリンタがキャリアフロー制御をサポートして いる場合は, 項目 プリンタがフロー制御をまったくサポートしていな い場合は, 項目 /etc/printcap ファイルで設定した 内容と一致しているかどうかも確認してください. /etc/printcap ファイルで, デバッグしているプ リンタのエントリに ( rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple:\ :lf=/var/log/rattan.log 次に, もう一度印字をおこなってみます. そして, 発生したと思 われるエラーメッセージを見るためにログファイル (上記の 例では, /var/log/rattan.log) を調べます. そこ で見られたメッセージを元に, 問題を解決してみてください. 項目 /dev/console を使います. プリンタを使う

この節では, FreeBSD で設定したプリンタを使う方法について説明 します. ここでは, ユーザレベルでのコマンドを概説します. 管理者用コマンド 」に記 します. このコマンドは, プリンタやそのキューの制御のために用い られます. /etc/printcap のように操作の対象となるプリンタやキュー を指定します. これによって, 様々なプリンタに対してジョブを送る, 取り消す, 調査することができます. 印字する

ファイルを印字するためには, 次のように入力してください. lpr これにより, 入力されたファイルのそれぞれをデフォルトのプリンタ から印字します. ファイル名が与えられなかった場合, lpr /etc/host.conf /etc/hosts.equiv 印字させるプリンタを選択するためには, 次のように入力します. lpr -P 次の例では, プリンタ ls -l | lpr -P rattan 上記の 」をご 覧ください. ジョブの処理状況を調べる

lpq -P bamboo は, プリンタ bamboo is ready and printing Rank Owner Job Files Total Size active kelly 9 /etc/host.conf, /etc/hosts.equiv 88 bytes 2nd kelly 10 (standard input) 1635 bytes 3rd mary 11 ... 78519 bytes この例では, 」をご覧ください. ジョブ番号9のジョブは2つのファイルを処理します. すなわち, waiting for bamboo to become ready (offline ?) kelly: 1st [job 009rose] /etc/host.conf 73 bytes /etc/hosts.equiv 15 bytes kelly: 2nd [job 010rose] (standard input) 1635 bytes mary: 3rd [job 011rose] /home/orchid/mary/research/venus/alpha-regio/mapping 78519 bytes ジョブの削除

印字するようジョブを送った後で印字を中断したくなったときは, 特定のプリンタへのジョブを削除するときは, lprm -P bamboo 10 上記の略記法をデフォルトプリンタではなく特定のプリンタに対して おこなうときは, lprm -P rattan - rose% lpr -P rattan myfile rose% rlogin orchid orchid% lpq -P rattan Rank Owner Job Files Total Size active seeyan 12 ... 49123 bytes 2nd kelly 13 myfile 12 bytes orchid% lprm -P rattan 13 rose: Permission denied orchid% logout rose% lprm -P rattan 13 dfA013rose dequeued cfA013rose dequeued rose% その他の印字オプション

整形と変換に関するオプション

以下の lpr -P bamboo -d fish-report.dvi このオプションは, ジョブに含まれるすべてのファイルに対して適用さ れます. したがって, 1つのジョブに (例えば) DVI ファイルと ditroff ファイルを混在させることはできません. その代わりに, ファイルを 形式毎に別々のジョブに分け, それぞれのジョブでその形式用の変換 オプションを使って印字してください. 」で説明しています. 次の例では, zcat /usr/share/man/man1/ls.1.gz | troff -t -man | lpr -t ジョブに関するオプション

以下のオプションは, 」をご覧ください.

次の例では, デフォルトプリンタで lpr -#3 parser.c parser.h ヘッダページ用オプション

以下のオプションにより, ジョブのヘッダページに通常印字さ れるテキストを 」を参照してください. 」をご覧ください. プリンタを管理する

プリンタの管理者として, プリンタの設置, 設定, そして, それ らのテストをおこなう必要がありました. プリンタの起動, 停止をおこなう. キューへの入力の許可, 禁止をおこなう. それぞれのキューにあるジョブの順番を変更する. 最初に用語に関する注意をしておきます. プリンタが/etc/printcap 内に ある全プリンタに対しておこなわれることになります. コマンドラインから上記のコマンドを入力すると, プリンタ設定上級編

この節では, 特殊な形式のファイルを印字するためのフィルタ, ヘッ ダページ, ネットワーク越しのプリンタへの印字, そして, プリンタ 使用の制限や課金について説明しています. フィルタ

LPD では, ネットワークプロトコル, キュー, アクセス制御, そ して, 印字のためのその他の側面について扱いますが, 」を参照) しかしながら, 形式変換やプリンタ課金, 特定のプリンタの癖, など をうまく利用するためには, フィルタがどのように機能するかという ことを理解しておくべきです. これらの側面を扱うためには, 最終的 には, フィルタの責任であるからです. そして, これは悪い情報です が, ほとんどの場合において, /usr/libexec/lpr/lpf というフィルタが1つ付いています. (このフィルタはファイルに含まれるバックスペースやタブを扱いま す. また, 課金をすることもできますが, できることはこれだけしか ありません.) いくつかのフィルタとフィルタの構成要素が FreeBSD の ポート集にもあります. この節で述べることは次の通りです. 」では, 印字の過程におけ るフィルタの役割を概説します. この節を読むことで, LPD がフィルタを使うときに, 「見えないところで」何が起こっている かが理解できるでしょう. このことを知っておくと, プリン タそれぞれに様々なフィルタをインストールしたときに遭遇 するかもしれない問題を予期したり, デバッグするときに役 立つでしょう. LPD では, すべてのプリンタからデフォルトでプレインテ キストを印字できることを期待しています. このことは, プ レインテキストを直接印字できない PostScript (また は他の言語用の) プリンタでは問題を引き起こします. 「」 で, この問題を克服する方法について述べます. PostScript プリンタをお持ちの方は, この節をお読みになること をお薦めします. PostScript は様々なプログラムのための有名な出 力形式です. ある人たちは (著者自身を含めて) PostScript のコードさえも直接書いてしまいます. しかし, PostScript プリンタは高価です. 「」では, PostScript データを」では, 図形や組版データといっ た特定のファイル形式を, プリンタが理解できる形式へ変換 する作業を自動的におこなわせる方法について述べます. この節 を読むと, troff のデータを印字するには 」 では, あまり使われない LPD の機能のすべて, すなわち, 出力フィルタに関することが記述されています. ヘッダページ (「」参照) を印字させていない場合は, 多分, この節は飛ばしても構わないでしょう. 」では, 」では, 日本語を含むテキスト を印字するためのヒントを述べてます. --> フィルタはどのように機能しているか

既に言及したように, フィルタとは, プリンタにデータを送る 際に, デバイスに依存した部分を取り扱うために LPD によって起動 される実行プログラムです. LPD がジョブ中のファイルを印字しようとするとき, LPD はフィル タプログラムを起動します. このとき, フィルタの標準入力を印字す るファイルに, 標準出力をプリンタに, そして, 標準エラー出力をエ ラーログファイル (/etc/printcap 内の /dev/console) にセットします. LPD が起動するフィルタと, その引数が何であるかは, /etc/printcap ファイルの内容と, ジョブの起動時に ユーザが指定した 」をご覧ください). /etc/printcap で指定可能なフィルタは次の3種類がありま す. [-c] -w ここで, /etc/printcap で指定された 」 で, これらに関するすべてについて説明します. プリンタの課金をする必要がある場合は, 変換フィルタでも 印字ページを数える作業が必要となります. 変換フィルタは次の引数をとって起動されます. -x ここで, 」で, これらのことについて説明し ます. アウトプットフィルタに対する引数は次の2つだけです. -w ここで, フィルタは, 次に示すの終了状態をもってプログラムを FreeBSD に付属するテキストフィルタ /usr/libexec/lpr/lpf は, FROM FEED 文字が送られたと きやプリンタ使用に対する課金をどのようにするかを決定するために, ページ幅やページ長の引数を利用します. また, 課金用のエントリを 作成するため, ログイン名, ホスト名, 課金ファイル名の引数を利用 します. もし, フィルタの購入を検討しているならば, LPD と互換性がある かどうかを確認してください. もしそうならば, 上述の引数リストをサ ポートしていなければなりません. 一般向けの使用のためにフィルタ を作成する計画をしている場合は, 同じ引数リストと終了コードをサ ポートしてください. プレインテキストのジョブを PostScript プリン タで印字する

コンピュータと PostScript (または, 他の言語に対応し た) プリンタをあなたしか使用しない場合は, プリンタにプレ インテキストを絶対に送らない, そして, プリンタにプレインテキス トを送りたがっている様々なプログラムの機能を決して使わないこと にしてください. そうすれば, この節に書かれたことに心を煩わせる必 要はまったくなくなります. しかし, PostScript とプレインテキストの両方のジョブをプリン タへ送りたいと思っている場合は, プリンタ設定についての要求が増 えるでしょう. 両者をプリンタへ送信するためには, 到着 したジョブがプレインテキストであるか PostScript であるかを 検出するテキストフィルタが必要です. PostScript のジョブは すべて 」を参照してください). もし含まれていないならば, すぐにそのようにすべきです. もちろん, 自分自身でプログラムを取ってきて, コンパイルし, インストールす ることもできます. /etc/printcap の中のシリアル接続した PostScript プリンタのエントリに対して, 次を使ってください. :if=/usr/local/libexec/psif: LPD にプリンタをリード・ライトモードでオープンさせるために, #!/bin/sh # # psif - Print PostScript or plain text on a PostScript printer # Script version; NOT the version that comes with lprps # Installed in /usr/local/libexec/psif # read first_line first_two_chars=`expr "$first_line" : '\(..\)'` if [ "$first_two_chars" = "%!" ]; then # # PostScript job, print it. # echo $first_line && cat && printf "\004" && exit 0 exit 2 else # # Plain text, convert it, then print it. # ( echo $first_line; cat ) | /usr/local/bin/textps && printf "\004" && exit 0 exit 2 fi 上記のスクリプトにおいて, 」を参照してください) には, 非 PostScript プリンタで PostScript をシミュレートする

PostScript は質の高い組版と印字をおこなうための #!/bin/sh # # ifhp - Print Ghostscript-simulated PostScript on a DesJet 500 # Installed in /usr/local/libexec/hpif # # Treat LF as CR+LF: # printf "\033&k2G" || exit 2 # # Read first two characters of the file # read first_line first_two_chars=`expr "$first_line" : '\(..\)'` if [ "$first_two_chars" = "%!" ]; then # # It is PostScript; use Ghostscript to scan-convert and print it # /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 -sOutputFile=- - \ && exit 0 else # # Plain text or HP/PCL, so just print it directly; print a form # at the end to eject the last page. # echo $first_line && cat && printf "\f" && exit 2 fi exit 2 最後に, :if=/usr/local/libexec/hpif: これでおしまいです. 変換フィルタ

」 に書かれた簡単な設定が完了したら, 最初に, やってみたいと思 うことは, 多分(プレイン ASCII テキストに加えて) 好みのファイル形式 のための変換フィルタをインストールすることでしょう. なぜ, 変換フィルタをインストールするのか?

変換フィルタによって, 様々な種類のファイルを印字するこ とが簡単になります. 例えば, TeX 組版システムでたくさんの仕事 をしたと仮定しましょう. そして, PostScript プリンタが接続 されているとします. すると, TeX で DVI ファイルを作成する度に, DVI ファイルを印字するために, これを PostScript ファイルに 変換する必要があります. このコマンドは次のようになるでしょう. dvips seaweed-analysis.dvi lpr seaweed-analysis.ps DVI ファイル用の変換フィルタがインストールしてあると, LPD に 変換を肩代わりさせることで毎回毎回おこなわなければならなかった面倒 な変換作業を省くことができます. つまり, DVI を生成したら, 次のような1回のコマンド入力だけで, これが印字されます. lpr -d seaweed-analysis.dvi LPD に DVI ファイルの変換をさせるためには, 」に載せてあります. 変化のオプションのそれぞれをプリンタにサポートさせるためには, /etc/printcap の中で指定しなくてはなりません. 変換フィ ルタは, プレインテキストを印字する代わりに, フィルタはファイル をプリンタが理解できる形式に変換するところを除けば, 「プリンタ の簡単な設定」で説明したテキストファイル (「」 を見て下さい) に似ています. どの変換フィルタをインストールすべきか?

使いたいと思う変換フィルタをインストールすべきです. DVI のデータを頻繁に印字するならば, DVI 変換フィルタ をインストールするのが適切でしょう. 印字しなくてはなら ない troff を大量に抱えている場合は, 多分, troff フィ ルタが欲しくなるはずです. 次の表は, LPD で動作するフィルタと, /etc/printcap ファイルでのエントリする項目, そして, /etc/printcap ファイル形式 項目 lpr オプション ------------ ------------- ---------- cifplot cf -c DVI df -d plot gf -g ditroff nf -n FORTRAN text rf -f troff tf -t raster vf -v プレインテキスト if なし, -p, または -l 先の例のように, /etc/printcap 内のエントリで, 変換フィルタのインストール

変換フィルタは FreeBSD の基本システムのインストールとは別 にインストールするプログラムなので, 変換フィルタは, 多 分, /usr/local ディレクトリの下に置くべ きです. フィルタは LPD だけが実行する特別なプログラム, すなわち, 一般ユーザが実行する必要すらない プログラムなので, /usr/local/libexec ディレ クトリに置くのが普通です. 変換フィルタを使用可能にするためには, /etc/printcap の目的のプリンタの適切な項目に フィルタがあるパス名を指定します. DVI 変換フィルタをプリンタ /etc/printcap ファイルの例を以下 に再掲します. # # /etc/printcap for host rose - added df filter for bamboo # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf: DVI フィルタは /usr/local/libexec/psdf という 名前のシェルスクリプトです. このスクリプトは次のように なっています. #!bin/sh # # DVI to PostScript printer filter # Installed in /usr/local/libexec/psdf # # Invoked by lpd when user runs lpr -d # exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@" このスクリプトでは, 」 を参照してください) を LPD に与えられた引数を付けて起動 します. 変換フィルタのその他の例

変換フィルタのインストールには決まったステップがないの で, その代わりに, 例をもっと挙げることにします. これを, 自分でフィルタを作る際のガイドにしてください. 適当な例が あったら, それをそのまま使ってください. 次のスクリプト例は, Hewlett Packard LaserJet III-Si の ための, raster (ええと・・実は, GIF ファイル) 用の変 換フィルタです. #!/bin/sh # # hpvf - Convert GIF files into HP/PCL, then print # Installed in /usr/local/libexec/hpvf PATH=/usr/X11R6/bin:$PATH; export PATH giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \ && exit 0 \ || exit 2 ここでは, GIF ファイルから PNM (portable anymap) 形式 に変換し, 次に PGM (portable graymap) 形式に変換してか ら, LaserJet/PCL-互換データに変換しています. 上記のフィルタを使うプリンタのためのエントリを付け加え た /etc/printcap ファイルは次のようになります. # # /etc/printcap for host orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/hpif:\ :vf=/usr/local/libexec/hpvf: 次のスクリプトは, PostScript プリンタ #!/bin/sh # # pstf - Convert groff's troff data into PS, then print. # Installed in /usr/local/libexec/pstf # exec grops | /usr/local/libexec/lprps "$@" 上記のスクリプトではプリンタとの通信をおこなうため, #!/bin/sh # # pstf - Convert groff's troff data into PS, then print. # Installed in /usr/local/libexec/pstf # exec grops これで完成しました. 次に, フィルタを使用可能にするため に /etc/printcap に加える必要があるエントリを 示します. :tf=/usr/local/libexec/pstf: 次の例をみたら, FORTRAN のベテランは赤面するかもしれ ません. この FORTRAN テキストフィルタは, プレインテキ ストを直接印字できるすべてのプリンタで利用できます. この フィルタをプリンタ #!/bin/sh # # hprf - FORTRAN text filter for LaserJet 3si: # Installed in /usr/local/libexec/hprf # printf "\033&k2G" && fpr && printf "\f" && exit 0 exit 2 そして, このフィルタを使用可能にするため, 以下の行を /etc/printcap のプリンタ :rf=/usr/local/libexec/hprf: これが最後の, そして, 若干複雑な例です. 前に紹介した LaserJet プリンタ /etc/printcap に書 き加えます. :df=/usr/local/libexec/hpdf: さて, 難しい部分であるフィルタの作成をおこないます. このた めに, DVI から LaserJet/PCL への変換プログラムが必要 です. FreeBSD のポート集 (「」を参照してください) には, それがあ ります. /dev/fd/0 を使うのは問題がありま す. この問題は, (/dev/fd/0 に (シンボリックな) リンクを張る ことで回避することができます. これで, /tmp ディレクトリはスティッ キービットが立っています. フィルタはリンクを作ることが できます. しかし, リンクは別のユーザに所有されているた め, 作業が終了したとき, このリンクを削除することができ ません. その代わりに, シンボリックリンクは現在の作業ディレクト リ, すなわち, スプーリングディレクトリ (/etc/printcap/tmp ディレクトリ よりもたくさんあるからです. 以下に示すのが最後のフィルタです. #!/bin/sh # # hpdf - Print DVI data on HP/PCL printer # Installed in /usr/local/libexec/hpdf PATH=/usr/local/bin:$PATH; export PATH # # Define a function to clean up our temporary files. These exist # in the current directory, which will be the spooling directory # for the printer. # cleanup() { rm -f hpdf$$.dvi } # # Define a function to handle fatal errors: print the given message # and exit 2. Exiting with 2 tells LPD to do not try to reprint the # job. # fatal() { echo "$@" 1>&2 cleanup exit 2 } # # If user removes the job, LPD will send SIGINT, so trap SIGINT # (and a few other signals) to clean up after ourselves. # trap cleanup 1 2 15 # # Make sure we are not colliding with any existing files. # cleanup # # Link the DVI input file to standard input (the file to print). # ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0" # # Make LF = CR+LF # printf "\033&k2G" || fatal "Cannot initialize printer" # # Convert and print. Return value from dvilj2p does not seem to be # reliable, so we ignore it. # dvilj2p -M1 -q -e- dfhp$$.dvi # # Clean up and exit # cleanup exit 0 自動変換: その他の変換フィルタ

ここまでに述べてきたフィルタによって, 印字環境の能率が 上がったことと思います. しかし, これはどのフィルタを使 うかを ( 出力フィルタ

LPD スプーリングシステムでは, ここまでにまだ取り上げていな いフィルタ形式, 出力フィルタをサポートしています. 出力 フィルタは, テキストフィルタのように, プレインテキスト のみを印字するために意図されたものですが, 非常に簡単化 されています. テキストフィルタを用いずに, 出力フィルタ を使っている場合は, 次のようになります. LPD はジョブ中の各ファイルに一度ではなく, ジョブ 全体に対して一度だけ出力フィルタを起動します. LPD は出力フィルタに対し, ジョブ中のファイルの先 頭や末尾を特定するための対策を一切おこなっていません. LPD はユーザのログイン名やホスト名をフィルタに渡 しません. したがって, 課金の処理をおこなうことは考えてい ません. 実際, 出力フィルタには, 以下2つの引数しか与え られません. -w ここで, 出力フィルタの簡便さに誘惑されてはいけません. もし, ジョ ブ中のそれぞれのファイルに別のページ番号を付加しようと しても, 出力フィルタは」をご覧ください. さらに, 出力 フィルタは, 実のところ, 」 を参照してください) だけを印字させるために, 出 力フィルタを起動させます. それから LPD では, アウトプッ トフィルタに2バイトの文字 (ASCII 031 の次に ASCII 001) を送ることで, 出力フィルタが テキストフィルタ

プログラム /usr/libexec/lpr/lpf は, FreeBSD の バイナリ配布に付属しているテキストフィルタ (入力フィル タ) で, 出力を字下げしたり (/etc/printcap ファイルの中の 」をご覧ください. ヘッダページ

あなたが管理するシステムのユーザが」をご覧ください. ヘッダページの印字を許可する

」 では, /etc/printcap ファイルの #!/bin/sh # # hpof - Output filter for Hewlett Packard PCL-compatible printers # Installed in /usr/local/libexec/hpof printf "\033&k2G" || exit 2 exec /usr/libexec/lpr/lpf 」 をご覧ください. 次に, 以前紹介したプリンタ /etc/printcap ファイルの例を示します. ここでは, ヘッ ダページの印字を許可し, 上記の出力フィルタを追加しました. # # /etc/printcap for host orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/hpif:\ :vf=/usr/local/libexec/hpvf:\ :of=/usr/local/libexec/hpof: さて, ユーザが 」 をご覧ください. /etc/printcap 中の ヘッダページを制御する

ヘッダページの印字が許可されていると, LPD は k ll ll k l l k l l k k eeee l l y y k k e e l l y y k k eeeeee l l y y kk k e l l y y k k e e l l y yy k k eeee lll lll yyy y y y y yyyy ll t l i t l oooo u u ttttt l ii n nnn eeee o o u u t l i nn n e e o o u u t l i n n eeeeee o o u u t l i n n e o o u uu t t l i n n e e oooo uuu u tt lll iii n n eeee r rrr oooo ssss eeee rr r o o s s e e r o o ss eeeeee r o o ss e r o o s s e e r oooo ssss eeee Job: outline Date: Sun Sep 17 11:04:58 1995 LPD はこのテキストの終わりに FROM FEED 文字を加えます ので, ジョブは新しいページから開始されます (ただし, /etc/printcap で出力先のプリンタのエントリに /etc/printcap ファ イルの中で rose:kelly Job: outline Date: Sun Sep 17 11:07:51 1995 デフォルトでは, LPD はヘッダページを最初に印字し, 次 にジョブの印字をおこないます. この順番を逆にするときは, /etc/printcap ヘッダページに対する課金

LPD に備わっているヘッダページ出力機能を使うと, 入力され たジョブに対して課金をおこなうことができても, ヘッダページは LPD のやり方を受け入れ, ヘッダページは無料とする. LPDng や PLP といった LPD の代替品をインストール する. LPD と入れ替えが可能な他のスプーリングソフトウェ アに関しては, 「」をご覧ください. /etc/printcap PostScript プリンタでのヘッダページ

これまでに述べたように, LPD ではプレインテキストのヘッ ダページをたくさんのプリンタに合うように生成することができます. 残念ながら, PostScript プリンタは, プレインテキストを直接 印字することができません. ですから, LPD のヘッダページ機能は まったく役に立たない, あるいはほとんどの場合で役に立ちません. ヘッダページを出力するための自明な方法の1つに, すべての変換フィ ルタとテキストフィルタにヘッダページを生成させる方法があります. フィルタは, 適切なヘッダページを生成するために, ユーザ名とホス ト名の引数を使うべきです. この方法の欠点は, いつでも, #!/bin/sh # # make-ps-header - make a PostScript header page on stdout # Installed in /usr/local/libexec/make-ps-header # # # These are PostScript units (72 to the inch). Modify for A4 or # whatever size paper you are using: # page_width=612 page_height=792 border=72 # # Check arguments # if [ $# -ne 3 ]; then echo "Usage: `basename $0` " 1>&2 exit 1 fi # # Save these, mostly for readability in the PostScript, below. # user=$1 host=$2 job=$3 date=`date` # # Send the PostScript code to stdout. # exec cat < そして, 変換フィルタやテキストフィルタがそれぞれ, 最初にこのス クリプトを起動することで, ヘッダページが出力され, それから, ユー ザのジョブの印字をおこないます. 次に, このドキュメントの始めのほう で紹介した DVI 変換フィルタを, ヘッダページを印字するように変 更したものを示します. #!/bin/sh # # DVI to PostScript printer filter # Installed in /usr/local/libexec/psdf # # Invoked by lpd when user runs lpr -d # orig_args="$@" fail() { echo "$@" 1>&2 exit 2 } while getopts "x:y:n:h:" option; do case $option in x|y) ;; # Ignore n) login=$OPTARG ;; h) host=$OPTARG ;; *) echo "LPD started `basename $0` wrong." 1>&2 exit 2 ;; esac done [ "$login" ] || fail "No login name" [ "$host" ] || fail "No host name" ( /u/kelly/freebsd/printing/filters/make-ps-header $login $host "DVI File" /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args このフィルタがユーザ名やホスト名を決定するために引数リストをど のように解析しなくてはならないかという点に注意してください. こ の解析方法は他の変換フィルタに対しても同様です. しかしながら, テキストフィルタについては, 引数の設定が少し異なっています (こ れについては, 「」をご覧ください). 前述の通り, 上記の手法は, 極めて単純なのにも関らず, 」で紹介したトリックを使う必要があります. すな わち, LPD が生成するヘッダページの解析をおこない, PostScript 版のヘッダページを出力させる出力フィルタを作るのです. この場 合, ユーザが リモートプリンタからの出力

FreeBSD では, ネットワーク越しの印字, すなわち, ジョブをリ モートプリンタに送ることをサポートしています. リモートプリンタ からの出力をするには, 一般に, 次の2つを参照してください. リモートホストに接続されたプリンタにアクセスする方 法. プリンタがあるホストのシリアル, または, パラレルイ ンタフェースに接続されている場合, ネットワーク上の他の ホストからこのプリンタにアクセスできるように LPD を設 定します. 「」でどのよう にするかを説明します. ネットワークに直接接続されているプリンタにアクセ スする方法. プリンタに, 旧来のシリアル, または, パラレ ルインタフェースに加えて (もしくは, これらに代わって) ネッ トワーク用のインタフェースがある場合. そのようなプリン タは次のように動作するでしょう. そのプリンタが LPD のプロトコルを理解でき, リモー トホストからのジョブをキューに入れることさえできる場合. この場合, プリンタは, LPD が起動している一般のホスト のように振る舞います. そのようなプリンタを設定するため に, 「」と同様の手 順をおこなってください. そのプリンタが, データストリームによるネットワー ク接続をサポートしている場合. この場合, ネットワーク上 の1つのホストとしてプリンタを「接続」します. このホス トは, ジョブをスプーリングする責任を負い, スプーリング されたジョブはプリンタに送られます. そのようなプリンタ をインストールするためのいくつかの提案が「」にあります. リモートホストに接続されたプリンタ

LPD スプーリングシステムでは LPD (または LPD 互換のシス テム) が起動している他のホストへジョブを送る機能が始めからサポー トされています. この機能により, あるホストに接続されたプリンタ へ, 他のホストからアクセスできるようになります. また, LPD プ ロトコルを理解するネットワークインタフェースを持ったプリンタに 対しても, この機能は働きます. リモートプリンタへの出力を許可するためには, 最初に, あるホスト (これを, 」に書かれた簡単なプリンタの設定をおこなってください. 必要ならば, 「」にあ る, 更に進んだ設定をおこなってください. そして, そのプリンタをテス トしてうまく動作することを確認し, LPD に許可した機能がうまく働 くかどうかを見てください. LPD 互換のネットワークインタフェースを持つプリンタを使用してい る場合は, そのプリンタ自身が以下で説明する/etc/printcap ファイルに次にあげるエント リを作ります. 名前のエントリ. どんな名前でもよいのですが, 簡単 のため, 多分, プリンタホストで設定されたプリンタ名や別 名と同じものを使いたいと思うでしょう. スプーリングディレクトリを作成し, これで終わりです. 変換フィルタやページの大きさやその他の事項を /etc/printcap に加える必要はありません. 次に, リモートホストに接続されたプリンタで印字するための設定例 を示します. ホスト rose には2台のプリンタ /etc/printcap を示します (このファイルは, 「」で参照することができます). このファイルには, 既に, プリンタ # # /etc/printcap for host orchid - added (remote) printers on rose # # # teak is local; it is connected directly to orchid: # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/ifhp:\ :vf=/usr/local/libexec/vfhp:\ :of=/usr/local/libexec/ofhp: # # rattan is connected to rose; send jobs for rattan to rose: # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan: # # bamboo is connected to rose as well: # bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo: orchid で必要となる作業はスプーリングディレクトリを作ることだ けです. mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo chown daemon.daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo これで, orchid のユーザが lpr -P bamboo -d sushi-review.dvi すると, orchid の LPD システムは, ジョブをスプーリングディレ クトリ /var/spool/lpd/bamboo にコピーし, これが DVI ファイルを印字するジョブであることを記録します. ホスト rose の ネットワークにおけるデータストリームのインタ フェースを持つプリンタ

プリンタのネットワークインタフェースカードは, 2種類に分 類することができます. 1つはスプーラをエミュレートするもの (高価) で, もう1つはシリアルやパラレルポートを使うようにプリンタにデー タを送ることができるだけのもの (安価) です. この節では, 後者の使 い方を説明します. 前者のプリンタは, 前節「」 の方法が適用できます. /etc/printcap ファイルでは, シリアルかパラレルのイン タフェースのどちらを使うのか, そして, (シリアルインタフェース を使う場合) そのボーレートはいくらであるか, フロー制御は使うのか, タブのための遅延を加えるのか, 改行文字を変換するかなどの指定を おこなうことができます. しかし, TCP/IP や他のネットワークポートか らデータを受け取るプリンタを接続するための指定をおこなうことはでき ません. ネットワーク接続されたプリンタにデータを送るためには, テキスト フィルタと変換フィルタから呼び出すことができる通信プログラムを 開発する必要があります. 以下に, そのようなプログラムの例を示し ます. スクリプト #!/usr/bin/perl # # netprint - Text filter for printer attached to network # Installed in /usr/local/libexec/netprint # $#ARGV eq 1 || die "Usage: $0 "; $printer_host = $ARGV[0]; $printer_port = $ARGV[1]; require 'sys/socket.ph'; ($ignore, $ignore, $protocol) = getprotobyname('tcp'); ($ignore, $ignore, $ignore, $ignore, $address) = gethostbyname($printer_host); $sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address); socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol) || die "Can't create TCP/IP stream socket: $!"; connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!"; while () { print PRINTER; } exit 0; このスクリプトは, 様々なフィルタが利用することができます. 仮に, Diablo 750-N ラインプリンタを持っており, これがネットワークに 接続されているとしましょう. プリンタはポート番号5100にて印字す るデータを受け取ります. プリンタのホスト名は scrivener としま す. このとき, このプリンタのテキストフィルタは次のようになりま す. #!/bin/sh # # diablo-if-net - Text filter for Diablo printer `scrivener' listening # on port 5100. Installed in /usr/local/libexec/diablo-if-net # exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100 プリンタの利用に制約を与える

本節では, プリンタの利用に制約を与えるための情報を記して います. LPD システムでは, プリンタ (ローカル, リモートのいずれ に接続されていても) にアクセスできる人を制限する機能, 複数部の コピーの印字の可否を制御する機能, ジョブのサイズの最大値やプリ ンタキューに入るジョブの最大個数を制御する機能を提供しています. 複数部のコピーの印字を制限する

LPD システムではユーザが複数部のコピーの印字を簡単におこなう 機能を提供しています. ユーザが, (例えば) /etc/printcap ファイルに lpr: multiple copies are not allowed リモートホストからプリンタをアクセスできる設定にしている場合 (この 設定については, 「」をご覧ください), その リモートホストの /etc/printcap にも同じように /etc/printcap ファ イルは, ホスト rose のものです. プリンタ # # /etc/printcap for host rose - restrict multiple copies on bamboo # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:sc:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf: さらに, orchid の /etc/printcap にも # # /etc/printcap for host orchid - no multiple copies for local # printer teak or remote printer bamboo teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\ :if=/usr/local/libexec/ifhp:\ :vf=/usr/local/libexec/vfhp:\ :of=/usr/local/libexec/ofhp: rattan|line|diablo|lp|Diablo 630 Line Printer:\ :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc: lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign このような悪用を防ぐ方法は (その指示を無視することも含めて) たく さんあります. 各自で調べてみてください. プリンタを使用できる人を限定する

それぞれのプリンタを使用できる人を限定するには, UNIX の グループ権限のメカニズムを利用し, さらに, /etc/printcap lpr: Not a member of the restricted group 」をご覧ください), かつ, そ のホストでもプリンタを使用できる人を限定するのが妥当であると思 う場合は, そのホストの /etc/printcap にも /etc/printcap を示します. # # /etc/printcap for host rose - restricted group for bamboo # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf: これ以外の /etc/printcap ファイル (ホスト orchidのもの) はそのままにしておくことにします. もちろん, orchid のユーザは 全員 入力可能なジョブのサイズを制限する

たくさんのユーザからプリンタが利用される場合には, 多分, ユーザが印字要求を出すことができるファイルのサイズに上限値を置 く必要が生じるでしょう. 結局のところ, スプーリングディレクトリ が置かれているファイルシステムの空き容量がその上限値になる訳で すが, あるユーザがこれを独占的に使用すること避けるために, 他ユー ザからのジョブ用の空き容量を確保する必要もあります. LPD では, # # /etc/printcap for host rose # # # No limit on job size: # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: # # Limit of five megabytes: # bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf: この場合もそうですが, この制限はローカル (ホスト rose) のユーザ のみに適用されます. リモートホストからプリンタを利用できるよう に設定している場合は, そのリモートホストのユーザはこの制限を受 けません. これらのユーザにも制限を加える場合は, リモートホスト の /etc/printcap」を参照してください. リモートホストに接続されたプリンタへのジョブのサイズを制限する 特別な方法は他にもあります. これについては, 「」を参照してください. リモートホストからのプリンタの利用を制限する

LPD スプーリングシステムでは, リモートホストから要求され たジョブの印字を制限するための方法がいくつか提供されています. /etc/hosts.equiv/etc/hosts.lpd によって制御することができます. LPD では, あるホストから印字の要求がきたとき, このホス トの名前がこれら2つのファイルのどちらかに含まれている かどうかを調べます. これが含まれていない場合は, LPD はこの要求を拒否します. これらのファイルの形式は単純です. 各行にホストの名前を 1つずつ書いていきます. ファイル /etc/hosts.equiv の方は ruserok(3) プロトコル でも利用され, /etc/hosts.equiv の記述は慎重におこないましょう. 例として, 以下にホスト rose の /etc/hosts.lpd を示します. orchid violet madrigal.fishbaum.de この例では, rose はホスト orchid, violet, そして madrigal.fishbaum.de からの要求を受け付けることになり ます. その他のホストが rose の LPD にアクセスしようと しても, LPD はこれを拒否します (訳注:拒否されるのは, そのホストが /etc/hosts.equiv にも含まれてい ない場合です). /etc/printcap を調べてみましょ う. 以下に, bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:mx#5000:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf: スプーリングディレクトリは echo 6144 > /var/spool/lpd/bamboo/minfree /etc/printcap/usr/bin/false などを指定 して, これらのユーザのアカウントはプリンタ用の「形式的 な」ものとします. プリンタの利用に対する課金

という訳で, 印字するためには料金をとることが必要です. 取ら ない理由などありましょうか. 紙やインクにはお金がかかります. そ して, プリンタの維持費もかかります. プリンタには可動部分が搭載 されており, これらの部分は壊れやすいという傾向があります. プリ ンタや, その利用形態, 維持費について調査をし, 1ページ (1フィー ト, 1メートルなど) 当たりにかかるコストを調べておいてください. これに基づき, プリンタの利用に対する課金を, 実際に, どのように 始めればよいのでしょうか. さて, 残念ながら, この部分に関しては LPD スプーリングシステム はほとんど役に立ちません. 課金は使用しているプリンタの種類, 印 字するもののファイルの形式, プリンタの利用に対する課金での」をご覧く ださい. 一般に, 課金方式には次の2つがあります. LPD スプーリングシステムでは, 両方式を簡単にですがサポー トしています. これは, (ほとんどの場合で) 印字作業をフィ ルタがおこなっていたように, 課金作業もこのためのコードも用 意することで実現されています. しかし, 明るい面もありま す. それは, 課金方式に関して, 非常に大きな柔軟性が与え られたということです. 例えば, 「定期的に課金する方法」 か, 「利用毎に課金する方法」のどちらかを選びまず, そし て, どんな情報 (ユーザ名, ホスト名, ジョブのタイプ, 印 字された頁数, 使用した紙の大きさ, 印字をするために要した 時間など) をログに記録するかを決めます. 以上のことをおこな うには, 上記の情報を保持するために, フィルタを変更しな くてはなりません. 手軽なプリンタ課金方法

FreeBSD には, 「定期的に課金する方法」による課金をすぐに 設定できるように, 2個のプログラムを添付しています. そ の内の1つはテキストフィルタ 」をご覧ください. もう1つは, 」で述べたように, LPD では テキストフィルタや変換フィルタを起動しますが, そのコマ ンドラインで使用している課金データファイルの名前が指定 されます. 両フィルタはこの引数を使って, どの課金データ ファイルのエントリに書き込めばよいのかを知ることができ ます. このファイルの名前は /etc/printcap 中の 2.00 rose:andy 3.00 rose:kelly 3.00 orchid:mary 5.00 orchid:mary 2.00 orchid:zhang 課金データファイルはプリンタ毎に分けて作るべきです. こ れは, /etc/printcap 中の Login pages/feet runs price orchid:kelly 5.00 1 $ 0.10 orchid:mary 31.00 3 $ 0.62 orchid:zhang 9.00 1 $ 0.18 rose:andy 2.00 1 $ 0.04 rose:kelly 177.00 104 $ 3.54 rose:mary 87.00 32 $ 1.74 rose:root 26.00 12 $ 0.52 total 337.00 154 $ 6.74 /etc/printcap/etc/printcap Login pages/feet runs price andy 2.00 1 $ 0.04 kelly 182.00 105 $ 3.64 mary 118.00 35 $ 2.36 root 26.00 12 $ 0.52 zhang 9.00 1 $ 0.18 total 337.00 154 $ 6.74 課金額を決めるために, /etc/printcap ファ イルの pac -p1.50 このオプションを使うと, 実際の課金額を集計することができます. 最後に, 印字されたページ数をどのように数えるか?

課金を, リモートホストからの印字でさえも, 正確におこなうため には, ジョブで使用された紙が何ページであるかを特定でき る必要があります. このことは, プリンタ利用に対する課金 をおこなう上の根本的な問題です. プレインテキストのジョブの場合, 問題を解決するのはさほ ど難しくはありません. ジョブが何行であったかを数え, プ リンタがサポートしている紙1ページに印字できる最大の行 数と比較すればよいのです. 重ね打ちするために利用される ファイル中のバックスペース文字や, 物理的に複数の行に渡 る長い論理行に対する取り扱いを忘れずにおこなってください. (「」で紹介した) テキストフィルタ 標準スプーラの代替品

このマニュアルを最初から通読されている方ならば, ここまでで, FreeBSD 付属の LPD スプーリングシステムに関して知っておくべき ことすべてを学ばれたことと思います. 多分, このシステムに あるたくさんの欠点について認識できたことでしょう. すると, 「(FreeBSD 上で動作する) スプーリングシステムには他にどのような ものがあるのか」という疑問が自然と湧いてきます. 残念ながら, 著者は代替のスプーラを 」です. 「」にもあります. PLP は BSD LPD スプーラと極めて似ていますが, 以下のも のを含むホストの機能が自慢です. ネットワークサポートの強化. ネットワーク接続され るプリンタのサポートや NIS で管理可能な printcap ファ イル, NFS マウントされるスプーリングディレクトリの機 能が組み込まれています. 洗練されたなキュー管理. 1つのキューで複数のプリン タに対応可能. キュー間でジョブを転送したり, キューのリ ダイレクトができます. リモートプリンタの制御機能 ジョブの優先順位付け 拡張性のあるセキュリティとアクセスオプション 」です. 謝辞

このドキュメントの開発の手助けをして頂いた以下の方々に感謝の 意を表わしたいと思います.