ドキュメントの印刷の概要 (WPF .NET)
Microsoft .NET では、Windows Presentation Foundation (WPF) を使用するアプリケーション開発者には、印刷および印刷システム管理 API の豊富なセットがあります。 この機能の中核となるのは、XML Paper Specification (XPS) ファイル形式と XPS 印刷パスです。
XPS について
XPS は、電子ドキュメント形式、スプール ファイル形式、およびページ記述言語です。 これは、XML、Open Packaging Conventions、およびその他の業界標準を使用してクロスプラットフォーム ドキュメントを作成するオープン ドキュメント形式です。 XPS を使用すると、デジタル ドキュメントを作成、共有、印刷、表示、アーカイブするプロセスが簡略化されます。 XPS の詳細については、「XPS ドキュメントの
XPS プリントパス
XPS 印刷パス は、Windows アプリケーションでの印刷の処理方法を再定義する Windows 機能です。 XPS の印刷パスは次のように置き換えることができます。
- リッチ テキスト形式やポータブル ドキュメント形式などのドキュメントプレゼンテーション言語。
- 印刷スプーラー形式には、Windows メタファイル (WMF) や拡張メタファイル (EMF) があります。
- プリンター コマンド言語や PostScript などのページ記述言語。
その結果、XPS 印刷パスは、プリンター ドライバーまたはデバイスでのアプリケーションの公開から最終的な処理までの XPS 形式を維持します。
XPS ドキュメントの印刷スプーラーは、XPS 印刷パスと GDI 印刷パスの両方をサポートしています。 XPS 印刷パスは、XPS スプール ファイルをネイティブに使用し、XPS プリンター ドライバーを必要とします。 XPS 印刷パスは、XPS プリンター ドライバー (XPSDrv) モデルに基づいて構築されています。
XPS 印刷パスの利点は次のとおりです。
- WYSIWYG印刷のサポート。
- チャネルあたり 32 ビット、CMYK カラー モデル、名前付き色、n インク、およびトランスパレンシーとグラデーションなど、高度なカラー プロファイルのネイティブ サポート。
- 印刷パフォーマンスの向上 - XPS の機能と拡張機能は、XPS 印刷パスを対象とするアプリケーションでのみ使用できます。
- 業界標準の XPS 形式。
基本的な印刷シナリオでは、印刷構成とジョブの送信用の標準 UI を使用して、シンプルで直感的な API を使用できます。 高度なシナリオでは、API は UI のカスタマイズをサポートしているか、まったく UI をサポートしないか、同期印刷または非同期印刷、バッチ印刷機能をサポートします。 単純なオプションと詳細オプションの両方で、完全または部分的な信頼モードで印刷のサポートが提供されます。
XPS は拡張性を念頭に置いて設計されているため、機能をモジュール方式で XPS に追加できます。 拡張性の機能は次のとおりです。
- デバイス機能の迅速な拡張をサポートする印刷スキーマ。 スキーマのパブリック部分は、必要なデバイス機能を追加するために定期的に更新されます。 詳細については、拡張アーキテクチャを参照してください。
- XPSDrv ドライバーが XPS ドキュメントの直接印刷とスケーラブル印刷の両方をサポートするために使用する拡張可能なフィルター パイプライン。 詳細については、XPSDrv プリンター ドライバー
を参照してください。
印刷パスのアーキテクチャ
WPF アプリケーションは、XPS 印刷パスをネイティブにサポートし、XPS 印刷 API を使用して XPSDrv ドライバーに直接印刷できます。 書き込み操作のターゲット印刷キューに XPSDrv ドライバーがない場合、XpsDocumentWriter クラスの Write メソッドと WriteAsync メソッドは、GDI 印刷パスのコンテンツを XPS から GDI 形式に自動的に変換します。
次の図は、印刷サブシステムを示し、Microsoft および独立系ソフトウェアおよびハードウェア ベンダーによって提供される部分を定義しています。
基本的な XPS 印刷
WPF には、基本的な印刷機能と高度な印刷機能の両方をサポートする印刷 API があります。 広範な印刷のカスタマイズや完全な XPS 機能セットへのアクセスを必要としないアプリケーションでは、基本的な印刷サポートで十分な場合があります。 基本的な印刷のサポートは、最小限の構成を必要とし、使い慣れた UI を備え、多くの XPS 機能をサポートする PrintDialog コントロールを通じて提供されます。
PrintDialog
System.Windows.Controls.PrintDialog コントロールは、UI、構成、および XPS ジョブの送信に 1 つのエントリ ポイントを提供します。 コントロールをインスタンス化して使用する方法については、「印刷ダイアログを表示する方法」を参照してください。
高度な XPS 印刷
XPS 機能の完全なセットにアクセスするには、高度な印刷 API を使用します。 このセクションでは、
PrintTicket と PrintCapabilities
PrintTicket クラスと PrintCapabilities クラスは、高度な XPS 機能の基盤です。 どちらのオブジェクトにも、印刷スキーマによって定義される印刷指向機能の XML 形式の構造が含まれています。 この機能には、自動裏表印刷、ページ順序、両面印刷、およびホチキス止めがあります。 PrintTicket
は、印刷ジョブの処理方法をプリンターに指示します。 PrintCapabilities
クラスは、プリンターの機能を定義します。 プリンターの機能を照会することで、プリンターのサポートされている機能を最大限に活用する PrintTicket
を作成できます。 同様に、サポートされていない機能は回避できます。
次の例では、プリンターの PrintCapabilities
を照会し、コードを使用して PrintTicket
を作成します。
/// <summary>
/// Returns a print ticket, which is a set of instructions telling a printer how
/// to set its various features, such as duplexing, collating, and stapling.
/// </summary>
/// <param name="printQueue">The print queue to print to.</param>
/// <returns>A print ticket.</returns>
public static PrintTicket GetPrintTicket(PrintQueue printQueue)
{
PrintCapabilities printCapabilites = printQueue.GetPrintCapabilities();
// Get a default print ticket from printer.
PrintTicket printTicket = printQueue.DefaultPrintTicket;
// Modify the print ticket.
if (printCapabilites.CollationCapability.Contains(Collation.Collated))
printTicket.Collation = Collation.Collated;
if (printCapabilites.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge))
printTicket.Duplexing = Duplexing.TwoSidedLongEdge;
if (printCapabilites.StaplingCapability.Contains(Stapling.StapleDualLeft))
printTicket.Stapling = Stapling.StapleDualLeft;
// Returns a print ticket, which is a set of instructions telling a printer how
// to set its various features, such as duplexing, collating, and stapling.
return printTicket;
}
''' <summary>
''' Returns a print ticket, which is a set of instructions telling a printer how
''' to set its various features, such as duplexing, collating, and stapling.
''' </summary>
''' <param name="printQueue">The print queue to print to.</param>
''' <returns>A print ticket.</returns>
Public Shared Function GetPrintTicket(printQueue As PrintQueue) As PrintTicket
Dim printCapabilites As PrintCapabilities = printQueue.GetPrintCapabilities()
' Get a default print ticket from printer.
Dim printTicket As PrintTicket = printQueue.DefaultPrintTicket
' Modify the print ticket.
If printCapabilites.CollationCapability.Contains(Collation.Collated) Then
printTicket.Collation = Collation.Collated
End If
If printCapabilites.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge) Then
printTicket.Duplexing = Duplexing.TwoSidedLongEdge
End If
If printCapabilites.StaplingCapability.Contains(Stapling.StapleDualLeft) Then
printTicket.Stapling = Stapling.StapleDualLeft
End If
' Returns a print ticket, which is a set of instructions telling a printer how
' to set its various features, such as duplexing, collating, and stapling.
Return printTicket
End Function
PrintServer と PrintQueue
PrintServer クラスはネットワーク プリント サーバーを表し、PrintQueue クラスはプリンターと、それに関連付けられている出力ジョブ キューを表します。 これらの API は共に、サーバーの印刷ジョブの高度な管理をサポートします。 PrintServer
(またはその派生クラスの 1 つ) を使用して、PrintQueue
を管理します。
次の例では、LocalPrintServer を作成し、コードを使用してローカル コンピューターの PrintQueueCollection にアクセスします。
/// <summary>
/// Return a collection of print queues, which individually hold the features or states
/// of a printer as well as common properties for all print queues.
/// </summary>
/// <returns>A collection of print queues.</returns>
public static PrintQueueCollection GetPrintQueues()
{
// Create a LocalPrintServer instance, which represents
// the print server for the local computer.
LocalPrintServer localPrintServer = new();
// Get the default print queue on the local computer.
//PrintQueue printQueue = localPrintServer.DefaultPrintQueue;
// Get all print queues on the local computer.
PrintQueueCollection printQueueCollection = localPrintServer.GetPrintQueues();
// Return a collection of print queues, which individually hold the features or states
// of a printer as well as common properties for all print queues.
return printQueueCollection;
}
''' <summary>
''' Return a collection of print queues, which individually hold the features or states
''' of a printer as well as common properties for all print queues.
''' </summary>
''' <returns>A collection of print queues.</returns>
Public Shared Function GetPrintQueues() As PrintQueueCollection
' Create a LocalPrintServer instance, which represents
' the print server for the local computer.
Dim localPrintServer As LocalPrintServer = New LocalPrintServer()
' Get the default print queue on the local computer.
'Dim printQueue As PrintQueue = localPrintServer.DefaultPrintQueue
' Get all print queues on the local computer.
Dim printQueueCollection As PrintQueueCollection = localPrintServer.GetPrintQueues()
' Return a collection of print queues, which individually hold the features or states
' of a printer as well as common properties for all print queues.
Return printQueueCollection
End Function
Xpsドキュメントライター
XpsDocumentWriter、多くの Write および WriteAsync メソッドを使用して、XPS ドキュメントを PrintQueueに追加します。 たとえば、Write(FixedDocumentSequence, PrintTicket) メソッドは、印刷チケットを含む XPS ドキュメントをキューに同期的に追加するために使用されます。 WriteAsync(FixedDocumentSequence, PrintTicket) メソッドは、印刷チケットを含む XPS ドキュメントをキューに非同期的に追加するために使用されます。
次の例では、XpsDocumentWriter
を作成し、コードを使用して XPS ドキュメントを同期的および非同期的に PrintQueue
に追加します。
/// <summary>
/// Asynchronously, add the XPS document together with a print ticket to the print queue.
/// </summary>
/// <param name="xpsFilePath">Path to source XPS file.</param>
/// <param name="printQueue">The print queue to print to.</param>
/// <param name="printTicket">The print ticket for the selected print queue.</param>
public static void PrintXpsDocumentAsync(string xpsFilePath, PrintQueue printQueue, PrintTicket printTicket)
{
// Create an XpsDocumentWriter object for the print queue.
XpsDocumentWriter xpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue);
// Open the selected document.
XpsDocument xpsDocument = new(xpsFilePath, FileAccess.Read);
// Get a fixed document sequence for the selected document.
FixedDocumentSequence fixedDocSeq = xpsDocument.GetFixedDocumentSequence();
// Asynchronously, add the XPS document together with a print ticket to the print queue.
xpsDocumentWriter.WriteAsync(fixedDocSeq, printTicket);
}
/// <summary>
/// Synchronously, add the XPS document together with a print ticket to the print queue.
/// </summary>
/// <param name="xpsFilePath">Path to source XPS file.</param>
/// <param name="printQueue">The print queue to print to.</param>
/// <param name="printTicket">The print ticket for the selected print queue.</param>
public static void PrintXpsDocument(string xpsFilePath, PrintQueue printQueue, PrintTicket printTicket)
{
// Create an XpsDocumentWriter object for the print queue.
XpsDocumentWriter xpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue);
// Open the selected document.
XpsDocument xpsDocument = new(xpsFilePath, FileAccess.Read);
// Get a fixed document sequence for the selected document.
FixedDocumentSequence fixedDocSeq = xpsDocument.GetFixedDocumentSequence();
// Synchronously, add the XPS document together with a print ticket to the print queue.
xpsDocumentWriter.Write(fixedDocSeq, printTicket);
}
''' <summary>
''' Asynchronously, add the XPS document together with a print ticket to the print queue.
''' </summary>
''' <param name="xpsFilePath">Path to source XPS file.</param>
''' <param name="printQueue">The print queue to print to.</param>
''' <param name="printTicket">The print ticket for the selected print queue.</param>
Public Shared Sub PrintXpsDocumentAsync(xpsFilePath As String, printQueue As PrintQueue, printTicket As PrintTicket)
' Create an XpsDocumentWriter object for the print queue.
Dim xpsDocumentWriter As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue)
' Open the selected document.
Dim xpsDocument As XpsDocument = New XpsDocument(xpsFilePath, FileAccess.Read)
' Get a fixed document sequence for the selected document.
Dim fixedDocSeq As FixedDocumentSequence = xpsDocument.GetFixedDocumentSequence()
' Asynchronously, add the XPS document together with a print ticket to the print queue.
xpsDocumentWriter.WriteAsync(fixedDocSeq, printTicket)
End Sub
''' <summary>
''' Synchronously, add the XPS document together with a print ticket to the print queue.
''' </summary>
''' <param name="xpsFilePath">Path to source XPS file.</param>
''' <param name="printQueue">The print queue to print to.</param>
''' <param name="printTicket">The print ticket for the selected print queue.</param>
Public Shared Sub PrintXpsDocument(xpsFilePath As String, printQueue As PrintQueue, printTicket As PrintTicket)
' Create an XpsDocumentWriter object for the print queue.
Dim xpsDocumentWriter As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue)
' Open the selected document.
Dim xpsDocument As XpsDocument = New XpsDocument(xpsFilePath, FileAccess.Read)
' Get a fixed document sequence for the selected document.
Dim fixedDocSeq As FixedDocumentSequence = xpsDocument.GetFixedDocumentSequence()
' Synchronously, add the XPS document together with a print ticket to the print queue.
xpsDocumentWriter.Write(fixedDocSeq, printTicket)
End Sub
GDI 印刷パス
WPF アプリケーションは XPS 印刷パスをネイティブにサポートしていますが、XpsDocumentWriter クラスのいずれかの Write または WriteAsync メソッドを呼び出し、XpsDrv 以外のプリンターの印刷キューを選択することで、GDI 印刷パスに出力することもできます。
XPS 機能やサポートを必要としないアプリケーションの場合、現在の GDI 印刷パスは変更されません。 GDI 印刷パスとさまざまな XPS 変換オプションの詳細については、「Microsoft XPS ドキュメント コンバーター (MXDC) および XPSDrv プリンター ドライバーを参照してください。
XPSDrv ドライバー モデル
XPS 印刷パスは、XPS 対応プリンターまたはドライバーに印刷するときに、ネイティブ印刷スプール形式として XPS を使用することでスプーラーの効率を向上させます。 サービスをレンダリングするための GDI への一連の呼び出しとしてアプリケーション出力を表す EMF とは異なり、XPS スプール形式はドキュメントを表します。 したがって、XPS スプール ファイルが XPS ベースのプリンター ドライバーに出力される場合、ドライバーはその形式のデータに対して直接動作するため、それ以上の解釈は必要ありません。 この機能により、EMF ファイルと GDI ベースの印刷ドライバーに必要なデータと色空間の変換が不要になります。
簡略化されたスプール・プロセスにより、文書をスプールする前に、EMF データ・ファイルなどの中間スプール・ファイルを生成する必要がなくなります。 スプール ファイルのサイズが小さい場合、XPS 印刷パスを使用すると、ネットワーク トラフィックを削減し、印刷パフォーマンスを向上させることができます。 EMF の同等のサイズと比較すると、XPS 印刷パスを使用すると、通常、XPS スプール ファイルのサイズが小さくなります。 スプール・ファイル・サイズの縮小は、いくつかのメカニズムによって行われます。
- フォントのサブセット化。XPS ファイル内のドキュメント内で使用される文字のみを格納します。
- 高度なグラフィックスは、XPS コンテンツのラスター化を回避するために透明度とグラデーション プリミティブをネイティブにサポートするをサポートします。
- ドキュメント内で複数回使用される会社のロゴの画像など、一般的なリソースの識別。 共通リソースは共有リソースとして扱われ、読み込まれるのは 1 回だけです。
- ZIP 圧縮。これは、すべての XPS ドキュメントで使用されます。
ベクター グラフィックが非常に複雑、多層、または非効率的に書き込まれている場合、XPS スプール ファイルのサイズが小さくない可能性があります。 GDI スプール ファイルとは異なり、XPS ファイルは画面表示のためにデバイス フォントとコンピューター ベースのフォントを埋め込みますが、両方の種類のフォントがサブセット化され、プリンター ドライバーはファイルをプリンターに送信する前にデバイス フォントを削除できます。
ヒント
また、PrintQueue.AddJob メソッドを使用して XPS ファイルを印刷することもできます。 詳細については、「XPS ファイル印刷する方法」を参照してください。
関連項目
.NET Desktop feedback