フィルタは、LP 印刷サービスがプリンタで解釈できないタイプのファイルを印刷する必要があるたびに使用されます。新しい印刷フィルタを作成するのは簡単ではありません。通常は幅広い経験が必要です。
新しい印刷フィルタを定義するには、次の 2 つの手順があります。
印刷フィルタプログラムを作成する
印刷フィルタ定義を作成する
印刷フィルタは、必要に応じて簡単なものでも複雑なものでもかまいません。フィルタには、入力形式、出力形式、そのフィルタ内でコマンド行引数を処理する言語を提供する複雑なオプションが入っています。
PostScript 以外のプリンタを使用する場合は、必要に応じて印刷フィルタを作成して追加する必要があります。まず、印刷フィルタの機能と、フィルタプログラムが満たさなければならない要件を理解しておく必要があります。
LP 印刷サービスには、/usr/lib/lp/postscript ディレクトリにフィルタプログラムが組み込まれています。これらのフィルタは、送信先プリンタが PostScript 形式のデータを必要とするほとんどの PostScript 印刷の状況に対応します。印刷フィルタプログラムは、2 進の実行可能プログラムファイルでなければなりません。
印刷フィルタには、高速フィルタと低速フィルタの 2 種類があります。
「高速フィルタ」は、ファイルの印刷準備にあまり処理時間がかかりません。また、実行するときにはプリンタにアクセスしなければなりません。プリンタ障害を検出する印刷フィルタは、高速フィルタでなければなりません。PRINTER キーワードをフィルタオプションとして使用するフィルタは、高速フィルタとしてインストールしなければなりません。
「低速フィルタ」は、ファイルの印刷準備に大量の処理時間がかかります。また、低速フィルタは実行するときにプリンタにアクセスする必要がありません。低速フィルタはバックグラウンドで実行されるので、プリンタと連結する必要がなく、低速フィルタを必要としないほかのファイルを印刷できます。
LP 印刷サービスは、印刷フィルタを使用して、ある内容形式から別の内容形式にファイルを変換します。プリンタごとに、受け付けられるファイル内容形式を指定できます。ユーザーは印刷要求を出すときにファイル内容形式を指定します。LP 印刷サービスはその内容形式のファイルを印刷できるプリンタを探します。多くのアプリケーションは各種プリンタに合わせてファイルを生成できるので、通常はこれで十分です。ただし、アプリケーションによっては、利用できるプリンタ上で印刷できないファイルを生成するものがあります。
LP 印刷サービスは、プリンタで直接受け付けられない形式のファイルの印刷要求を受信するたびに、内容形式が印刷要求と一致する、使用可能な (または指定されている) プリンタを探します。一致するプリンタがあれば、ファイルはフィルタを使用せずにそのプリンタに直接送信できます。一致するプリンタがない場合や、内容形式でフィルタを使用するように指定されている場合は、LP 印刷サービスはファイルの内容形式と入力内容形式が一致する、使用可能なフィルタを探します。LP 印刷サービスはさらに、プリンタの内容形式と出力内容形式が一致するフィルタを探します。適切なフィルタが見つかると、印刷要求はフィルタを通して渡されます。
印刷フィルタは、特殊印刷モードを処理し特殊ページの印刷を要求します。特殊印刷モードは、カスタマイズされたフィルタが必要な印刷要求の特性を印刷するために必要です。
フィルタは、次の特性を処理します。
プリンタタイプ
文字ピッチ
行ピッチ
ページ長
ページ幅
印刷ページ数
文字セット
フォーム名
部数
LP 印刷サービスは、これらの特性にデフォルト設定を提供します。ただし、印刷フィルタの方が一部の特性を効率よく処理できます。たとえば、プリンタによっては、LP 印刷サービスより効率よく複数のコピーを処理できるものがあります。その場合は、複数コピーのページ制御用フィルタを提供できます。
各プリンタは、独自の方法でプリンタ障害を検出し、障害信号を LP 印刷サービスに送信します。LP 印刷サービスは、印刷中にハングアップ (キャリア喪失) と過剰な遅延の有無をチェックするだけです。
プリンタによっては、優れた障害処理能力を持ち、障害の原因を記述するメッセージを送信できるものがあります。また、キャリア信号の喪失やデータフローのシャットオフを示すものとは異なる信号を使用して障害を示すプリンタもあります。これらの付加的なプリンタ障害情報を解釈するには、フィルタが必要です。
また、フィルタでは印刷要求を保留し、プリンタ障害がクリアされるまで待ってから印刷を再開できます。この機能を使用すると、中断された印刷要求全体を印刷し直す必要がありません。プリンタに使用される制御シーケンスを認識するフィルタだけが、ファイルの改ページ位置を判別できます。したがって、その種のフィルタ以外は、障害がクリアされた後で印刷を再開する必要があるファイル内の位置を検出できません。
印刷フィルタがメッセージを生成すると、そのメッセージは LP 印刷サービスによって処理されます。警告が使用可能になっている場合は、LP 印刷サービスがシステム管理者に警告を送信します。詳細は、「LP 印刷コマンドを使用したプリンタ障害警告の設定」を参照してください。
印刷フィルタは単純なものでも複雑なものでもかまいませんが、次の要件を満たさなければなりません。
フィルタは、標準入力からファイルの内容を取得して、変換後のファイルを標準出力に送信しなければなりません。
外部ファイルを参照するプログラムはフィルタとして使用できません。一般にユーザーは troff、nroff などのワープロプログラムをフィルタとして使用しがちです。LP 印刷サービスは、フィルタプログラムから「組み込みファイル」と呼ばれる他のファイルへの参照を認識しません。troff と nroff プログラムは組み込みファイルを使用できるので、フィルタとして使用すると失敗することがあります。処理を完了するために他のファイルを必要とするようなプログラムは、フィルタとして使用しないでください。
フィルタは、一般にユーザーがアクセスできないファイルに依存しないでください。ユーザーが直接実行するときにフィルタが失敗すると、LP 印刷サービスで実行しても失敗します。
低速フィルタは、ファイル内のエラーに関するメッセージを標準エラーに送信できます。高速フィルタはできません。低速フィルタからのエラーメッセージは収集され、印刷要求を出したユーザーに送信されます。
低速フィルタが信号を受信したために終了すると、印刷要求が停止され、その要求を出したユーザーに通知されます。同様に、低速フィルタが 0 以外の終了コードを返して終了すると、印刷要求が停止され、ユーザーに通知されます。高速フィルタからの終了コードは、異なる方法で処理されます。
フィルタにプリンタ障害を検出させたい場合は、次の要件も満たしてください。
フィルタは終了する前にできるだけ障害がクリアされるまで待つ必要があります。フィルタはまた、障害がクリアされたら、印刷を停止したページの先頭から印刷を再開する必要があります。継続機能を使用したくない場合は、LP 印刷サービスは管理者に警告する前にフィルタを停止します。
フィルタは、障害が認識されたらすぐにプリンタ障害メッセージを標準エラーに送信する必要があります。フィルタを終了する必要はなく、障害がクリアされるまで待つことができます。
フィルタは、ファイル内のエラーに関するメッセージを標準エラーに送信してはいけません。これらのメッセージは、ユーザーが読み込める標準出力に含める必要があります。
フィルタは、ファイルの印刷が終了すると (ファイル内のエラーによって正常に印刷できなかった場合も) 終了コード 0 を返して終了する必要があります。
フィルタは、プリンタ障害によって印刷要求を終了できなかった場合にのみ、0 以外の終了コードを返して終了する必要があります。
フィルタをフィルタテーブルに追加する場合は、高速フィルタとして追加しなければなりません。
印刷フィルタ定義は、フィルタ、実行する印刷フィルタプログラム、実行する変換の種類などを LP 印刷サービスに指示します。/etc/lp/fd ディレクトリには、一連のフィルタ記述子ファイルが組み込まれています。これらのファイルは、フィルタの特性 (高速または低速フィルタなど) を記述し、フィルタプログラム (/usr/lib/lp/postscript/postdaisy など) を指定します。
新しい印刷フィルタを定義するときには、印刷フィルタ定義を作成しなければなりません。
印刷フィルタ定義には、LP 印刷サービスが使用する次の情報が入っています。
実行するフィルタプログラム名
フィルタプログラムが受け付ける入力タイプ
フィルタプログラムが生成する出力タイプ
フィルタプログラムがジョブを送信できるプリンタタイプ
フィルタプログラムがジョブを送信できる特定のプリンタ名
フィルタタイプ (高速または低速)
オプション
lpfilter コマンドへの直接入力として特性を入力できます。また、フィルタの特性を指定するファイルを作成し、そのファイル名を lpfilter コマンド引数への入力として使用することもできます。この種のファイルは「フィルタ記述子ファイル」と呼ばれ、/etc/lp/fd ディレクトリに配置する必要があります。これらのファイルはフィルタそのものではありません。これらのファイルは、フィルタを指定します。
情報をファイルに格納するかコマンド行に直接入力するかに関係なく、次の形式を使用してください。
Command: command-pathname [options] Input types: input-type-list Output types: output-type-list Printer types: printer-type-list Printers: printer-list Filter type: fast or slow Options: template-list |
Options 以外のフィルタ特性に複数の定義 (つまり複数行) を与えると、2 番目の定義のみが印刷サービスに使用されます。
情報はどんな順序で配置してもかまいません。また、すべての情報が必要とは限りません。値を指定しなければ、次の表の値がデフォルトで割り当てられます。デフォルト値はあまり便利ではないので、明示的な値を指定するようにしてください。
表 10–1 lpfilter コマンドのデフォルト値
項目 |
デフォルト値 |
---|---|
入力タイプ |
任意 |
出力タイプ |
任意 |
プリンタタイプ |
任意 |
プリンタ |
任意 |
フィルタタイプ |
slow |
フィルタプログラムのフルパスを使用してください。プログラムが必ず必要とする固定オプションがある場合は、それらをこのコマンドに含めます。
入力タイプは、印刷フィルタが処理できるファイル内容形式のリストです。LP 印刷サービスも入力タイプ数を制限しますが、ほとんどのフィルタは 1 つの入力タイプしか受け付けません。いくつかのファイルタイプは、フィルタで処理できる程度に類似しています。14 文字以内の英数字とダッシュを使用した名前を指定できます。入力タイプ名の一部として下線 (_) は使用できません。
LP 印刷サービスは、一貫した命名規則に合致するように、これらの名前を使用してフィルタをファイルタイプと一致させます。たとえば、複数のフィルタが同じ入力タイプを受け付ける場合は、各フィルタ用に指定するときに、その入力タイプに同じ名前を使用します。ユーザーには、ファイルの印刷を依頼するときにファイルタイプの識別方法がわかるように、これらの名前を通知してください。
出力タイプは、フィルタが出力として生成できるファイルタイプのリストです。入力タイプごとに、フィルタは 1 つずつ出力タイプを生成します。ただし、出力タイプはジョブごとに異なることがあります。出力タイプ名は、14 文字以内の英数字とダッシュ (-) です。
出力タイプ名は、利用できる (ローカルまたはリモート) プリンタのタイプと一致するか、他のフィルタで処理される入力タイプと一致しなければなりません。LP 印刷サービスは、ファイルを変換するために異なるフィルタを複数回かける必要があることがわかると、フィルタをシェルパイプラインにグループ化します。このように複雑な処理はほとんど必要ありませんが、LP 印刷サービスではこの処理を実行できます。ユーザーが印刷したいあらゆるファイルを入力タイプにするフィルタの集合を探して、各ファイルをプリンタで処理できるファイルタイプに直接変換してください。
プリンタタイプは、印刷フィルタがファイルを変換できるプリンタタイプのリストです。ほとんどのプリンタとフィルタの場合、これは出力タイプのリストと同じなので、フィルタ定義のこの部分はブランクにしておいてかまいません。しかし、別のリストを使用することもできます。たとえば、初期化には 1 つのプリンタタイプだけを使用するプリンタがあるとします。それでも、このプリンタは複数のファイル内容形式を認識できます。実際には、このプリンタには、各種ファイルタイプを、処理できるファイルタイプに変換する内部フィルタが付いています。したがって、1 つのフィルタは、プリンタで処理できるファイルタイプに合った複数の出力タイプのいずれかを生成できます。印刷フィルタには、そのプリンタタイプで機能することを示すマークを付ける必要があります。
もう 1 つの例として、同じファイルタイプを受け付けるものとして表示される 2 つのモデルのプリンタを使用できます。ただし、内部に若干違いがあるので、一方のプリンタが生成する結果と異なります。それらのプリンタには、A と B など、異なるプリンタタイプであることを示すラベルを付けます。この場合、B はズレがある方のプリンタです。タイプ B のプリンタで生成されるズレを考慮してファイルを調整するフィルタを作成します。このフィルタはこの種のプリンタタイプにのみ必要なので、タイプ B プリンタでのみ機能するものとして指定します。
一般に、印刷フィルタはその出力を受け付けるどのプリンタでも機能するので、通常はフィルタ定義のこの部分をスキップできます。
ただし、プリンタによっては、フィルタが生成する出力に適したものと適さないものがあります。たとえば、1 台のプリンタを高速出力専用にして、フィルタを通す必要がないファイルのみをそのプリンタに送信できます。同じタイプの他のプリンタは、印刷前に広範囲にフィルタを通す必要があるファイルに使用できます。
LP 印刷サービスは、「フィルタのタイプ」で説明しているように、高速フィルタと低速フィルタを認識します。
印刷モードで (lp -y コマンドを使用して) 呼び出される低速フィルタは、印刷要求が出されたシステム上で実行しなければなりません。LP 印刷サービスはモード値を印刷サーバーに渡せません。ただし、ファイル内容形式 (lp コマンドの -T オプションの後で指定) を印刷サーバー上の内容形式と一致させることはできます。したがって、印刷サーバー上で特殊モードを有効にしたい場合は、LP 印刷サービスが入力タイプと出力タイプを一致することができる内容形式を指定しなければなりません。
オプションは、各種の情報をフィルタコマンドのコマンド行引数にどのように変換するかを指定します。この情報には、ユーザーからの (印刷要求を伴う) 指定、プリンタ定義、要求の処理に使用されるフィルタによって実装される仕様などを含めることができます。
印刷フィルタオプションの定義には 13 個の情報源があり、それぞれが「キーワード」で表されています。各オプションは「テンプレート」内で定義されます。テンプレートとは、フィルタの特性値の 1 つに基づいてフィルタコマンドに渡されるオプションを定義する、フィルタ定義内のステートメントです。
フィルタ定義で指定するオプションには、13 個のキーワードをまったく使用しなくても、すべて使用しても、その一部を使用してもかまいません。また、完全なフィルタ定義に複数の定義が必要な場合は、1 つのキーワードを複数回指定することもできます。次の表に、印刷フィルタ定義におけるオプションを定義するための 13 個のキーワードを示します。
表 10–2 印刷フィルタオプションのキーワード
キーワード |
パターン |
例 |
|
---|---|---|---|
内容形式 (入力) |
INPUT |
内容形式 |
troff |
内容形式 (出力) |
OUTPUT |
内容形式 |
postscript, impress |
プリンタタイプ |
TERM |
プリンタタイプ |
att495 |
プリンタ名 |
PRINTER |
プリンタ名 |
lp1 |
文字ピッチ |
CPI |
四捨五入された 10 進数 |
10 |
行ピッチ |
LPI |
四捨五入された 10 進数 |
6 |
ページ長 |
LENGTH |
四捨五入された 10 進数 |
66 |
ページ幅 |
WIDTH |
四捨五入された 10 進数 |
80 |
印刷ページ数 |
PAGES |
ページリスト |
1-5,13-20 |
文字セット |
CHARSET |
文字セット |
finnish |
フォーム名 |
FORM |
フォーム名 |
invoice2 |
部数 |
COPIES |
整数 |
3 |
MODES |
モード |
landscape |
印刷フィルタ定義には、複数のテンプレートを含めることができます。複数のテンプレートを指定する場合は、1 行にコンマで区切って入力するか、先頭に Options: を付けて複数行に入力します。 接頭辞を含んでいる必要があります。
テンプレートの形式は次のとおりです。 keywordpattern = replacement
keyword は、フィルタの特定の特性に関して登録されたオプションのタイプを識別します。
pattern は、キーワードの特定のオプションです。
replacement は、キーワードが指定した値のときに発生する動作です。
特定のフィルタのオプションを定義する方法を示す例として、印刷サービススケジューラを使って次の条件でフィルタに印刷要求を割り当てたいものと仮定します。
フィルタで生成される OUTPUT のタイプが impress の場合は、フィルタに -I オプションを渡す。
フィルタで生成される OUTPUT のタイプが postscript の場合は、フィルタに -P オプションを渡す。
上記の条件を指定するには、lpfilter コマンドのオプションとして次のテンプレートを与えます。
Options: OUTPUT impress=-I, OUTPUT postscript=-P |
Options 行が長くなりすぎる場合は、次のように各テンプレートを別々の行に入れます。
Options: OUTPUT impress=-I Options: OUTPUT postscript=-P |
どちらのテンプレートでも、keyword は OUTPUT として定義されています。1 番目のテンプレートでは、パターンは impress で、replacement の値は -I です。2 番目のテンプレートでは、pattern の値は postscript で、replacement の値は -P です。
各種テンプレート (つまり、各キーワードの pattern 引数と replacement 引数) に与える値を見つけるには、次のことに注意する必要があります。
INPUT テンプレートの値は、フィルタによる変換が必要なファイル内容形式からとっています。
OUTPUT テンプレートの値は、フィルタが生成すべき出力タイプからとっています。
TERM テンプレートの値はプリンタタイプです。
PRINTER テンプレートの値は、最終出力を印刷するプリンタ名です。
CPI、LPI、LENGTH、WIDTH の各テンプレートの値は、ユーザーの印刷要求、使用するフォーム、またはプリンタのデフォルト値からとっています。
PAGES テンプレートの値は、印刷すべきページのリストです。通常、これはコンマで区切ったページ範囲のリストです。各ページ範囲は、ダッシュで区切った 1 対の数値、または単一の数字からなります(たとえば、1–5,6,8,10 は 1 ページから 5 ページまでと、6 ページ、8 ページ、10 ページを示します)。ただし、印刷要求に -P オプションで値を与えると、印刷要求は変更されずに渡されます。
CHARSET テンプレートの値は、使用する文字セット名です。
FORM テンプレートの値は、lp -f コマンド (印刷要求を出すのに使用するコマンド) で要求したフォーム名です。
COPIES テンプレートの値は、ファイルの印刷部数です。フィルタがこのテンプレートを使用する場合、LP 印刷サービスはフィルタがかけられたファイルの印刷部数を「1」に減らします。この「1 部」にはフィルタによって生成される複数のコピーが含まれます。
MODES テンプレートの値は、lp -y コマンドからとっています。ユーザーは複数の -y オプションを指定できるので、MODES テンプレートは複数の値をとることがあります。値はユーザーが与えた順に左から右に適用されます。
replacement オプションは、テンプレートの値をフィルタプログラムに与える方法を示します。通常はリテラルオプションですが、値の位置を示すプレースホルダのアスタリスク (*) が付いていることがあります。pattern と replacement には、ユーザー入力オプションからフィルタオプションへの複雑な変換を行うために、ed コマンドの正規表現の構文を使用することもできます。ed の正規表現の構文は、\( ... \) および \n も含め、すべて使用できます。これらの構文を使用すると、pattern オプションの各部を抽出して replacement オプションにコピーできます。また、& オプション使用すると、pattern オプション全体を replacement オプションにコピーできます。詳細は、ed(1) のマニュアルページを参照してください。
pattern オプションまたは replacement オプションにコンマまたは等号 (=) を含める場合は、その前にバックスラッシュ (\) を付けてください。これらの文字の前のバックスラッシュは、pattern オプションまたは replacement オプションが使用されるときに削除されます。
印刷サーバーで、スーパーユーザーになるか、同等の役割になります。
役割には、認証と特権コマンドが含まれます。役割の詳細については、『Solaris のシステム管理 (セキュリティサービス)』の「RBAC の構成 (作業マップ)」を参照してください。
印刷フィルタプログラムを作成します。
印刷フィルタプログラムについては、「印刷フィルタプログラムの作成」を参照してください。通常、PostScript プリンタ用のフィルタプログラムは /usr/lib/lp/postscript ディレクトリに入っています。作成したプログラムは、選択したディレクトリ内の /usr/lib/lp ディレクトリの下に入れる必要があります。
印刷フィルタ定義を作成します。
印刷フィルタ定義については、「印刷フィルタ定義の作成」を参照してください。印刷フィルタ定義はテキストファイルに保存する必要があります。使用しやすいように、通常、フィルタ定義は /etc/lp/fd ディレクトリに入っており、接尾辞 .fd で識別されます。
印刷フィルタを印刷サーバーに追加します。
詳細は、「印刷フィルタを追加する方法」を参照してください。
次の例は、 N37 または Nlp を simple に変換するために使用する印刷フィルタ定義を示しています。
Input types: N37, Nlp, simple Output types: simple Command: /usr/bin/col Options: MODES expand = -x Options: INPUT simple = -p -f |
この例で、印刷フィルタプログラム名は col です。新しい印刷フィルタを印刷サーバーに追加すると、ユーザーの印刷要求は次のように処理されます。
ユーザーが次のコマンドを入力した場合
$ lp -y expand report.doc |
印刷フィルタプログラムは次の引数を使用して実行され、ファイルが変換されます。
/usr/bin/col -x -p -f |
ユーザーが次のコマンドを入力した場合
$ lp -T N37 -y expand report.doc |
印刷フィルタプログラムは次の引数を使用して実行され、ファイルが変換されます。
/usr/bin/col -x |
次の例は、troff から PostScript ファイルに変換するために使用する印刷フィルタ定義を示しています。
Input types: troff Output types: postscript Printer types: PS Filter type: slow Command: /usr/lib/lp/postscript/dpost Options: LENGTH * = -l* Options: MODES port = -pp, MODES land = -pl Options: MODES group \=\([1-9]\) = -n\l |
この例で、印刷フィルタプログラム名は dpost です。このフィルタプログラムは入力タイプ troff をとり、postscript 出力を生成し、タイプ PS (PostScript) のすべてのプリンタで機能します。ユーザーは、用紙方向を縦モードにするか横モードにするかを尋ねるプロンプトが表示されたときに、それぞれの省略形 port または land を指定するだけですみます。これらのオプションは LP 印刷サービスに固有ではないので、ユーザーは lp -y コマンドを使用して指定しなければなりません。
新しい印刷フィルタを印刷サーバーに追加すると、印刷要求は次のように処理されます。
ユーザーが次のコマンドを入力し、横方向、ページ長 60 行で、troff ファイルタイプを PostScript プリンタ (タイプ PS) で印刷するように要求した場合
$ lp -T troff -o length=60 -y land -d luna ch1.doc |
次の引数が指定された印刷フィルタプログラム dpost コマンドが、ファイルを変換します。
/usr/lib/lp/postscript/dpost -l60 -pl |
ユーザーが次のコマンドを入力した場合
$ lp -T troff -y group=4 -d luna ch1.doc |
次の引数が指定された印刷フィルタプログラム dpost コマンドが、ファイルを変換します。
/usr/lib/lp/postscript/dpost -n4 |