8    ドキュメント・データのフィルタリング

多くの場合,ドキュメント・データは印刷前に変更する必要があります。たとえば,シンプル・テキスト・ドキュメントは,PostScript に翻訳してから PostScript プリンタで印刷する必要があります。あるいは,EBCDIC 文字セットを使用するドキュメントは,ASCII 文字セットに変換してから一般的なデスクトップ・プリンタで印刷する必要があるでしょう。

ドキュメント・データの変更に対する必要性は,顧客や国によって異なるので,ドキュメントをプリンタに送信する前にドキュメント・データの変更を行うユーザ作成プログラム,またはプラットフォームで提供されるプログラムのためのメカニズムが,スーパバイザに含められています。これらのプログラムは,ジョブの一部として印刷されるそれぞれのドキュメントに対するフィルタ,またはデータ・タイプ翻訳プログラムと呼ばれます。

フィルタは子プロセスとして,スーパバイザによって実行されます。ドキュメント・データはフィルタにパイプされ,スーパバイザはデータをプリンタに送信する前にデータを読み戻します。スーパバイザは通信とプリンタのコントロールを制御します。

この章の情報は,スーパバイザ pdspvr によってサポートされる物理プリンタだけに適用されます。アウトバウンド・ゲートウェイのスーパバイザはデータ・フィルタリングを実行しません。アウトバウンド・ゲートウェイ・スーパバイザはリモート・ホストまたはプリンタに,フィルタリング・タスクの実行を依頼します。

8.1    フィルタのタイプ

プリント・システムは,翻訳フィルタと変更フィルタをサポートします。翻訳フィルタは次の処理を実行します。

変更フィルタは次の機能を実行します。

これら 2 つのタイプについてフィルタ・プログラムの書き方に違いはなく,また,スーパバイザはそれらが適切に使用されているかどうかを検証しません。変更フィルタリングと翻訳フィルタリングは,両方ともドキュメントに適用できます。これが起こると,変更フィルタが元のドキュメント・データを受け取り,変更フィルタの出力が翻訳フィルタにパイプされ,翻訳フィルタからの出力がスーパバイザによってプリンタに送信されます。

スーパバイザはフィルタの動作を完全には制御できません。たとえば,フィルタはファイルへの書き込みやデバイスへの直接の書き込みを行うべきではありませんが,スーパバイザがこれを防止することはできません。

8.1.1    フィルタに関連する属性

次の属性はフィルタについての情報を提供します。

filter-definition

サーバ属性 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 の値はフィルタ名のリストです。スーパバイザは,プリンタに渡されるドキュメントに対して翻訳フィルタを選択するとき,この属性にリストされているすべてのフィルタを除外します。スーパバイザは 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 つで,置換フィールドを置き換えます。

属性名と値は短縮することができません。属性に値がなく,default-value が指定された場合,スーパバイザは default-value で置換フィールドを置き換えます。属性に値がなく,default-value が指定されていない場合,スーパバイザは ${...} を空文字列で置き換えます。

例 :

number-up が値 "2" の場合,"-N${number-up,0}" は "-N2" と評価されます。
number-up が定義されていない場合,"-N${number-up,0}" は "-N0" と評価されます。
number-pages が定義されている場合,"${number-pages,,-P}" は "-P" と評価されますが,number-pages が定義されていない場合は空文字列 ("") と評価されます。

ネストした評価

場合によっては,置換文字列に 1 つ以上の属性の値を含めることが必要になります。これは,置換フィールド内に属性置換引数を含めることによって行われます。

例 :

"${number-up,,-N${number-up}}" は,number-up が指されていない場合には空文字列に,また,number-up が値 "2" の場合には -N2 と評価されます。
top-margin=4,left-margin=0,right-margin=0,bottom-margin=4 のときに,"${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    フィルタの呼び出し

スーパバイザがフィルタの呼び出しに使用する規則は次のとおりです。

8.1.4    エラー処理

一般に,フィルタの設定,呼び出し,実行中に発生するエラーは (ドキュメントだけではなく) ジョブを打ち切らせることになります。ジョブの打ち切りになる条件には次のようなものがあります。

スーパバイザは,job-state-message 属性に格納されたメッセージを通して,または,対象の物理プリンタに印刷されたエラー・ページを通して,イベント通知 (job-aborted-by-server) により,これらの状態をユーザに通知します。エラーが発生すると,ジョブはスプーラ上で保持 (retained) 状態になります。

8.1.5    フィルタ・プログラムの作成

フィルタ・プログラムは次の規則に従う必要があります。

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