FreeBSD ハンドブック : プリンタの利用 : プリンタ設定上級編 : ヘッダページ
Previous: フィルタ
Next: リモートプリンタからの出力

7.6.2. ヘッダページ

あなたが管理するシステムのユーザがたくさんおり, ユー ザ全員が様々なプリンタを使用する場合, 多分, 必要悪である ヘッダページを印字させることを検討したいと思うかもしれま せん.

ヘッダページは, バナーとかバーストページとしても知ら れていますが, 出力されたジョブが誰によるものなのかを特定させる 働きがあります. 印字結果の山の中において, ユーザのジョブによっ て印字された本物のドキュメント部分よりも際立たせるために, ヘッ ダページは, 通常, 多分, 縁が装飾されている大きな太文字で印字さ れます. ヘッダページにより, ユーザは自分が出したジョブがどこに あるのかをすばやく見つけることができます. ヘッダページの欠点は, 明らかに, すべてのジョブに対して, 紙が1枚余分に印字されるという ことです. この紙の有効期間は短く, 2〜3分も続きません. 最終的に, これらの紙は再利用紙入れの中かくずの山に入れられることでしょう. (ヘッダページはジョブ中の各ファイル毎に印字されるのではなく, ジョブ毎に印字されるということに注意してください. したがって, 紙の 消費はそれほどひどくはないかもしれません).

もし, プリンタがプレインテキストを直接印字できるならば, LPD システムは印字物に対して自動的にヘッダページを付けることが できます. PostScript プリンタを使っている場合は, ヘッダペー ジを生成する外部プログラムが必要になります. これについては, 「 PostScript プリンタでのヘッダページ」をご覧ください.

7.6.2.1. ヘッダページの印字を許可する

プリンタ設定導入編」 では, /etc/printcap ファイルの sh (``suppress header'' : ヘッダを供給しないという意味) を指定して, ヘッダペー ジの印字を止めていました. プリンタでのヘッダページの印字を許可 するには, sh 項目を取り除くだけよい訳です.

とても簡単そうに見えるけど, 本当かな?

それは本当です. プリンタに初期化文字列を送るための出力フィ ルタを用意しなくてはならないかもしれません. 次に, Hewlett Packard PCL 互換プリンタの例を挙げます.


#!/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

of 項目に出力フィルタのパス名を指定してください. 詳細につ いては, 「 出力フィルタ」 をご覧ください.

次に, 以前紹介したプリンタ teak のための /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:

さて, ユーザが teak からジョブを印字させたとき, それぞれ のジョブ毎にヘッダページが印字されます. もし, ユーザが印字物を 探すのに時間を費やしたいと思うなら, lpr -h によってジョ ブを入力することで, ヘッダページの印字を止めることができます. これ以外の lpr のオプションについては, 「 ヘッダページ用オプション」 をご覧ください.

注意: LPD では, ヘッダページの最後に, FROM FEED 文字が印 字されます. プリンタに紙排出をさせるために, 別な文字, もしくは, 別な文字列が利用されている場合は, /etc/printcap 中の ff 項目で指定することができます.

7.6.2.2. ヘッダページを制御する

ヘッダページの印字が許可されていると, LPD は 長いヘッ ダを作ります. これには, 紙全面に大きな文字でユーザ名, ホスト 名, ジョブ名が書かれています. 次に, このヘッダページの例を示 します (kelly が ジョブ名 outline を rose というホストから印字 された場合).

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 で出力先のプリンタのエントリに sf (suppress form feeds) が指定されているときはこ の限りではありません).

お望みならば, LPD に短いヘッダページを出力させる こともできます. この場合は, /etc/printcap ファ イルの中で sb (short banner) を指定してください. ヘッダページは次のようになります.

rose:kelly  Job: outline  Date: Sun Sep 17 11:07:51 1995
デフォルトでは, LPD はヘッダページを最初に印字し, 次 にジョブの印字をおこないます. この順番を逆にするときは, /etc/printcaphl (header last) を指定 してください.

7.6.2.3. ヘッダページに対する課金

LPD に備わっているヘッダページ出力機能を使うと, 入力され たジョブに対して課金をおこなうことができても, ヘッダページは無 料で提供しなくてはならない, という特有のやり方を強要されます.

なぜでしょうか.

出力フィルタは単なる外部プログラムなので, 課金をするための制御 をおこなうとすれば, それはヘッダページを印字するときですが, 出力フィ ルタには, ユーザ名とホスト名の情報や課金情報を格納するファ イルがどれな のかということが知らされません. それゆえ, 出力ファイルには, 誰 にプリンタ利用の課金をおこなえばよいのかが分からないのです. テキス トフィルタやその他の変換フィルタ (これらのフィルタはユーザやホ ストの情報が知らされます) が出力ページの枚数に「1ページ分水増し する」だけでは十分ではありません. なぜなら, ユーザは lpr -h に よってヘッダページの出力を止めることができるからです. やみくも に1ページを水増しすると, 印字されてもいないヘッダページに対する 料金をとることになります. 基本的に, lpr -h は環境に優し い心を持つユーザに好まれるオプションですが, これを使うように奨 励することもできません.

各々のフィルタに独自のヘッダページを生成させる (その結果, ヘッ ダページに課金することができる) という方法でも十分であると はいえません. この場合, LPD はフィルタに -h の情報を送 りませんので, lpr -h によってヘッダページを印字しないオ プションを選択したとしても, 依然としてヘッダページは印字され, その分の課金がおこなわれてしまいます.

では, どのような選択肢があるのでしょうか.

ヘッダページへの課金に関しては, 次のことができます.

7.6.2.4. PostScript プリンタでのヘッダページ

これまでに述べたように, LPD ではプレインテキストのヘッ ダページをたくさんのプリンタに合うように生成することができます. 残念ながら, PostScript プリンタは, プレインテキストを直接 印字することができません. ですから, LPD のヘッダページ機能は まったく役に立たない, あるいはほとんどの場合で役に立ちません.

ヘッダページを出力するための自明な方法の1つに, すべての変換フィ ルタとテキストフィルタにヘッダページを生成させる方法があります. フィルタは, 適切なヘッダページを生成するために, ユーザ名とホス ト名の引数を使うべきです. この方法の欠点は, いつでも, lpr -h によってジョブが入力された場合でさえも, ヘッダページが印字 されるということです.

この方法で試してみましょう. 次のスクリプトは, 3つの引数 (ユーザ のログイン名, ホスト名, ジョブ名) をとり, 簡単な PostScript 用 のヘッダページを生成します.


#!/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` <user> <host> <job>" 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 <<EOF
%!PS

%
%  Make sure we do not interfere with user's job that will follow
%
save

%
%  Make a thick, unpleasant border around the edge of the paper.
%
$border $border moveto
$page_width $border 2 mul sub 0 rlineto
0 $page_height $border 2 mul sub rlineto
currentscreen 3 -1 roll pop 100 3 1 roll setscreen
$border 2 mul $page_width sub 0 rlineto closepath
0.8 setgray 10 setlinewidth stroke 0 setgray

%
%  Display user's login name, nice and large and prominent
%
/Helvetica-Bold findfont 64 scalefont setfont
$page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto
($user) show

%
%  Now show the boring particulars
%
/Helvetica findfont 14 scalefont setfont
/y 200 def
[ (Job:) (Host:) (Date:) ] {
	200 y moveto show /y y 18 sub def
} forall

/Helvetica-Bold findfont 14 scalefont setfont
/y 200 def
[ ($job) ($host) ($date) ] {
	270 y moveto show /y y 18 sub def
} forall

%
%  That is it
%
restore
showpage
EOF

そして, 変換フィルタやテキストフィルタがそれぞれ, 最初にこのス クリプトを起動することで, ヘッダページが出力され, それから, ユー ザのジョブの印字をおこないます. 次に, このドキュメントの始めのほう で紹介した DVI 変換フィルタを, ヘッダページを印字するように変 更したものを示します.
#!/bin/sh
#
#  psdf - 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"

( /usr/local/libexec/make-ps-header $login $host "DVI File"
  /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args

このフィルタがユーザ名やホスト名を決定するために引数リストをど のように解析しなくてはならないかという点に注意してください. こ の解析方法は他の変換フィルタに対しても同様です. しかしながら, テキストフィルタについては, 引数の設定が少し異なっています (こ れについては, 「 フィ ルタはどのように機能しているか」をご覧ください).

前述の通り, 上記の手法は, 極めて単純なのにも関らず, lpr で「ヘッダページを印字しない」オプション (-h オプション) が 使えなくなっています. ユーザが森林資源を (あるいは, ヘッダペー ジが課金されているならば, その僅かな金額を), 節約したいと望んでい る場合でも, すべてのフィルタがすべてのジョブ毎にヘッダページを印字 することになっているので, 節約することはできません.

ジョブ毎に印字されるヘッダページをユーザが抑制できるようにする ためには, 「 ヘッダペー ジに対する課金」で紹介したトリックを使う必要があります. すな わち, LPD が生成するヘッダページの解析をおこない, PostScript 版のヘッダページを出力させる出力フィルタを作るのです. この場 合, ユーザが lpr -h でジョブを入力すると, LPD はヘッダペー ジを生成しなくなり, また, 出力フィルタも起動されません. そうで ないならば, 作成した出力フィルタが LPD からのテキストを読み込 み, ヘッダページを印字する適当な PostScript のコードがプリ ンタに送られるでしょう.

PostScript プリンタがシリアルポートに接続されている場合, 出力フィルタとして lprps を, 上記の動作をおこなうものとして psof を使うことができます. ただし, psof はヘッダペー ジに対して課金をおこないませんので注意してください.


FreeBSD ハンドブック : プリンタの利用 : プリンタ設定上級編 : ヘッダページ
Previous: フィルタ
Next: リモートプリンタからの出力