共用方式為


列印檔案概觀 (WPF .NET)

透過 Microsoft .NET,使用 Windows Presentation Foundation 的應用程式開發人員有一組豐富的列印和列印系統管理 API。 這項功能的核心是 XML 紙張規格 (XPS) 檔案格式和 XPS 列印路徑。

關於 XPS

XPS 是電子檔案格式、多工緩衝檔案格式,以及分頁描述語言。 這是一種開放檔案格式,使用 XML、開放式封裝慣例和其他業界標準來建立跨平臺檔。 XPS 可簡化數位檔建立、共用、列印、檢視和封存的程式。 如需 XPS 的詳細資訊,請參閱 XPS 檔

XPS 列印路徑

XPS 列印路徑 是 Windows 功能,可重新定義 Windows 應用程式中列印的處理方式。 XPS 列印路徑可以取代:

  • 檔簡報語言,例如 RTF 格式或可攜式檔案格式。
  • 列印多工緩衝處理器格式,例如 Windows 中繼檔或增強型中繼檔(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 驅動程式,則 Write GDI 列印路徑的 XpsDocumentWriter 類別和 WriteAsync 方法會自動將內容從 XPS 轉換成 GDI 格式。

下圖顯示列印子系統,並定義 Microsoft 和獨立軟體和硬體廠商所提供的部分。

Screenshot showing the XPS print system.

基本 XPS 列印

WPF 具有支援基本和進階列印功能的列印 API。 對於不需要大量列印自訂或存取完整 XPS 功能集的應用程式,基本列印支援可能已足夠。 基本列印支援是透過 PrintDialog 控制項提供,該控制項需要最少的設定、具有熟悉的 UI,並支援許多 XPS 功能。

PrintDialog

控制項 System.Windows.Controls.PrintDialog 提供 UI、組態和 XPS 作業提交的單一進入點。 若要瞭解如何具現化和使用控制項,請參閱 如何顯示列印對話方塊

進階 XPS 列印

若要存取一組完整的 XPS 功能,請使用進階列印 API。 本節將說明數個相關的 API,包括 PrintTicket PrintCapabilities PrintServer PrintQueue XpsDocumentWriter 。 如需 XPS 列印路徑 API 的完整清單,請參閱 System.Windows.XpsSystem.Printing 命名空間。

PrintTicket 和 PrintCapabilities

PrintTicketPrintCapabilities 類別是進階 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 或其中一個衍生的類別,會用來管理 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

XpsDocumentWriter

XpsDocumentWriter,其有許多 WriteWriteAsync 方法,可用來將 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 做為原生列印多工緩衝處理格式來改善多工緩衝處理器效率。 不同于 EMF,它代表應用程式輸出做為 GDI 的一系列呼叫來轉譯服務,XPS 多工緩衝處理格式代表檔。 因此,當 XPS 多工緩衝處理檔案輸出至 XPS 型印表機驅動程式時,它們不需要進一步解譯,因為驅動程式會以該格式直接處理資料。 此功能可消除 EMF 檔案和 GDI 型列印驅動程式所需的資料和色彩空間轉換。

簡化的多工緩衝處理常式不需要在檔多工緩衝處理之前產生中繼多工緩衝處理檔案,例如 EMF 資料檔案。 使用較小的多工緩衝處理檔案大小,XPS 列印路徑可以減少網路流量並改善列印效能。 相較于其 EMF 對等專案,XPS 多工緩衝處理檔案大小通常會在使用 XPS 列印路徑時減少。 多工緩衝處理檔案大小縮減是透過數種機制來完成:

  • 字型子設定 ,它只會將檔中使用的字元儲存在 XPS 檔案中。
  • 進階圖形支援 ,原生支援透明度和漸層基本類型,以避免 XPS 內容的點陣化。
  • 識別常見的資源 ,例如檔中多次使用之公司標誌的影像。 一般資源會被視為共用資源,而且只會載入一次。
  • ZIP 壓縮 ,用於所有 XPS 檔。

如果向量圖形非常複雜、多層式或沒有效率地寫入,XPS 多工緩衝處理檔案大小可能不會降低。 不同于 GDI 多工緩衝處理檔案,XPS 檔案會針對螢幕顯示目的內嵌裝置字型和電腦型字型,不過這兩種字型都是子集的,而且印表機驅動程式可以在將檔案傳輸到印表機之前先移除裝置字型。

提示

您也可以使用 PrintQueue.AddJob 方法來列印 XPS 檔案。 如需詳細資訊,請參閱 如何列印 XPS 檔案

另請參閱