Chapter 6. 印刷

目次
6.1. プリンターデーモンを有効にする
6.2. /etc/printcap の設定
6.3. Ghostscript の設定
6.4. プリンター管理コマンド
6.5. リモート印刷

この章では、印刷のための簡単な設定を記述しています。 例として、 最初のパラレルポートに HP Deskjet 690C をつないでいます。 最初に、テキスト文書の印刷の設定をし、それをもとに、 Ghostscript プログラムを使って PostScript ドキュメントを印刷できるようにします。

6.1. プリンターデーモンを有効にする

インストールが終わっても、まだ印刷ができるようになっていません。それは、 lpd プリンタースプーラーデーモンが有効になっていないからです。 lpd を有効にするには、 /etc/rc.confに、

lpd=YES    

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

# lpd -s    

lpd が active かどうかは、 次のように調べます:

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

この出力に lpd の項目がなければ、 lpd デーモンは動いていません。

/etc/printcap の設定の前に、 プリンターがきちんと接続されているのテストするのが良いでしょう。 例えば:

# lptest 20 10 > /dev/lpt0    

出力がどのようになるべきかは、同じコマンドをプリンターへの 出力のリダイレクトをせずに実行してみます:

# lptest 20 10    

よく起こる問題として、 印刷結果の段(縦の文字位置)がそろっていなくて "staircase" 状の配置になることがあります。 これはたいてい、プリンターの設定で改行 begin a new line at the left margin after が <CR> (キャリッジリターン, ASCII 13) character と <LF> (ラインフィード, ASCII 10) character の 2 character を使うようにしています。 NetBSD は <LF> character だけを送信します。 この問題は直すことができ:

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

6.2. /etc/printcap の設定

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

プリンターは /etc/printcap ファイルに登録されている必要があって、; エントリーには、 printer id (プリンター名) と、プリンターの記述が書かれています。 id の lp は、多くのプログラムで、デフォルトとして使われています。

Example 6-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:    

このファイルフォーマットとオプションについては printcap(5) に 詳細が書かれています。注として、 input filter ( if オプション)に、 階段問題の除去をしてくれるフィルターを指定しています。

if=/usr/local/libexec/lpfilter    

プリンタードライバーと HP プリンター: Example 6-1 では、lpd# (割り込み駆動ドライバー) の代わりにプリンターに lpa# デバイス (ポーリングドライバー)を使っています。 割り込みを使うと、いくつかのプリンターで通信問題を起こすことがあり、 HP Deskjet 690C はそのうちのひとつで: 印刷が非常に遅く PostScript 1ページに数時間かかります。 この問題は lpa ドライバーを使うことで解決します。 また、独自カーネルで lpd をポーリングにしてコンパイルすることもできます。

プリンターの printcap エントリーでは、スプールディレクトリーも指定し、 作っておく必要があり; このディレクトリーは lpd デーモンが印刷するデータをためるのに 使います。

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

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

Example 6-2. /usr/local/libexec/lpfilter

#!/bin/sh
# Treat LF as CR+LF
printf "\033&k2G" && cat && exit 0
exit 2    
# cd /usr/local/libexec
# chmod 755 lpfilter*
    

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

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

lptest コマンドをここで再び実行でき、 このとき lpd スプーラーを使います。

# lptest 20 10 | lpr -h    

lpr プログラムはテキストの印刷に、 プリンターへの送信データのスプーラーを使い; -h オプションで、 バナーページの印刷をやめます(あまり大切なことではありません。 /etc/printcap 中の sh オプションだからです)。

階段問題の解決には、さまざまなツールと方法が使え、 たとえば C プログラムでも。 紹介した解決法が、とても簡単に成果を得られる方法です。

6.3. Ghostscript の設定

基本的な印刷ができるようになりました。 PostScript ファイルの印刷機能を追加します。 簡素なプリンターはプリンター自身で PostScript ファイルの印字に 対応していなくて、 PostScript 文書をプリンターが理解できる a sequence of commandsデータ列 に変換することで印刷できるようになります。 パッケージコレクション( Chapter 8 をご覧ください)の Ghostscript プログラムが 使えます。 この節では Ghostscript を使って、 HP Deskjet 690C で. PostScript ファイルを印刷するための設定法を書きます。

/etc/printcap にプリンターの second id を作って: この新しい id は、違う入力フィルターを使い、 PostScript 文書を処理するために Ghostscript を呼び出します。 ゆえに、 text 文書は lp プリンターで印刷をし、 ps プリンターで PostScript 文書 を印刷します: 両エントリーは同じ物理プリンターを使いますが フィルタープログラムが違うのです。

同じ結果を別の設定で成し遂げることができ、 例えば、 一つの エントリーでフィルターを使ううことができます: フィルターがドキュメントのフォーマットを自動的に決定できて、 適切な印刷プログラムを使うようにすれば良いのです。 このアプローチは、簡潔ですが、フィルターがより複雑なものになり; この方法をとるなら、パッケージコレクションから magicfilter プログラムをインストールすることを検討してみましょう : このパッケージは、これだけではなく、他にも多くのことを自動的にしてくれます。

新しい /etc/printcap ファイルはこのように:

Example 6-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 オプションは新しいフィルターを指します。 新しいスプールディレクトリーも指定します。

最終段階は、 新しいスプールディレクトリーとフィルタープログラムの作成です。

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

PostScript 出力に対するフィルタープログラムは、テキスト用よりも より複雑で: 印刷されるファイルをインタープリターに送り、 プリンターに、順番に、制御言語のコマンドシーケンスを送ります。 NetBSD オペレーティングシステムと、 強力なフリーウェアパッケージの長所は PostScript 出力を、安いカラープリンター用に、 デバイスに適切な変換をすることができるということです。Ghostscript の設定に使うオプションは Ghostscript のドキュメントに書かれていて: cdj550 は プリンターのデバイスです。

Example 6-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つの異なる名をつけることができ、 それは 同一の機械、だけど違うオプションが使われ: 違うフィルターを使い、異なる スプールディレクトリーを用います。 テキストファイルも PostScript ファイルも印刷できます。 PostScript ファイルの印刷には Ghostscript パッケージが インストールされている必要があります。

6.4. プリンター管理コマンド

この節は プリンターとプリントジョブ管理のための 便利な BSD コマンドの一覧です。 すでに触れた lpr および lpd コマンドに並んで:

lpq

そのプリンターのキューにたまっているジョブを調べます。

lprm

プリンターキューから ジョブ を削除します。

lpc

印刷機構のチェックに使え、 プリンターやプリンターの機能を有効/無効にできます。

6.5. リモート印刷

printing system をリモートホストにつながれたプリンターで印刷する ように設定することができます。 例えば、 wotan ホストで作業していて、 (ホスト) loge につながれたプリンターで印刷したいことにします。 loge の /etc/printcap ファイル は Example 6-3 のものです。 wotan からの Postscript ファイルに loge の Ghostscript を使うことができます。

最初の段階は、 loge に wotan ホストから出された プリントジョブを有効にすることです。 これは、 loge 上の /etc/hosts.lpd ファイルに、 wotan ホスト名の行を追加することでできます。 このファイルのフォーマットは非常に単純で: 各行に有効にするホスト名が書かれています。

次に、 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/lp:lf=/var/log/lp-errs:\
	:mx#0:\
	:rm=loge:rp=ps    

この設定と Example 6-3 の設定では、主な違いが4つあります。

  1. "lp" の定義が empty。

  2. "rm" エントリーで プリンターがつながれているホストの名前を指定。

  3. "rp" エントリーで リモートホストにつながっているプリンター名を指定。

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

これで、 (手元の) wotan の "lp" および "ps" へのプリントジョブ は、 (離れた) loge につながれたプリンターへ、自動的に送られます。