多くの場合,ドキュメント・データは印刷前に変更する必要があります。たとえば,シンプル・テキスト・ドキュメントは,PostScript に翻訳してから PostScript プリンタで印刷する必要があります。あるいは,EBCDIC 文字セットを使用するドキュメントは,ASCII 文字セットに変換してから一般的なデスクトップ・プリンタで印刷する必要があるでしょう。
ドキュメント・データの変更に対する必要性は,顧客や国によって異なるので,ドキュメントをプリンタに送信する前にドキュメント・データの変更を行うユーザ作成プログラム,またはプラットフォームで提供されるプログラムのためのメカニズムが,スーパバイザに含められています。これらのプログラムは,ジョブの一部として印刷されるそれぞれのドキュメントに対するフィルタ,またはデータ・タイプ翻訳プログラムと呼ばれます。
フィルタは子プロセスとして,スーパバイザによって実行されます。ドキュメント・データはフィルタにパイプされ,スーパバイザはデータをプリンタに送信する前にデータを読み戻します。スーパバイザは通信とプリンタのコントロールを制御します。
この章の情報は,スーパバイザ
pdspvr
によってサポートされる物理プリンタだけに適用されます。アウトバウンド・ゲートウェイのスーパバイザはデータ・フィルタリングを実行しません。アウトバウンド・ゲートウェイ・スーパバイザはリモート・ホストまたはプリンタに,フィルタリング・タスクの実行を依頼します。
8.1 フィルタのタイプ
プリント・システムは,翻訳フィルタと変更フィルタをサポートします。翻訳フィルタは次の処理を実行します。
ドキュメントのドキュメント・フォーマット (PDL) をプリンタによって直接サポートされているドキュメント・フォーマット (プリンタの
native-document-formats-ready
属性に含まれるドキュメント・フォーマット) に翻訳します。
スーパバイザが呼び出すと,必要なドキュメント・フォーマット翻訳を実行します。
変更フィルタは次の機能を実行します。
文字セット翻訳またはシンプルなテキスト・フォーマッティングなど,ドキュメント・フォーマットを変更しないドキュメント・データ変更を実行します。
特定のドキュメントに対して,ユーザによって呼び出されたときにだけ,データ変更を実行します。
これら 2 つのタイプについてフィルタ・プログラムの書き方に違いはなく,また,スーパバイザはそれらが適切に使用されているかどうかを検証しません。変更フィルタリングと翻訳フィルタリングは,両方ともドキュメントに適用できます。これが起こると,変更フィルタが元のドキュメント・データを受け取り,変更フィルタの出力が翻訳フィルタにパイプされ,翻訳フィルタからの出力がスーパバイザによってプリンタに送信されます。
スーパバイザはフィルタの動作を完全には制御できません。たとえば,フィルタはファイルへの書き込みやデバイスへの直接の書き込みを行うべきではありませんが,スーパバイザがこれを防止することはできません。
8.1.1 フィルタに関連する属性
次の属性はフィルタについての情報を提供します。
filter-definition
excluded-filter
modification-filter
translation-filter
no-filtering
サーバ属性
filter-definition
は,フィルタのプログラムを定義し,そのプログラムの呼び出しに必要な情報を含みます。filter-definition
は,次の構文を持つ複雑な属性です。
filter-definition={name type input-format output-format command}
さらに,filter-definition
属性は複数の値を持ちます。名前を指定したフィルタをいくつでも定義することができます。
次の表で,属性値のそれぞれのコンポーネント・フィールドを説明します。
フィールド | 値 | 説明 |
name | テキスト | フィルタの名前はサーバ内で一意である必要がある。プリント・システムは,新しいフィルタ定義の検索キーとして名前を使用する。 |
type | translation または modification | フィルタのタイプ。フィルタの呼び出しに使用するメカニズムを定義する。省略時の値は translation である。 |
input-format | ドキュメント・フォーマット | フィルタが入力としてサポートするドキュメント・フォーマット。省略した場合,フィルタは入力に任意のフォーマットを取ることができる。翻訳フィルタ呼び出しだけに使用される。 |
output-format | ドキュメント・フォーマット | フィルタが出力時に生成するドキュメント・フォーマット。 |
command | テキスト | サーバがフィルタを呼び出すために実行するコマンド。 |
フィルタを使用するためには,それをスーパバイザで定義する必要があります。
管理者は
pdset
コマンドで
filter-definition
属性を設定することでフィルタを定義します。たとえば,次の例では,スーパバイザに認識されているフィルタのリストに,PostScript から simple-text への翻訳フィルタを追加します。
# pdset -c server -x "filter-definition+={name=my-text-to-ps \ type=translation \ input-format=simple-text \ output-format=PostScript \ command='/usr/bin/ttp'}" \ blue_sup
一度
filter-definition
属性に値が入ると,+= 構文を使用してさらにフィルタを追加できます。1 つのフィルタだけを削除して他のものを残すには,-= 構文を使用して 5 つすべてのフィールドを正確に指定します。すべてのフィルタ定義を削除するには,次のように == 構文を使用します。
# pdset -c server -x "filter-definition== blue_sup
セキュリティに関する重要な注意
コマンド実行可能ファイルとしては,
root
アカウントだけが置換や変更を行えるものを常に指定してください。非特権ユーザのディレクトリに存在するフィルタ・プログラムを指定すると,深刻なセキュリティ・リスクが生ずることになります。
プリンタ属性
excluded-filters
を使用すると,特定のプリンタに対して一定の翻訳フィルタの使用を不許可にします。excluded-filters の値はフィルタ名のリストです。スーパバイザは,プリンタに渡されるドキュメントに対して翻訳フィルタを選択するとき,この属性にリストされているすべてのフィルタを除外します。スーパバイザは excluded-filters リストにある名前が実際に定義済みのフィルタであるかどうかは確認しません。スーパバイザは,フィルタが filter-definition リストから削除されても,excluded-filters 属性を更新しません。
modification-filter
ユーザはドキュメント属性
modification-filter
を指定して,ジョブ内のドキュメントに変更フィルタを適用します。この属性の値は,他の翻訳フィルタリングよりも前にドキュメント・データに適用されるフィルタの名前です。プリント・システムは,指定されたフィルタが,ドキュメントが実行されたときにスーパバイザに認識されているものかどうかは検証しません。
translation-filter
ユーザは,ドキュメント属性
translation-filter
を指定して,指定された翻訳を実行できる複数のフィルタが利用可能なときに,1 つの翻訳フィルタの自動起動を無効にすることができます。この属性が指定された場合,この属性の値は,document-format
属性や
native-document-formats-ready
属性の値にかかわらず,ドキュメント・データに適用されるフィルタの名前になります。
no-filtering
ユーザは,ブール・ドキュメント属性
no-filtering
を指定して,翻訳フィルタリングと変換フィルタリングの両方を使用不能にできます。no-filtering が true の場合,サーバは翻訳フィルタを起動せず,modification-filter の値を無視します。
8.1.2 コマンド・テキスト処理
フィルタ定義のコマンド要素には,スーパバイザがフィルタを呼び出すために実行するコマンドが含まれています。このコマンド要素は,属性値を指定する変数を含んでいることがあります。スーパバイザはこの変数を対応する属性値に置き換えます。置換フィールドの構文は次のとおりです。 ${ attribute-name[,default-value[, substitution-expression]]}
角かっこ内の項目はオプションです。default-value フィールドと substitution-expression フィールドは空文字列にできます。属性名は表 8-1 にリストされている任意のドキュメント属性にできます。スーパバイザは次のいずれか 1 つで,置換フィールドを置き換えます。
指定された属性に定義済みの値がある場合,および置換フィールドが存在しない (コンマが 1 つ以下) 場合は,指定された属性の値。
属性が定義されておらず,default-value フィールドが存在する (属性の後に少なくとも 1 つのコンマがある) 場合は,default-value フィールドの文字。
評価された substitution-expression が存在し,属性が定義されている場合は,その評価された substitution-expression。
属性名と値は短縮することができません。属性に値がなく,default-value が指定された場合,スーパバイザは default-value で置換フィールドを置き換えます。属性に値がなく,default-value が指定されていない場合,スーパバイザは ${...} を空文字列で置き換えます。
例 :
"-N${number-up,0}"
は "-N2" と評価されます。
"-N${number-up,0}"
は "-N0" と評価されます。
"${number-pages,,-P}"
は "-P" と評価されますが,number-pages が定義されていない場合は空文字列 ("") と評価されます。
ネストした評価
場合によっては,置換文字列に 1 つ以上の属性の値を含めることが必要になります。これは,置換フィールド内に属性置換引数を含めることによって行われます。
例 :
"${number-up,,-N${number-up}}"
は,number-up が指されていない場合には空文字列に,また,number-up が値 "2" の場合には -N2 と評価されます。
"${top-margin,,-M${${top-margin},${left-margin},${right-margin},${bottom-margin}}"
は "-M4,0,0,4" と評価されます。
次の表は,コマンド置換フィールドで使用できる属性を示しています。プリント・システムは simple-text ドキュメントで主に使用される属性のいくつかをサポートします。これらの属性には,bottom-margin,footer-text,header-text,left-margin,length,number-pages,repeated-tab-stops,right-margin,top-margin,width,content-orientation があります。これらの属性の多くは,既存のフィルタに入力を提供するだけのためにサポートされています。
表 8-1: コマンド置換で使用されるドキュメント属性
属性名 | 構文 | 構文と説明 |
bottom-margin | 整数 | ページの下端とテキスト領域の下端との間隔 (文字数単位)。 |
footer-text | テキスト | 各ページのフッタ行。 |
header-text | テキスト | 各ページのヘッダ行。 |
left-margin | 整数 | 論理ページの左端とテキスト領域の左端との間隔 (文字数単位)。 |
document-length | 整数 | テキスト領域の長さ (文字数単位)。 |
number-pages | ブール | ページに番号を付けるかどうかを示す。 |
repeated-tab-stops | 整数 | タブ・ストップ間の文字数。 |
right-margin | 整数 | ページの右端とテキスト領域の右端との間隔 (文字数単位)。 |
top-margin | 整数 | ページの上端とテキスト領域の上端との間隔 (文字数単位)。 |
width | 整数 | 行の最大幅 (文字数単位)。 |
content-orientation | Oid | 縦長または横長。 |
default-character-set | 名前または Oid | |
default-font | テキスト | |
default-medium | Oid 名またはテキスト | |
default-font | テキスト | |
document-format | Oid | document-format 要素だけが置き換えられる。 |
document-name | テキスト | |
number-up | 整数 | OID はその整数値に変換される。 |
plex | Oid 名 | Simplex,duplex,tumble のいずれか。 |
説明を簡単にするために,表 8-1 では,プリンタ (両面,片面など),複雑な構文の属性 (page-select など),複数の値を持つ属性 (explicit-tab-stops など) を制御するための属性は除外しています。
たとえば,翻訳フィルタのためのコマンドが
/usr/pd/my-filter -d${document-format}
で,変更フィルタのためのコマンドが
/usr/pd/your-filter -o${content-orientation} -n${number-up}
であるとき,ユーザが変更と翻訳を要求すると,子プロセスは次のようなコマンドで実行されます。
/usr/pd/my-filter -simple-text|/usr/pd/your-filter -oportrait -n2
8.1.3 フィルタの呼び出し
スーパバイザがフィルタの呼び出しに使用する規則は次のとおりです。
no-filtering
が true の場合,フィルタは呼び出されません。
modification-filter
に値がある場合,そのフィルタが選択され,そのコマンド行が処理されます。
translation-filter
に値がある場合,そのフィルタが選択され,そのコマンド行が処理されます。
ドキュメント・フォーマットがプリンタの native-document-formats-ready 属性に含まれていない場合,定義されたフィルタのリストは,input-format がドキュメントの document-format であり,output-format が native-document-formats-ready に対する任意の document-format である翻訳フィルタを,スーパバイザが見つけるまで検索されます。このフィルタのコマンド行が処理されます。
スーパバイザは選択したフィルタを呼び出すコマンドを構築し,このコマンドで子プロセスをフォークして,フィルタ・プロセスとの間でドキュメント・データを転送するためのパイプを構築します。
一般に,フィルタの設定,呼び出し,実行中に発生するエラーは (ドキュメントだけではなく) ジョブを打ち切らせることになります。ジョブの打ち切りになる条件には次のようなものがあります。
存在しないフィルタの呼び出し。
適切な翻訳フィルタを見つけられない。
子プロセス内のエラー。
スーパバイザは,job-state-message
属性に格納されたメッセージを通して,または,対象の物理プリンタに印刷されたエラー・ページを通して,イベント通知 (job-aborted-by-server
) により,これらの状態をユーザに通知します。エラーが発生すると,ジョブはスプーラ上で保持 (retained) 状態になります。
8.1.5 フィルタ・プログラムの作成
フィルタ・プログラムは次の規則に従う必要があります。
プログラムは stdin から読み込みを行う。
プログラムはドキュメント・データだけを stdout に書き出す。エラー・メッセージやその他のメッセージは書き出さない。
プログラムはプリンタ制御文字列を送ってはならない。
コマンド実行可能ファイルは,非特権ユーザによって置き換えることはできない。
8.2 テキストから PostScript への翻訳フィルタ
プリント・システム・ソフトウェアには翻訳フィルタが含まれています。このプログラムは simple-text ドキュメントを PostScript に翻訳し,オプションとして N アップ (片面への複数ページ印刷) 処理を実行します。このフィルタはインストレーション・プロシージャ実行時に
/usr/pd/bin/trn_textps
として格納され,日本語キットをインストールした場合には
/usr/i18n/bin/trn_textps_j
にも格納されます。trn_textps_j
は,標準版テキスト・トランスレータ
trn_textps
に,日本語 EUC のファイルのサポートを追加したもので,その他の機能は同じです。trn_textps_j
を使用する際には,オプションに
-CeucJP
を指定してください。
PostScript 言語だけを取り扱うプリンタに送られるシンプルなテキスト・フォーマットのドキュメントは,PostScript に翻訳する必要があります。この翻訳は,ドキュメントの
document-format
属性値が
simple-text
であり,物理プリンタ属性
native-document-formats-ready
値が PostScript であるときに起こります。それ以外のフォーマット,特に PCL が,native-document-formats-ready
属性に指定されている場合,スーパバイザはそのデータを直接プリンタに送ります。
プリント・システム・ソフトウェアはコマンド・スクリプト
/usr/pd/scripts/pxc_get_started
を含んでおり,このコマンド・スクリプトは,スーパバイザを作成すると,自動的にテキストから PostScript への翻訳フィルタを構成します。
表 8-1
には,Text-to-PostScript 翻訳プログラムでサポートされるすべてのコマンド・オプションを示しています。管理者は
filter-definition
属性をコマンド・オプション置換に設定して,プリント・システム属性を翻訳プログラム・オプションに関連させることができます。
次の例は,コマンド・オプションの使用方法を示しています。
# pdset -c server \ -x filter-definition=\ '{name=text-to-ps \ type=translation \ input-format=simple-text \ output-format=PostScript \ command="/usr/pd/bin/trn_textps -N${number-up,0} \ ${content-orientation,,-O${content-orientation}} \ ${top-margin,,-a${top-margin}} \ ${bottom-margin,,-b${bottom-margin}} \ ${left-margin,,-c${left-margin}} \ ${right-margin,,-d${right-margin}} -l${length} -w${width} ${number-pages,,-P} \ ${repeated-tab-stops,,-t${repeated-tab-stops}}" }' \ red_sup
表 8-2 で説明する置換の規則は,次の例に適用されます。このコマンドは number-up=2 と width=80 を必要とするドキュメントに対して使用されます。
# /usr/pd/bin/trn_textps -N2 -w80
プリント要求で指定されていない属性が省略時の値で表されたり,置き換えられたりしないのに対して,プリント要求で指定された属性は,置換等価に変換されます。
さらに,ドキュメント属性 number-up が 1,2,4 のいずれかである場合,フィルタは用紙あたりそれぞれ 1 (マージンつき),2,4 ページを印刷します。number-up が 0 または none は有効であり,これは number-up 処理を抑制します。
ドキュメント属性 content-orientation は,number-up 処理で,用紙上での論理ページの配置方法に影響します。
表 8-2: テキストから PostScript への翻訳プログラムのコマンド・オプション
オプション | 対応する属性 | 説明 |
-a | top-margin | ページの上端に省略時のマージンを追加するための行数。有効な値は 0 以上の整数。 |
-b | bottom-margin | ページの下端に省略時のマージンを追加するための行数。有効な値は 0 以上の整数。 |
-B | (属性なし) | 代替のグレーのバーを 3 行幅で印刷する。 |
-c | left-margin | ページの左側に省略時のマージンを追加する文字数。有効な値は 0 以上の整数。 |
-CeucJP | (属性なし) | 日本語 EUC のテキスト・ファイルを日本語 PostScript プリンタに出力する。このオプションは,日本語キットをインストールした場合にのみ指定可能。 |
-d | right-margin | ページの右側に省略時のマージンを追加する文字数。有効な値は 0 以上の整数。 |
-l | length | ページごとの行数。新しいページが始まる前にページ上に印刷される列の数。有効な値は 0 よりも大きな整数。 |
-L | (属性なし) | 行番号を印刷する。 |
-N | number-up | 物理紙面上に印刷するページ・スポット数を指定する値。有効な値は,0,1,2,4。 |
-O | content-orientation | ページを長辺または短辺に沿ってフォーマットするよう指定する方向値。有効な値は,landscape (横長),portrait (縦長)。 |
-P | number-pages | ページ番号をページの上部に印刷するかどうかを指定する値。このオプションには引数はない。省略時の設定ではページ番号を印刷しない。 |
-Q | (属性なし) | ラップなし。ページ (明示的な -w 設定,または用紙サイズから導き出す) に対して許可された長さより長い行を切り捨てるかどうかを指定する。このオプションには引数はない。これがあると切り捨てが指定される。省略時の値は,行ラップあり。 |
-S | default-medium | 翻訳されたページがフォーマットされる用紙サイズ。列とカラムの省略時の値は導き出されるが,-w オプションと -l オプションによって無効になることもある。 有効な値は次のとおり。 a,b,com10, legal,7x9,a0,b4,d,letter,9x12_envelope,a1,b5,d1_envelope, monarch,a2,b6,e, postcard,a3,business_envelope,executive,10x13_envelope,a4,c, folio,10x14,a5,c4_envelope,halfletter,11x14,a6,c5_envelope,ledger,7_envelope |
-t | repeated-tab-stops | タブをバイト位置 number+1,2*number+1,3*number+1 などに拡張するタブ幅の値。number の省略時の値は 8。入力中のタブ文字は,次のタブ設定に対応する適切な数のスペースで拡張される。有効な値は 0 よりも大きな整数。 |
-T | header-text | ページ・ヘッダ・テキストを印刷する。 |
-w | width | 1 行あたりの文字数。行ラップまたは行の切り捨てが行われるまでに,1 行に印刷するカラムの数。有効な値は 0 よりも大きな整数。 |
-p | page-select | 1 ページ以上の選択範囲をコンマで区切って指定する。範囲は整数のページ番号か,コロンで区切った 2 つの整数で指定できる。3〜6 ページと 9 ページを印刷するには次のコマンドを使用する。3:6,9 |