訳註: これは作業してる最中のもので、本来、訳作業者以外は見えぬべきものです。 訳作業者以外は見ないでください。意味が反対になったりとか当然にあるから、 内容は利用しないでください。この言語への変換作業(翻訳作業)物に関しては、現在、オープンなライセンス条件ではありません。 十進240のコードのキャラクターを<240>に置換してる場合あり
Chapter12.Printing

Table of Contents

12.1. Enabling the printer daemon
12.2. Configuring /etc/printcap
12.3. Configuring Ghostscript
12.4. Printer management commands
12.5. Remote printing

この章では printing(印刷) のための簡素な設定を記述しています。 最初のパラレルポートにつながった HP Deskjet 690C プリンターを NetBSD に付属している lpd 印刷システムで使います。 最初に、テキスト文書の印刷のシステム設定を、 次に、 Ghostscript プログラム (print/ghostscript) を用いた PostScript 文書の印刷に設定を拡張します。 どうか注意なことに、他にも代案となる 印刷システムが パッケージコレクション で利用可能で、 LPRng (print/LPRng) や Common Unix Printing System (CUPS) (print/cups) がありますが、 ですが、ここでは covered していません。

12.1.Enabling the printer daemon

インストール後もまだ印刷ができるようになっていません。それは lpd プリンタースプーラーデーモンが 有効になっていないからです。 lpd を有効にするには、 /etc/rc.conf ファイルの1行を変更する必要があって:

lpd=NO

から

lpd=YES

にします。この変更は次に起動したときから有効になりますが、 デーモンは手動で今すぐ起動でき:

# sh /etc/rc.d/lpd start

lpd が active かどうかは 次のコマンドで確認します:

# ps ax | grep lpd
  179 ??  Is     0:00.01 lpd 

まえのコマンド出力に lpd の項目がなければ、デーモンは active ではありません。

lpd システムは /etc/printcap を経由し設定されています。 /etc/printcap の設定の前に、 プリンターのテストをし、 計算機とプリンターの物理的接続が working か確認すること は良いアイデアです。 テストは何らかのデータを直接プリンターデバイスに送ることです。 プリンターがパラレルポートにつながっているとすると、これは /dev/lpt0 で; USB プリンターなら /dev/ulpt0 を試してください。 更なる情報は、どうか これらのデバイス (lpt(4), ulpt(4)) の manpages を check してください!

この例ではプリンターはパラレルポートについていてます。 それでこう run し:

# lptest 70 5 > /dev/lpt0

出力がどうなるべきかを見るには、同じコマンドでプリンターへの出力のリダイレクトをせずに 試し:

# lptest 70 5
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef
"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg
#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh
$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi
%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij 

よく起こる問題としては、プリンター出力の 縦の揃いが正しくなくて、だけど、 staircase(階段) になる設定を持っていることです。 これは大抵、プリンターが <CR> (キャリッジリターン、 ASCII 13) キャラクター および <LF> (ラインフィード、 ASCII 10) キャラクターの両方の受信の後、 新しい行の left margin(左縁) から始まるように設定されています。 NetBSD は <LF> キャラクターだけを送出します。 この問題は2つの方法で直すことができ:

  • プリンターの設定の変更

  • 簡素なプリンターフィルターの利用 (後述)

上の例で lpd スプーラーは involved しません。プログラム出力は直接プリンターデバイス (/dev/lpt0) に送られ、 スプールしないからです。

12.2.Configuring /etc/printcap

この節では、テキスト文書を例示したプリンターで 印刷するための設定法を説明します。

プリンターは /etc/printcap ファイルに entry がある必要があって; entry には プリンター id (プリンター名) と プリンター 説明が含まれます。 id の lp は多くのプログラムで 使われる default です。 entry 例として:

Example12.1./etc/printcap

lp|local printer|HP DeskJet 690C:\
        :lp=/dev/lpa0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:\
        :sh:pl#66:pw#80:if=/usr/local/libexec/lpfilter:

ファイル format とオプションについては printcap(5) manpage に詳細が記述されています。 どうか注意として、階段問題の除去を世話してくれる input filter が指定されています ( if オプションで):

if=/usr/local/libexec/lpfilter

Printer driver and HP printers

Example12.1, “/etc/printcap はプリンターに lpd0 (interrupt 駆動ドライバー) デバイスの代わりに lpa0 デバイス (polled ドライバー) を使っています。割り込みの利用はいくつのプリンターで通信問題があり、 HP Deskjet 690C はその1つです: 印刷が非常に遅く、 PostScript 1ページに数時間かかります。 この問題は lpa ドライバーの利用で解決します。 また lpt をポーリングにして custom カーネルをコンパイルすることもできます。

プリンターの printcap entry は スプールディレクトリーも指定し、 これは作られている必要があり; このディレクトリーは lpd デーモンが印刷されるデータを 貯める(accumulate)のに使われます:

# cd /var/spool/lpd
# mkdir lp
# chown daemon:daemon lp
# chmod 770 lp

足りない部分は lpfilter 入力フィルターだけで、 書かれている必要があります。 このフィルターによって、行うべき task は、テキストを送信する前に、 階段問題の除去のためにプリンターを設定することだけです。 この例で使っているプリンターでは次の初期化文字列 : <ESC>&k2G を使います。

Example12.2./usr/local/libexec/lpfilter

#!/bin/sh
# Treat LF as CR+LF
printf "\033&k2G" && cat && exit 0
exit 2

このスクリプトを /etc/printcap で用いた名前でセーブしたあと、 実行可能にすることが必要で:

# chmod 755 /usr/local/libexec/lpfilter*

他のフィルターも使うことができて:

if=/usr/libexec/lpr/lpf:

このフィルターは、上で紹介したものよりも複雑です。 これは nroff の出力を処理するように書かれていて、 アンダーラインと重ね刷り(overprinting)、タブキャラクターの展開、 LF の CR + LF への変換を処理します。 このフィルタープログラムのソースは /usr/src/usr.sbin/lpr/filters/lpf.c にあります。

すべて収めた後、 lptest コマンドをここで再び run でき、 今回は lpr コマンドを使い、最初に lpd スプーラーにデータを送り、それから filter を runs し、 データをプリンターへ発送します:

# lptest 70 5 | lpr -h

lpr プログラムはテキストの印刷に プリンターへデータを送るためにスプーラーを使い; -h オプションでバナーページの印刷を turns off します (あんまり重要なことではありません、 なぜなら /etc/printcapsh オプションだからです)。 System V 印刷システムにより親しんでいるユーザーは lpr(1) に 代わるものとして、 lp(1) コマンド を、使うこともできます。

12.3.Configuring Ghostscript

これで、基本的な印刷が works 。 PostScript ファイルの 印刷機能を追加できます。 例で使われている簡素なプリンターは、 PostScript ファイルの native 印刷に対応していなくて; PostScript 文書をプリンターが理解できるコマンドシーケンスに変換できる プログラムの利用が必要です。 Ghostscript プログラムは、パッケージコレクションにあって、この目的に使えます。この節では、 Ghostscript を使って PostScript ファイルを HP Deskjet 690C で印刷するための lpd の設定法を説明します。

このプリンターの2つめの id を /etc/printcap の中に作って: この新 id は 異なる入力フィルターを使い、これは、 PostScript ドキュメントの実際の印刷を行わせるため Ghostscript を call します。 それゆえ、テキストドキュメントは lp プリンター、 PostScript ドキュメントは ps プリンターで印刷され: 両エントリーは、物理的に同じ プリンターを使うけれど、しかし、異なる印刷フィルターです。

同じ結果が 異なる設定を用いて成し遂げられます。例えば、 single entry で 1つのフィルターだけで行えます。このため、フィルターは 自動的にプリントされるフォーマットの特定ができ、そして、 適切な印刷プログラムを使うことができるべきです。 この approach は簡素ですが、しかし、もっと複雑なフィルターを導き; 気に入るなら、パッケージコレクションの magicfilter プログラムを インストールすることを考慮すべきで: それはこの他に沢山のことを自動的にしてくれます。

私たちの approach には、新しい /etc/printcap ファイルはこのように:

Example12.3./etc/printcap

lp|local printer|HP DeskJet 690C:\
        :lp=/dev/lpa0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:\
        :sh:pl#66:pw#80:if=/usr/local/libexec/lpfilter:

ps|Ghostscript driver:\
        :lp=/dev/lpa0:sd=/var/spool/lpd/ps:lf=/var/log/lpd-errs:\
        :mx#0:sh:if=/usr/local/libexec/lpfilter-ps:

オプション mx#0 は PostScript ファイルの印刷に非常に重要で 入力ファイルのサイズ制限を取り除きます; PostScript ドキュメントは非常に大きくなりがちです。 if オプションは新しいフィルターを指し(points)ます。 また、新しいスプールディレクトリーも指定します。

次のステップは新しいスプールディレクトリーとスプールディレクトリーの作成です。 スプールディレクトリーの手順は上と同じく:

# cd /var/spool/lpd
# mkdir ps
# chown daemon:daemon ps
# chmod 770 ps

PostScript 出力のためのフィルタープログラムは、テキスト base のよりも複雑で: 印刷されるファイルをインタプリターに送り プリンターの制御言語(control language)の コマンドシーケンス(sequence of commands)に変換し、そしてプリンターに送ります。 NetBSD オペレーティングシステムと いくつかのパワフル な freeware パッケージの功徳で 安いカラープリンターを PostScript 出力にふさわしいデバイスに仕立て直す(transform) ことができました。 Ghostscript の設定に使われたオプションは Ghostscript documentation に記述されていて: cdj550 は HP プリンターを駆動するのに使われるデバイスです。

Example12.4./usr/local/libexec/lpfilter-ps

#!/bin/sh
# Treat LF as CR+LF
printf "\033&k2G" || exit 2
# Print the postscript file
/usr/pkg/bin/gs -dSAFER -dBATCH -dQUIET -dNOPAUSE -q -sDEVICE=cdj550 \
-sOutputFile=- -sPAPERSIZE=a4 - && exit 0
exit 2

まとめ: システム上に2つの異なるプリンター名が作られ、 同じ physical プリンターを point するけど、異なるオプションが使われ、 異なるフィルターおよび異なるスプールディレクトリーが使われます。 テキストファイルおよび PostScript ファイルが印刷できます。 PostScript ファイルを印刷するには、 Ghostscript パッケージが システム上にインストールされていなければなりません。

12.4.Printer management commands

この節はプリンターとプリントジョブ管理のための便利な BSD コマンドのリストです。 既に触れた lpr および lpd コマンドの他にもあって:

lpq

プリンターのキューにあるジョブを調べる。

lprm

プリンターのキューから jobs を消す。

lpc

印刷システムをチェックし、プリンターの enable/disable およびプリンター機能。

12.5.Remote printing

印刷システムを リモートホストに接続されたプリンターで印刷するように設定できます。 例えば、 wotan ホストで作業していて、 loge ホストにつながれたプリンターで 印刷したいとします、というところでしょうか。 loge の /etc/printcap ファイルは Example12.3, “/etc/printcap のひとつです。 wotan からは Postscript ファイルを loge 上の Ghostscript を使って印刷することが可能です。

最初のステップは wotan ホストから loge ホストに提出されたプリントジョブを受け入れることです。 これを成し遂げるには、 loge 上の /etc/hosts.lpd ファイルに、ホスト名 wotan の行を加える必要があって:

# hostname
loge
# cat /etc/hosts.lpd
wotan 

このファイルのフォーマットは非常に簡単で: 各行に local システムで印刷することを 許可するホスト名を入れています。 default では lpd デーモンは、 local 接続のための UNIX ドメインソケットだけを listensしていて、いかなるネットワーク接続も accept しません。 デーモン が incoming ネットワーク traffic も accepts するようにするには、 次のものが /etc/rc.conf に加えられる必要があります:

lpd_flags=""

次に、 wotan の /etc/printcap ファイルに loge にプリントジョブを送るための設定が必要です。 例えば:

lp|line printer on loge:\
	:lp=:sd=/var/spool/lpd/lp:lf=/var/log/lp-errs:\
	:rm=loge:rp=lp

ps|Ghostscript driver on loge:\
	:lp=:sd=/var/spool/lpd/ps:lf=/var/log/lp-errs:\
	:mx#0:\
	:rm=loge:rp=ps

この設定と、 Example12.3, “/etc/printcap の1つとの間には、主な違いが4つあります。

  1. lp の定義は空。

  2. rm (リモートマシン) エントリーでプリンターがつながれているホストの名前を定義。

  3. rp (リモートプリンター) エントリーで リモートホストにつながっているプリンターの名前を定義。

  4. loge ホストの定義を使うのでインプットフィルターの指定は不要。

  5. スプールディレクトリーはまだ locally wotan 上につくる必要があり:

    # cd /var/spool/lpd
    # mkdir lp
    # chown daemon:daemon lp
    # chmod 770 lp
    # mkdir ps
    # chown daemon:daemon ps
    # chmod 770 ps

これで、 wotan の lp へのプリントジョブと ps キューは、 loge につながっているプリンターへ自動的に送られます。