次の方法で共有


印刷の概要

Microsoft .NET Framework では、Windows Presentation Foundation (WPF) を使用するアプリケーション開発者には、印刷および印刷システム管理 API の豊富な新しいセットがあります。 Windows Vista では、これらの印刷システムの機能強化の一部を、Windows フォーム アプリケーションを作成する開発者やアンマネージド コードを使用する開発者も利用できます。 この新機能の中核となるのは、新しい XML Paper Specification (XPS) ファイル形式と XPS 印刷パスです。

このトピックには、次のセクションが含まれています。

XPS について

XPS は、電子ドキュメント形式、スプール ファイル形式、およびページ記述言語です。 これは、XML、Open Packaging Conventions (OPC)、およびその他の業界標準を使用してクロスプラットフォーム ドキュメントを作成するオープン ドキュメント形式です。 XPS を使用すると、デジタル ドキュメントを作成、共有、印刷、表示、アーカイブするプロセスが簡略化されます。 XPS の詳細については、「XPS ドキュメントの」を参照してください。

WPF を使用して XPS ベースのコンテンツを印刷する方法については、「プログラムによって XPS ファイルを印刷する」を参照してください。 このトピックに含まれるコンテンツのレビュー中に、これらのサンプルを参照すると便利な場合があります。 (アンマネージ コード開発者は、MXDC_ESCAPE 関数のドキュメントを参照してください。Windows フォーム開発者は、完全な XPS 印刷パスをサポートしていないが、ハイブリッド GDI から XPS への印刷パスをサポートする System.Drawing.Printing 名前空間で API を使用する必要があります。以下 印刷パス アーキテクチャ を参照してください)。

XPS プリントパス

XML Paper Specification (XPS) の印刷パスは、Windows アプリケーションでの印刷の処理方法を再定義する新しい Windows 機能です。 XPS は、ドキュメントのプレゼンテーション言語 (RTF など)、印刷スプーラー形式 (WMF など)、およびページ記述言語 (PCL や Postscript など) を置き換えることができるため。新しい印刷パスは、アプリケーションの公開から印刷ドライバーまたはデバイスの最終的な処理までの XPS 形式を維持します。

XPS 印刷パスは、XPS プリンター ドライバー モデル (XPSDrv) に基づいて構築されています。これは、"何を表示するか" (WYSIWYG) 印刷、色のサポートの向上、印刷パフォーマンスの大幅な向上など、開発者にいくつかの利点を提供します。 (XPSDrv の詳細については、Windows Driver Kit のドキュメントを参照してください)。

XPS ドキュメントの印刷スプーラーの操作は、基本的に以前のバージョンの Windows と同じです。 ただし、既存の GDI 印刷パスに加えて、XPS 印刷パスをサポートするように拡張されています。 新しい印刷パスは、XPS スプール ファイルをネイティブに使用します。 以前のバージョンの Windows 用に作成されたユーザー モード プリンター ドライバーは引き続き動作しますが、XPS 印刷パスを使用するには XPS プリンター ドライバー (XPSDrv) が必要です。

XPS 印刷パスの利点は大きく、次のようなものがあります。

  • WYSIWYG 印刷のサポート

  • 高度なカラー プロファイルのネイティブ サポート。チャネルあたり 32 ビット (bpc)、CMYK、名前付き色、n インク、透明度とグラデーションのネイティブ サポートが含まれます。

  • .NET Framework と Win32 ベースのアプリケーションの両方の印刷パフォーマンスが向上しました。

  • 業界標準の XPS 形式。

基本的な印刷シナリオでは、シンプルで直感的な API を、ユーザー インターフェイス、構成、ジョブの送信用に 1 つのエントリ ポイントで使用できます。 高度なシナリオでは、UI のサポートが追加され、同期印刷または非同期印刷、バッチ印刷機能が追加されます。 どちらのオプションでも、完全信頼モードまたは部分信頼モードでの印刷サポートが提供されます。

XPS は拡張性を念頭に置いて設計されました。 機能拡張フレームワークを使用すると、機能をモジュール方式で XPS に追加できます。 拡張性の機能は次のとおりです。

  • 印刷スキーマ。 パブリック スキーマは定期的に更新され、デバイス機能の迅速な拡張が可能になります。 (後述 PrintTicket と PrintCapabilities 参照)。

  • 拡張可能なフィルター パイプライン。 XPS プリンター ドライバー (XPSDrv) フィルター パイプラインは、XPS ドキュメントの直接印刷とスケーラブル印刷の両方を可能にするように設計されました。 詳細については、「XPSDrv プリンター ドライバーのを参照してください。

Win32 アプリケーションと .NET Framework アプリケーションの両方が XPS をサポートしていますが、Win32 および Windows フォーム アプリケーションでは、XPS プリンター ドライバー (XPSDrv) の XPS 形式のコンテンツを作成するために GDI から XPS への変換が使用されます。 これらのアプリケーションは XPS 印刷パスを使用する必要はありません。また、拡張メタファイル (EMF) ベースの印刷を引き続き使用できます。 ただし、ほとんどの XPS 機能と拡張機能は、XPS 印刷パスを対象とするアプリケーションでのみ使用できます。

Win32 および Windows フォーム アプリケーションによる XPSDrv ベースのプリンターの使用を有効にするために、XPS プリンター ドライバー (XPSDrv) は GDI から XPS 形式への変換をサポートしています。 XPSDrv モデルには、XPS から GDI 形式へのコンバーターも用意されているため、Win32 アプリケーションは XPS ドキュメントを印刷できます。 WPF アプリケーションの場合、書き込み操作のターゲット印刷キューに XPSDrv ドライバーがない場合は常に、XpsDocumentWriter クラスの Write メソッドと WriteAsync メソッドによって XPS から GDI 形式への変換が自動的に行われます。 (Windows フォーム アプリケーションでは XPS ドキュメントを印刷できません。

次の図は、印刷サブシステムを示し、Microsoft によって提供される部分と、ソフトウェアおよびハードウェア ベンダーによって定義される部分を定義しています。

スクリーンショットは、XPS 印刷システムを示しています。

基本的な XPS 印刷

WPF では、基本的な API と高度な API の両方が定義されています。 広範な印刷のカスタマイズや完全な XPS 機能セットへのアクセスを必要としないアプリケーションでは、基本的な印刷サポートを利用できます。 基本的な印刷サポートは、最小限の構成を必要とし、使い慣れた UI を備えた印刷ダイアログ コントロールを通じて公開されます。 この簡略化された印刷モデルを使用して、多くの XPS 機能を使用できます。

PrintDialog

System.Windows.Controls.PrintDialog コントロールは、UI、構成、および XPS ジョブの送信に 1 つのエントリ ポイントを提供します。 コントロールをインスタンス化して使用する方法については、「印刷ダイアログを呼び出す」を参照してください。

高度な XPS 印刷

XPS 機能の完全なセットにアクセスするには、高度な印刷 API を使用する必要があります。 関連するいくつかの API について、以下で詳しく説明します。 XPS 印刷パス API の完全な一覧については、System.Windows.Xps および System.Printing 名前空間のリファレンスを参照してください。

PrintTicket と PrintCapabilities

PrintTicket クラスと PrintCapabilities クラスは、高度な XPS 機能の基盤です。 どちらの種類のオブジェクトも、照合順序、両面印刷、ホチキス止めなど、印刷指向の機能の XML 形式の構造です。これらの構造体は、印刷スキーマによって定義されます。 PrintTicket は、印刷ジョブの処理方法をプリンターに指示します。 PrintCapabilities クラスは、プリンターの機能を定義します。 プリンターの機能を照会することで、プリンターのサポートされている機能を最大限に活用する PrintTicket を作成できます。 同様に、サポートされていない機能は回避できます。

次の例では、プリンターの PrintCapabilities に対してクエリを実行し、コードを使用して PrintTicket を作成する方法を示します。

// ---------------------- GetPrintTicketFromPrinter -----------------------
/// <summary>
///   Returns a PrintTicket based on the current default printer.</summary>
/// <returns>
///   A PrintTicket for the current local default printer.</returns>
PrintTicket^ GetPrintTicketFromPrinter () 
{
   PrintQueue^ printQueue = nullptr;

   LocalPrintServer^ localPrintServer = gcnew LocalPrintServer();

   // Retrieving collection of local printer on user machine
   PrintQueueCollection^ localPrinterCollection = localPrintServer->GetPrintQueues();

   System::Collections::IEnumerator^ localPrinterEnumerator = localPrinterCollection->GetEnumerator();

   if (localPrinterEnumerator->MoveNext())
   {
      // Get PrintQueue from first available printer
      printQueue = ((PrintQueue^)localPrinterEnumerator->Current);
   } else
   {
      return nullptr;
   }
   // Get default PrintTicket from printer
   PrintTicket^ printTicket = printQueue->DefaultPrintTicket;

   PrintCapabilities^ printCapabilites = printQueue->GetPrintCapabilities();

   // Modify PrintTicket
   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;
   }
   return printTicket;
};// end:GetPrintTicketFromPrinter()
// ---------------------- GetPrintTicketFromPrinter -----------------------
/// <summary>
///   Returns a PrintTicket based on the current default printer.</summary>
/// <returns>
///   A PrintTicket for the current local default printer.</returns>
private PrintTicket GetPrintTicketFromPrinter()
{
    PrintQueue printQueue = null;

    LocalPrintServer localPrintServer = new LocalPrintServer();

    // Retrieving collection of local printer on user machine
    PrintQueueCollection localPrinterCollection =
        localPrintServer.GetPrintQueues();

    System.Collections.IEnumerator localPrinterEnumerator =
        localPrinterCollection.GetEnumerator();

    if (localPrinterEnumerator.MoveNext())
    {
        // Get PrintQueue from first available printer
        printQueue = (PrintQueue)localPrinterEnumerator.Current;
    }
    else
    {
        // No printer exist, return null PrintTicket
        return null;
    }

    // Get default PrintTicket from printer
    PrintTicket printTicket = printQueue.DefaultPrintTicket;

    PrintCapabilities printCapabilites = printQueue.GetPrintCapabilities();

    // Modify PrintTicket
    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;
    }

    return printTicket;
}// end:GetPrintTicketFromPrinter()
' ---------------------- GetPrintTicketFromPrinter -----------------------
''' <summary>
'''   Returns a PrintTicket based on the current default printer.</summary>
''' <returns>
'''   A PrintTicket for the current local default printer.</returns>
Private Function GetPrintTicketFromPrinter() As PrintTicket
    Dim printQueue As PrintQueue = Nothing

    Dim localPrintServer As New LocalPrintServer()

    ' Retrieving collection of local printer on user machine
    Dim localPrinterCollection As PrintQueueCollection = localPrintServer.GetPrintQueues()

    Dim localPrinterEnumerator As System.Collections.IEnumerator = localPrinterCollection.GetEnumerator()

    If localPrinterEnumerator.MoveNext() Then
        ' Get PrintQueue from first available printer
        printQueue = CType(localPrinterEnumerator.Current, PrintQueue)
    Else
        ' No printer exist, return null PrintTicket
        Return Nothing
    End If

    ' Get default PrintTicket from printer
    Dim printTicket As PrintTicket = printQueue.DefaultPrintTicket

    Dim printCapabilites As PrintCapabilities = printQueue.GetPrintCapabilities()

    ' Modify PrintTicket
    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

    Return printTicket
End Function ' end:GetPrintTicketFromPrinter()

PrintServer と PrintQueue

PrintServer クラスはネットワーク プリント サーバーを表し、PrintQueue クラスはプリンターと、それに関連付けられている出力ジョブ キューを表します。 これらの API を組み合わせることで、サーバーの印刷ジョブを高度に管理できます。 PrintServer(またはその派生クラスの 1 つ) を使用して、PrintQueueを管理します。 AddJob メソッドは、新しい印刷ジョブをキューに挿入するために使用されます。

次の例では、コードを使用して LocalPrintServer を作成し、既定の PrintQueue にアクセスする方法を示します。

// -------------------- GetPrintXpsDocumentWriter() -------------------
/// <summary>
///   Returns an XpsDocumentWriter for the default print queue.</summary>
/// <returns>
///   An XpsDocumentWriter for the default print queue.</returns>
private XpsDocumentWriter GetPrintXpsDocumentWriter()
{
    // Create a local print server
    LocalPrintServer ps = new LocalPrintServer();

    // Get the default print queue
    PrintQueue pq = ps.DefaultPrintQueue;

    // Get an XpsDocumentWriter for the default print queue
    XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq);
    return xpsdw;
}// end:GetPrintXpsDocumentWriter()
' -------------------- GetPrintXpsDocumentWriter() -------------------
''' <summary>
'''   Returns an XpsDocumentWriter for the default print queue.</summary>
''' <returns>
'''   An XpsDocumentWriter for the default print queue.</returns>
Private Function GetPrintXpsDocumentWriter() As XpsDocumentWriter
    ' Create a local print server
    Dim ps As New LocalPrintServer()

    ' Get the default print queue
    Dim pq As PrintQueue = ps.DefaultPrintQueue

    ' Get an XpsDocumentWriter for the default print queue
    Dim xpsdw As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(pq)
    Return xpsdw
End Function ' end:GetPrintXpsDocumentWriter()

XpsDocumentWriter

多くの Write メソッドと WriteAsync メソッドを持つ XpsDocumentWriterは、XPS ドキュメントを PrintQueueに書き込むのに使用されます。 たとえば、Write(FixedPage, PrintTicket) メソッドを使用して XPS ドキュメントを出力し、PrintTicket メソッドで同期的に処理します。 WriteAsync(FixedDocument, PrintTicket) メソッドは、XPS ドキュメントを出力するとともに、PrintTicket を非同期に実行するために使用されます。

次の例では、コードを使用して XpsDocumentWriter を作成する方法を示します。

// -------------------- GetPrintXpsDocumentWriter() -------------------
/// <summary>
///   Returns an XpsDocumentWriter for the default print queue.</summary>
/// <returns>
///   An XpsDocumentWriter for the default print queue.</returns>
private XpsDocumentWriter GetPrintXpsDocumentWriter()
{
    // Create a local print server
    LocalPrintServer ps = new LocalPrintServer();

    // Get the default print queue
    PrintQueue pq = ps.DefaultPrintQueue;

    // Get an XpsDocumentWriter for the default print queue
    XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq);
    return xpsdw;
}// end:GetPrintXpsDocumentWriter()
' -------------------- GetPrintXpsDocumentWriter() -------------------
''' <summary>
'''   Returns an XpsDocumentWriter for the default print queue.</summary>
''' <returns>
'''   An XpsDocumentWriter for the default print queue.</returns>
Private Function GetPrintXpsDocumentWriter() As XpsDocumentWriter
    ' Create a local print server
    Dim ps As New LocalPrintServer()

    ' Get the default print queue
    Dim pq As PrintQueue = ps.DefaultPrintQueue

    ' Get an XpsDocumentWriter for the default print queue
    Dim xpsdw As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(pq)
    Return xpsdw
End Function ' end:GetPrintXpsDocumentWriter()

AddJob メソッドには、印刷方法も用意されています。 XPS ファイルをプログラムで印刷する を参照してください。 詳細については、こちらを参照してください。

GDI 印刷パス

WPF アプリケーションは XPS 印刷パスをネイティブにサポートしていますが、Win32 および Windows フォーム アプリケーションでは、一部の XPS 機能も利用できます。 XPS プリンター ドライバー (XPSDrv) は、GDI ベースの出力を XPS 形式に変換できます。 高度なシナリオでは、microsoft XPS Document Converter (MXDC)を使用してコンテンツのカスタム変換がサポートされます。 同様に、WPF アプリケーションは、XpsDocumentWriter クラスのいずれかの Write メソッドまたは WriteAsync メソッドを呼び出し、XpsDrv 以外のプリンターをターゲット印刷キューとして指定することで、GDI 印刷パスに出力することもできます。

XPS 機能やサポートを必要としないアプリケーションの場合、現在の GDI 印刷パスは変更されません。

XPSDrv ドライバー モデル

XPS プリントパスは、XPS -enabled プリンターまたはドライバーに印刷する際に、XPS をネイティブのプリントスプール形式として使用することで、スプーラーの効率を向上させます。 簡略化されたスプール・プロセスにより、文書をスプールする前に、EMF データ・ファイルなどの中間スプール・ファイルを生成する必要がなくなります。 XPS 印刷パスは、スプール ファイルのサイズを小さくすることで、ネットワーク トラフィックを削減し、印刷パフォーマンスを向上させることができます。

EMF は、サービスをレンダリングするための GDI への一連の呼び出しとしてアプリケーション出力を表す閉じた形式です。 EMF とは異なり、XPS スプール形式は、XPS ベースのプリンター ドライバー (XPSDrv) に出力するときにさらに解釈を必要とせずに、実際のドキュメントを表します。 ドライバーは、フォーマット内のデータを直接操作できます。 この機能により、EMF ファイルと GDI ベースの印刷ドライバーを使用するときに必要なデータと色空間の変換が不要になります。

通常、XPS プリンター ドライバー (XPSDrv) を対象とする XPS ドキュメントを使用する場合、スプール ファイルのサイズは EMF と同等のサイズと比較して小さくなります。ただし、次のような例外があります。

  • 非常に複雑、多層、または非効率的に書き込まれたベクター グラフィックは、同じグラフィックのビットマップ バージョンよりも大きくなる可能性があります。

  • 画面表示の目的で、XPSファイルは、デバイスフォントだけでなく、コンピュータベースのフォントを埋め込みます。GDI スプール ファイルはデバイス フォントを埋め込まないのに対して。 ただし、両方の種類のフォントがサブセット化されており (下記参照)、プリンター ドライバーは、ファイルをプリンターに送信する前にデバイス フォントを削除できます。

スプール サイズの縮小は、いくつかのメカニズムによって実行されます。

  • フォントのサブセット化。 XPS ファイルには、実際のドキュメント内で使用される文字のみが格納されます。

  • 高度なグラフィックスサポート. 透明度とグラデーション プリミティブのネイティブ サポートにより、XPS ドキュメント内のコンテンツのラスター化が回避されます。

  • 共通リソースの識別。 複数回使用されるリソース (会社のロゴを表すイメージなど) は共有リソースとして扱われ、1 回だけ読み込まれます。

  • ZIP 圧縮 をします。 すべての XPS ドキュメントで ZIP 圧縮が使用されます。

関連項目