標準 XPS フィルター
重要
Windows でプリンターとの通信手段として推奨されるのは、最新の印刷プラットフォームです。 プリンターデバイス開発におけるWindows 10および11での印刷体験をカスタマイズするために、MicrosoftのIPPインボックスクラスドライバーとPrint Support Apps (PSA)の使用を推奨します。
詳細については、最新の印刷プラットフォームに関する記事および「印刷サポート アプリの設計ガイド」を参照してください 。
Windows には、XPS から PCL6 および PostScript レベル 3 への組み込み変換をサポートする 2 つの (標準) XPS フィルターが用意されています。
Windows で提供されるフィルターは、印刷クラス ドライバーとモデル固有の v4 印刷ドライバーの両方で使用できます。 これらの XPS フィルターは、既存のファームウェア実装との互換性を確保するために、必要に応じて IHV 機能フィルターと IHV 後処理フィルターを組み合わせることができます。
Windows で提供される XPS フィルターは再配布できません。また、v3プリンタドライバーでは使用できません。
マニフェスト ファイル
Windows で提供される XPS フィルターを使用するには、v4 ドライバー マニフェスト ファイルの DriverConfig セクションにある RequiredFiles ディレクティブを使用してフィルターを指定する必要があります。 フィルター名:
MSxpsPCL6.dll。 XPS から PCL6 への変換を提供します。 MSxpsPS.dll。 XPS から PostScript レベル 3 への変換を提供します。 これらのフィルターのいずれかを利用するために INF 更新プログラムは必要ありません。再配布はサポートされていません。 これらの XPS フィルターの使用を中止することをお勧めします。
印刷フィルターパイプラインの設定
これらのフィルターを使用するように印刷フィルター パイプラインを構成するには、次の例に示すように構成ファイルを作成する必要があります。
PCL6 への変換を指定するサンプル構成ファイル。
<?xml version="1.0" encoding="utf-8"?>
<Filters>
<Filter dll="MSxpsPCL6.dll" clsid="{3821E518-33AF-4d17-92B3-28EB410D46B6}" name="Microsoft XPS to PCL6">
<Input guid="{4d47a67c-66cc-4430-850e-daf466fe5bc4}" comment="IID_IPrintReadStream" />
<Output guid="{65bb7f1b-371e-4571-8ac7-912f510c1a38}" comment="IID_IPrintWriteStream" />
</Filter>
</Filters>
PostScript への変換を指定するサンプル構成ファイル。
<?xml version="1.0" encoding="utf-8"?>
<Filters>
<Filter dll="MSxpsPS.dll" clsid="{8636D90A-5E03-4d62-9269-E06493C57473}" name="Microsoft XPS to PS">
<Input guid="{4d47a67c-66cc-4430-850e-daf466fe5bc4}" comment="IID_IPrintReadStream" />
<Output guid="{65bb7f1b-371e-4571-8ac7-912f510c1a38}" comment="IID_IPrintWriteStream" />
</Filter>
</Filters>
サポートされている機能
標準の XPS フィルターでは、多くの一般的な機能がサポートされています。 すべての機能定義では、ドライバーの GPD または PPD ファイルが使用されます。 構成には、MSxpsPCL6.dll フィルターでは GPD ファイルを、MSxpsPS.dll フィルターでは PPD ファイルを使用する必要があります。 機能にカスタム PDL コマンドが指定されている場合、特に明記されていない限りそのコマンドが使用されます。
特定のセクション (*Order コマンドで指定された) の下に挿入文字列が存在する場合、GPD ファイルの場合、フィルターはこれらの文字列の内容に関していくつかの仮定を行い、既定のコマンドの送信を回避します。 この動作は、このケースで既定のコマンドを送信すると、コマンドの競合が発生する可能性があるため行われます。 そのため、GPD ファイルの作成者は、次のガイドラインに従う必要があります:
JOB_SETUP.#
PCL6 バイナリ ストリーム ヘッダー (例: ")<SP>HP-PCL XL;1;<CR><LF>") があること。
必要なすべての属性を含む BeginSession 演算子があること。
必要なすべての属性を含む OpenDataSource 演算子があること。
PAGE_SETUP.#
- 必要なすべての属性を含む BeginPage 演算子があること。
PAGE_FINISH.#
- EndPage 演算子があること。
JOB_FINISH.#
CloseDataSource 演算子があること。
EndSession 演算子があること。
EndPJLCommands 演算子があること。
XPS 標準フィルターは、*PrintableArea、*PrintableOrigin、または *ImageableArea コマンドに従い、ページの原点を設定するための適切な PDL データを生成します。 また、予想される原点からの追加のオフセットを避けるために、GPD ファイルでは、用紙サイズの *Cmd 文字列定義に =SetPageOrigin コマンドを指定しないでください。
標準の XPS フィルターでサポートされる PrintTicket 機能の詳細については、サポートされる PrintTicket 機能を参照してください。
後処理フィルターでの PrintTicket の取得
Windows 8 でリリースされた v4 ドライバー モデルでは、MSxps フィルターの 1 つ後に後処理フィルターを追加したときに、前処理フィルターを追加する必要がある場合もあります。 ジョブ レベルの印刷チケットを取得するには、前処理フィルターを追加する必要があります。 ただし、このアプローチでは基本的に、ストリーム ベースの MSxps フィルターの前にオブジェクト モデル ベースのフィルターが追加されたため、逆シリアル化が行われ、印刷データがシリアル化されて PrintTicket が抽出されます。
Windows 8.1 では、ユーザーの既定の PrintTicket が MSxps フィルターのジョブ レベルの PrintTicket にマージされ、マージされた PrintTicket が印刷フィルター パイプラインのプロパティ バッグに追加されます。 マージされた PrintTicket は、User PrintTicket と同じ方法で、印刷フィルター パイプラインのプロパティ バッグに追加されます。 プロパティ名:
#define XPS_FP_JOB_LEVEL_PRINTTICKET "JobPrintTicket"
InitializeFilter 中に、MTI フィルターは IPrintReadStreamFactory の実装をプロパティ バッグに追加します。 このインターフェイスのメソッドの 1 つである GetStream は、PrintTicket ストリームが使用可能になるまでブロックされます。 これにより、プロパティへのアクセスを同期させることができます。
重要: GetStream が InitializeFilter から呼び出されると、デッドロックが発生します。
その他の機能
標準の XPS フィルターでサポートされていない PrintTicket 機能の場合、フィルターはすべての PrintTicket メンバーをチェックして GPD/PPD で参照されているかどうかを確認し、出力するコマンドを指定します。 その場合、指定したコマンドが生成されます。
GPD 機能のマップ順序:
PrintSchemaKeywordMap の値が指定され、PrintTicket の機能名と一致します。
PrintSchemaPrivateNamespaceURI 属性が指定され、GPD 機能名が PrintTicket 機能名と一致します。 機能名の一致は直感的ではなく、いくつかのルールに従います:
最初のオプションの *Order セクションが PAGE_SETUP または PAGE_FINISH で、GPD 機能が「Page」で始まらない場合、一致が試行される前に GPD 機能名の先頭に「Page」が付加されます。
最初のオプションの *Order セクションが DOC_SETUP または DOC_FINISH で、GPD 機能が「Document」で始まらない場合、一致が試行される前に GPD 機能名の先頭に「Document」が付加されます。
最初のオプションの *Order セクションが JOB_SETUP または JOB_FINISH で、GPD 機能が「Job」で始まらない場合、一致が試行される前に GPD 機能名の先頭に「Job」が付加されます。
[A-Z]、[a-z]、[0-9]、または '_' 以外の文字は、一致が試行される前に '_' 文字に置き換えられます。 ただし、*NoPunctuationCharCtuation? 属性が TRUE に設定されている場合、フィルターは '.' または '-' を '_' 文字に置き換えません。
PPD 機能のマップ順序:
PrintSchemaKeywordMap の値が指定され、PrintTicket の機能名と一致します。
PrintSchemaPrivateNamespaceURI 属性が指定され、GPD 機能名が PrintTicket 機能名と一致します。 機能名の一致は直感的ではなく、いくつかのルールに従います:
OrderDependency セクションが ExitServer、Prolog、または JCLSetup で、PPD 機能名が「Job」で始まらない場合、一致が試行される前に PPD 機能名の先頭に「Job」が付加されます。
OrderDependency セクションが DocumentSetup で、PPD 機能名が「Document」で始まらない場合、一致が試行される前に PPD 機能名の先頭に「Document」が付加されます。
OrderDependency セクションが AnySetup の場合、フィルターは次の 2 つの一致チェックを実行します:
PPD 機能名が「Document」で始まらない場合、一致が試行される前に PPD 機能名の先頭に「Document」が付加されます。
一致するものが見つからない場合、または PPD 機能名が「Job」で始まらない場合、一致が試行される前に PPD 機能名の先頭に「Job」が付加されます。
OrderDependency セクションが PageSetup で、PPD 機能名が「Page」で始まらない場合、一致が試行される前に PPD 機能名の先頭に「Page」が付加されます。
[A-Z]、[a-z]、[0-9]、または '_' 以外の文字は、一致が試行される前に '_' 文字に置き換えられます。 ただし、*MSNoPunctuationCharCtuation? の場合 文字列が TRUE に設定されている場合、フィルターは '.' または '-' を '_' 文字に置き換えません。
GPD オプションと PPD オプションのマップ順序:
PrintSchemaKeywordMap の値が指定され、PrintTicket のオプション名と一致します。
PrintSchemaPrivateNamespaceURI 属性が指定され、GPD/PPD オプション名が PrintTicket オプション名と一致します。 オプション名の一致は直感的ではなく、いくつかのルールに従います:
GPD/PPD オプション名が [0-9] または '_' で始まる場合、一致が試行される前に、GPD/PPD オプション名の前に '_' 文字が付加されます。 だたし、次の規則も適用されます。
これが GPD オプションで、*NoPunctuationCharCtuation? 属性が TRUE に設定されている場合、フィルターは '_' の先頭に '_' 文字を付加しません。
これが PPD オプションで、*MSNoPunctuationCharSubstitute? 文字列が TRUE に設定されている場合、フィルターは '_' の先頭に '_' 文字を付加しません。
[A-Z]、[a-z]、[0-9]、または '_' 以外の文字は、一致が試行される前に '_' 文字に置き換えられます。 だたし、次の規則も適用されます。
これが GPD オプションで、*NoPunctuationCharCtuation? 属性が TRUE に設定されている場合、フィルターは '.' または '-' を '_' 文字に置き換えません。
これが PPD オプションで、*MSNoPunctuationCharSubstitute? 文字列が TRUE に設定されている場合、フィルターは '.' または '-' を '_' 文字に置き換えません。
フォームからトレイへのマッピング
XPS から PCL6、XPS から PS へのフィルターでは、フォームからトレイへのマッピング テーブルがサポートされます。 複数のトレイが選択した用紙サイズ (レターなど) をサポートしている場合、フィルターは次のように帯掛けを解除します:
既定のトレイ (GPD または PPD ファイルで指定) が指定の用紙サイズを使用するように構成されている場合、既定のトレイが使用されます。
構成されていない場合、フィルターは、指定された用紙サイズで構成されている最初のトレイ (GPD/PPD ファイルで指定された上から下) を選択します。
余分な裏面ページの非表示
既定では、XPS → PCL6、XPS → PS のフィルターは、空のページを挿入することで、複合用紙サイズ、用紙の種類、入出力のビンを含む文書の両面印刷を処理します。 フィルターによってこの空のページが挿入されると、デバイスは新しい用紙の表面に次のページを強制的に印刷します。 裏面ページを出力する必要がないデバイスの場合、ドライバーの GPD または PPD ファイルに次のキーワードを追加することで、この動作を抑制できます。
ファイルのタイプ | 裏面ページの抑制キーワード |
---|---|
GPD | *SuppressExtraBacksidePages?: TRUE |
PPD | *MSSuppressExtraBacksidePages: True |
SetPageDevice コマンドの最適化
MSxpsPS.dll でドライバーを使用する PostScript デバイスの既定の動作は、すべてのページに対して SetPageDevice コマンドが発行され、このコマンドはページに指定されたオプションの完全なセットを示します。 一部のデバイスは、この手法では適切に動作しない可能性があることに注意してください。
ただし、デバイスで MSxpsPS.dll が使用され、付随する PPD ファイルで *MSOptimizeSetPageDevice: True が指定されている場合、PostScript デバイスの動作は次のようになります: - 前のページ以降に SetPageDevice コマンドのいずれかの部分に変更があったすべてのページで、ページに指定されたオプションのセットを示す新しい SetPageDevice コマンドが発行されます。 ただし、前のページ以降に SetPageDevice コマンドの一部に変更がない場合、ページに対して SetPageDevice コマンドは発行されません。