Share via


列印概觀

更新:2007 年 11 月

透過 Microsoft .NET Framework,使用 Windows Presentation Foundation (WPF) 的應用程式開發人員將具有一組全新而豐富的列印系統管理 API。透過 Windows Vista,其中部分列印系統的加強功能也可供建立 Windows Form 應用程式與使用 Unmanaged 程式碼的開發人員使用。這項新功能的核心為新的 XML Paper Specification (XPS) 檔案格式與 XPS 列印路徑。

本主題包含下列章節。

  • 關於 XPS

  • XPS 列印路徑

  • GDI 列印路徑

  • XPSDrv 驅動程式模型

  • 相關主題

關於 XPS

XPS 是一種電子文件格式,也是一種多工緩衝檔案格式與頁面描述語言。它是一種開放式文件格式,採用 XML、開放式封裝慣例 (OPC) 和其他業界標準來建立跨平台的文件。XPS 簡化了數位文件的建立、共用、列印、檢視和封存程序。如需 XPS 的詳細資訊,請參閱 XPS 網站 (英文)。

列印 XPS 文件範例與 HOW TO:以程式設計方式列印 XPS 檔中會提供使用 WPF 來列印 XPS 架構內容的多種方法。在檢閱本主題中的內容時,參考這些範例應可對您有所幫助 (Unmanaged 程式碼的開發人員應參閱「Microsoft XPS 文件轉換器印表機逸出」(Microsoft XPS Document Converter Printer Escape) 的說明。Windows Form 開發人員必須使用 System.Drawing.Printing 命名空間 (Namespace) 中的 API,這個 API 雖然不支援完整 XPS 列印路徑,但可支援混合的 GDI 對 XPS 列印路徑。請參閱下方的列印路徑架構)。

XPS 列印路徑

XML Paper Specification (XPS) 列印路徑是一項新 Windows 功能,可重新定義在 Windows 應用程式中處理列印的方式。由於 XPS 可以取代文件顯示語言 (如 RTF)、列印多工緩衝處理程式格式 (如 WMF) 與頁面描述語言 (如 PCL 或 Postscript),因此新的列印路徑從應用程式發佈到最終在列印驅動程式或裝置中處理,都將維持 XPS 格式。

XPS 列印路徑建置於 XPS 印表機驅動程式模型 (XPSDrv) 上,因此對開發人員而言具有「所見即所得」(WYSIWYG) 列印、改善的色彩支援與大幅提升的列印效能等好處 (如需 XPSDrv 的詳細資訊,請參閱 Windows 驅動程式開發套件 (英文))。

XPS 文件的列印多工緩衝程式的運作方式基本上與舊版 Windows 相同。但它已經過強化,除了現有的 GDI 列印路徑外,也可支援 XPS 列印路徑。新的列印路徑本身會佔用一個 XPS 多工緩衝檔案。雖然針對舊版 Windows 撰寫的使用者模式印表機驅動程式仍可繼續運作,但若要使用 XPS 列印路徑,則需使用 XPS 印表機驅動程式 (XPSDrv)。

XPS 列印路徑的優點眾多,包括:

  • WYSIWYG 列印支援

  • 進階色彩設定檔的原生支援,其中包括每個色頻 32 位元 (bpc)、CMYK、具名色彩、n 個筆跡,以及透明度與漸層的原生支援

  • .NET Framework 與 Win32 架構應用程式中更佳的列印效能

  • 業界標準 XPS 格式

在基本列印案例中,可透過簡單而容易了解的 API 單一進入點來利用使用者介面、組態與進行工作提交。在進階案例中,則加入了使用者介面 (UI) 自訂 (或完全沒有 UI)、同步或非同步列印和批次列印功能等其他支援。這兩種選項都提供完整或部分信任模式下的列印支援。

XPS 在設計時已將擴充性列入考量。使用擴充性架構,您將可在 XPS 中以模組方式加入更多功能。擴充性功能包括:

  • 列印結構描述 公用結構描述會定期更新,並可用以快速擴充裝置功能 (請參閱下面的 PrintTicket 與 PrintCapabilities)。

  • 可擴充的篩選器管線。XPS 印表機驅動程式 (XPSDrv) 篩選器管線依設計可同時支援直接和彈性的 XPS 文件列印 (請參閱 Windows 驅動程式開發套件中的 "XPSDrv" (英文))。

列印路徑架構

雖然 Win32 與 .NET Framework 應用程式皆支援 XPS,但是 Win32 與 Windows Form 應用程式仍會對 GDI 進行 XPS 轉換,以建立 XPS 印表機驅動程式 (XPSDrv) 所適用的 XPS 格式化內容。這些應用程式不一定要使用 XPS 列印路徑,而可繼續使用加強型中繼檔 (EMF) 架構列印。但大多數的 XPS 功能與加強功能都只適用於以 XPS 列印路徑為目標的應用程式。

若要讓 Win32 和 Windows Form 應用程式使用 XPSDrv 架構印表機,則 XPS 印表機驅動程式 (XPSDrv) 必須支援從 GDI 轉換為 XPS 格式。XPSDrv 模型也提供從 XPS 轉換為 GDI 格式的轉換程式,使 Win32 應用程式可列印 XPS 文件。就 WPF 應用程式而言,每當寫入作業的目標列印佇列不具 XPSDrv 驅動程式時 (Windows Form 應用程式無法列印 XPS 文件),即會自動透過 XpsDocumentWriter 類別的 WriteWriteAsync 方法完成 XPS 至 GDI 的格式轉換。

下圖說明列印子系統並定義 Microsoft 所提供的部分,以及軟體與硬體廠商所定義的部分。

XPS 列印系統

基本 XPS 列印

WPF 同時定義基本與進階 API。對於不需進行擴充列印自訂或存取完整 XPS 功能集的應用程式而言,可使用基本列印支援。基本列印支援是透過一種需要進行最少組態與具有常見 UI 的列印對話方塊控制項加以公開。透過這個簡化的列印模型,可提供許多 XPS 功能。

PrintDialog

System.Windows.Controls.PrintDialog 控制項可提供 UI、組態與 XPS 工作提交的單一進入點。如需如何具現化及使用控制項的詳細資訊,請參閱 HOW TO:叫用列印對話方塊

進階 XPS 列印

若要存取完整的 XPS 功能集,則必須使用進階列印 API。以下將進一步說明數個相關的 API。如需 XPS 列印路徑的完整清單 API,請參閱 System.Windows.XpsSystem.Printing 命名空間參考。

PrintTicket 與 PrintCapabilities

PrintTicketPrintCapabilities 類別是進階 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>
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()

如需完整的範例,請參閱建立 XPS 文件範例

PrintServer 與 PrintQueue

PrintServer 類別代表網路列印伺服器,而 PrintQueue 類別代表印表機及其相關的輸出工作佇列。這些 API 搭配運作時,可讓使用者進行伺服器列印工作的進階管理。PrintServer 或其某一個衍生類別 (Derived Class) 可用以管理 PrintQueueAddJob 方法可用以在佇列中插入新的列印工作。

下列範例示範如何使用程式碼建立 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()

如需完整的範例,請參閱列印 XPS 文件

XpsDocumentWriter

XpsDocumentWriter,連同其多項 WriteWriteAsync 方法可用以寫入 XPS 文件至 PrintQueue。例如,Write(FixedPage, PrintTicket) 方法可用以同步輸出 XPS 文件與 PrintTicketWriteAsync(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()

如需完整的範例,請參閱列印 XPS 文件

AddJob 方法也提供列印方法。如需詳細資訊,請參閱 HOW TO:以程式設計方式列印 XPS 檔

GDI 列印路徑

雖然 WPF 應用程式原來就支援 XPS 列印路徑,但 Win32 和 Windows Form 應用程式也可使用部分的 XPS 功能。XPS 印表機驅動程式 (XPSDrv) 可將 GDI 架構輸出轉換為 XPS 格式。在進階案例中,可透過 Microsoft XPS 文件轉換程式印表機逸出支援自訂的內容轉換。同樣地,WPF 應用程式也可藉由呼叫 XpsDocumentWriter 類別的其中一個 WriteWriteAsync 方法,並將非 XpsDrv 印表機指定為目標列印佇列,而輸出至 GDI 列印路徑。

對於不需要 XPS 功能或支援的應用程式,並不需變更目前的 GDI 列印路徑。

XPSDrv 驅動程式模型

XPS 列印路徑可在列印至已啟用 XPS 的印表機或驅動程式時使用 XPS 做為原生列印多工緩衝格式,以提升多工緩衝程式的效能。經簡化的多工緩衝處理序在進行文件的多工緩衝處理前不需產生中繼多工緩衝檔案,如 EMF 資料檔。藉由較小的多工緩衝檔案大小,XPS 列印路徑將可降低網路流量,並改善列印效能。

EMF 是一項封閉格式,可將應用程式輸出顯示為對 GDI 一系列的呼叫,以進行轉譯。與 EMF 不同,XPS 多工緩衝格式在輸出至 XPS 架構印表機驅動程式 (XPSDrv) 時,不需進一步解譯即可顯示實際的文件。驅動程式可直接對該格式的資料運作。透過這項功能,即不需像使用 EMF 檔案與 GDI 架構列印驅動程式時須進行資料與色彩空間的轉換。

當您使用以 XPS 印表機驅動程式 (XPSDrv) 為目標的 XPS 文件時,多工緩衝檔案大小通常會比其 EMF 對等項目來得小,但也有例外:

  • 非常複雜、多層次或撰寫效率不彰的向量圖形,可能會比相同圖形的點陣圖格式更大。

  • 為顯示於螢幕上,XPS 檔案會嵌入裝置字型與電腦架構字型,而 GDI 多工緩衝檔案則不會嵌入裝置字型。不過這兩種字型都會納入子集中 (如下所示),而且印表機驅動程式可能會在將檔案傳輸至印表機之前移除裝置字型。

多工緩衝大小可透過多種機制降低:

  • Font Subsetting。只有實際文件中所使用的字元會儲存到 XPS 檔案中。

  • 進階圖形支援。透明度與漸層基本項目的原生支援可避免 XPS 文件中的內容出現光柵化 (Rasterization) 的情形。

  • 常見資源的識別。多次使用的資源 (如代表公司標誌的影像) 會被視為共用資源,且只會載入一次。

  • ZIP 壓縮。所有 XPS 文件都會使用 ZIP 壓縮。

請參閱

工作

列印 XPS 文件

概念

Windows Presentation Foundation 中的文件

文件序列化與儲存

參考

PrintDialog

XpsDocumentWriter

XpsDocument

PrintTicket

PrintCapabilities

PrintServer

PrintQueue

Microsoft XPS 文件轉換程式印表機逸出

其他資源

列印 HOW TO 主題

列印結構描述

XPS

列印與列印多工緩衝程式