FreeBSD ハンドブック : プリンタの利用 : プリンタ設定上級編 : プリンタの利用に対する課金
Previous: プリンタの利用に制約を与える
Next: 標準スプーラの代替品

7.6.5. プリンタの利用に対する課金

という訳で, 印字するためには料金をとることが必要です. 取ら ない理由などありましょうか. 紙やインクにはお金がかかります. そ して, プリンタの維持費もかかります. プリンタには可動部分が搭載 されており, これらの部分は壊れやすいという傾向があります. プリ ンタや, その利用形態, 維持費について調査をし, 1ページ (1フィー ト, 1メートルなど) 当たりにかかるコストを調べておいてください. これに基づき, プリンタの利用に対する課金を, 実際に, どのように 始めればよいのでしょうか.

さて, 残念ながら, この部分に関しては LPD スプーリングシステム はほとんど役に立ちません. 課金は使用しているプリンタの種類, 印 字するもののファイルの形式, プリンタの利用に対する課金でのあなた自身の要求に大きく左右されます.

課金システムを実現するためには, プリンタのテキストフィルタ (プ レインテキストのジョブに対して課金するため) と変換フィルタ (その 他のファイル形式に対して課金するため) を変更して, 印字したペー ジを数えたり, プリンタに印字したページ数を取得するための要求を 送る必要があります. ただし, 出力フィルタのみを利用している場合 は, 課金をおこなうことができません. フィルタに関しては, 「 フィルタ」をご覧く ださい.

一般に, 課金方式には次の2つがあります.

LPD スプーリングシステムでは, 両方式を簡単にですがサポー トしています. これは, (ほとんどの場合で) 印字作業をフィ ルタがおこなっていたように, 課金作業もこのためのコードも用 意することで実現されています. しかし, 明るい面もありま す. それは, 課金方式に関して, 非常に大きな柔軟性が与え られたということです. 例えば, 「定期的に課金する方法」 か, 「利用毎に課金する方法」のどちらかを選びまず, そし て, どんな情報 (ユーザ名, ホスト名, ジョブのタイプ, 印 字された頁数, 使用した紙の大きさ, 印字をするために要した 時間など) をログに記録するかを決めます. 以上のことをおこな うには, 上記の情報を保持するために, フィルタを変更しな くてはなりません.

7.6.5.1. 手軽なプリンタ課金方法

FreeBSD には, 「定期的に課金する方法」による課金をすぐに 設定できるように, 2個のプログラムを添付しています. そ の内の1つはテキストフィルタ lpf で, これについて は, 「 テキストフィ ルタ lpf」をご覧ください. もう1つは, pac で, これはプリンタの課金データファイルからのエントリを集め, これを合計するプログラムです.

フィルタは どのように機能しているか」で述べたように, LPD では テキストフィルタや変換フィルタを起動しますが, そのコマ ンドラインで使用している課金データファイルの名前が指定 されます. 両フィルタはこの引数を使って, どの課金データ ファイルのエントリに書き込めばよいのかを知ることができ ます. このファイルの名前は /etc/printcap 中の af 項目によって指定されます. このファイルが絶対パ スで指定されない場合は, スプーリングディレクトリからの 相対パスとして扱われます.

LPD は, 紙のページの幅と行数 (pwpl 項目で 指定される) を引数として lpf を起動します. lpf では, 何ページ印字したかを決定するためにこれ らの引数を使用します. ファイルをプリンタに送った後, 課 金情報を課金データファイルに書き込みます. このファイル は次のようになります.

   2.00 rose:andy
   3.00 rose:kelly
   3.00 orchid:mary
   5.00 orchid:mary
   2.00 orchid:zhang
課金データファイルはプリンタ毎に分けて作るべきです. こ れは, lpf にはデータファイルをロックする機構が組 み込まれていないためです. したがって, lpf が2つ起動 されたとき, 同じファイルに同時に書き込みをおこなった場合, お互いのエントリが破壊されてしまうかもしれません. 課金 用ファイルを各プリンタ毎に確実に分けるには, /etc/printcap 中の af=acct 項目を使いま す.

プリンタの利用に対してユーザに課金する準備ができたら, スプーリングディレクトリに移動した後, pac と入力 してください. 次のような, ドル中心主義の課金リストが表 示されます(訳注:ドル中心主義という表現は, 表示がドルで 出ることへの著者の皮肉でしょう. セントがあるので小数点 以下が表示されますが, この機能も日本では邪魔ですね).


  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

pac が受け付ける引数には次のようなものがあります.
-Pprinter

プリンタ printer の利用に対する課金リストを作成し ます. このオプションは, /etc/printcapaf が絶対パスで指定されていた場合に限り, 動作しま す.

-c

ユーザ名のアルファベット順ではなく, 課金額の低い順にリ ストを並べます.

-m

課金データファイルにあるホスト名を無視します. このオプショ ンを使用すると, ホスト alpha のユーザ smith とホスト gamma のユーザ smith は同一人物として扱われます. この オプションが指定されない場合は, 両者は別なユーザとして 扱います.

-pprice

/etc/printcappc 項目で指定された値, または, デフォルトの値 (2セント) に代わり, 紙1ページ, ま たは, 1フィート当たりの価格を指定します. price として, 浮動小数点数を指定することができます.

-r

リストの並べる順番を逆順にします.

-s

課金リストを作成し, 課金データファイルを削除します.

names...

ユーザ names に対する課金情報のみを表示します.

pac が生成するデフォルトのリストには, 各ホストのユーザ別 に印字ページ数が表示されます. (ユーザがサイト内のすべてのホスト を使用できるため) ホスト名の情報が意味を持たない場合, pac -m を実行してください. 次のようなリストが得られます.


  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

課金額を決めるために, pac/etc/printcap ファ イルの pc 項目で指定された値 (デフォルト値は200, すなわち1 ページ当たり2セント) を使います. この項目で, 印字物に課金したい と思う1ページ当たり, または, 1フィート当たりの価格を100分の1セ ント単位で指定します. pac-p オプション付きで起動 すると, この値を置き換えることができます. この -p オプショ ンで指定する額の単位は, 100分の1セント単位ではなく, ドル単位で す. 例えば, 次の指定では, 1ページ当たりの単価が1ドル50セントに なります.
pac -p1.50
このオプションを使うと, 実際の課金額を集計することができます.

最後に, pac -s を起動すると, 課金情報は課金データ累計ファ イルに保存されます. このファイルの名前は, プリンタの課金データ ファイルの後ろに _sum を付けたものとなります. そして, 課 金データファイルは削除されます. 次に pac が起動されると, その時点までの累計金額を得るために, 課金データ累計ファイルが読 み込まれ, 通常の課金データファイルからの情報に加算されます.

7.6.5.2. 印字されたページ数をどのように数えるか?

課金を, リモートホストからの印字でさえも, 正確におこなうため には, ジョブで使用された紙が何ページであるかを特定でき る必要があります. このことは, プリンタ利用に対する課金 をおこなう上の根本的な問題です.

プレインテキストのジョブの場合, 問題を解決するのはさほ ど難しくはありません. ジョブが何行であったかを数え, プ リンタがサポートしている紙1ページに印字できる最大の行 数と比較すればよいのです. 重ね打ちするために利用される ファイル中のバックスペース文字や, 物理的に複数の行に渡 る長い論理行に対する取り扱いを忘れずにおこなってください.

(「 テキストフィ ルタ lpf」で紹介した) テキストフィルタ lpf では, 課金をおこなうときに, これらの取り扱いをおこなってくれます. 課 金をおこなうために必要なテキストフィルタを作成している方は, lpf のソースコードが参考になるでしょう.

これに対して, 他のファイル形式の処理はどのようにすれば よいのでしょうか.

まず, DVI から LaserJet, または, DVI から PostScript への変換の場合, フィルタが dviljdvips の 出力メッセージを解析することで, 何ページ分の変換がおこなわ れたかを知ることができます. 他のファイル形式とその変換 プログラムに関しても, 同様のことができるかもしれません.

しかし, この方式には問題点があります. それは, 変換され たページがすべて印字されるとは限らないということです. 例 えば, プリンタが紙詰まりを起こしたり, トナー切れになっ たり, はたまた, 爆発したりするかもしれません. そのよう な状況により印字が途中で中止されたとしても, この方式で は, ユーザは全ページ分の料金を課されてしまうのです.

それでは, どのような対策をたてることができるのでしょう か.

正確な課金をおこなうための唯一の確実な方法は, 何 ページ印字したのかを知らせることができるプリンタを入手 し, これをシリアルポートかネットワークに接続することで す. ほとんどすべての PostScript プリンタではこの概念 がサポートされています. 他のプリンタも同様です (Imagen レーザプリンタをネットワーク接続するなど). それぞれの プリンタのフィルタを, ジョブを印字した後で印字ページ数 を得るように, 変更してください. そして, 課金情報はここ で得られた値のみに基づいて記録してください. 行数 を数えたり, エラーが生じやすいファイルの調査は必要とさ れません.

もちろん, 気前よく印字料 金をすべて無料にすることもできます.


FreeBSD ハンドブック : プリンタの利用 : プリンタ設定上級編 : プリンタの利用に対する課金
Previous: プリンタの利用に制約を与える
Next: 標準スプーラの代替品