打印概述

更新:2007 年 11 月

通过 Microsoft .NET Framework,使用 Windows Presentation Foundation (WPF) 的应用程序开发人员可以使用一组新的功能丰富的打印和打印系统管理 API。在 Windows Vista 中,还为创建 Windows 窗体应用程序的开发人员和使用非托管代码的开发人员提供了这些打印系统增强功能中的某些功能。此新功能的核心是新的 XML 纸张规范 (XPS) 文件格式和 XPS 打印路径。

本主题包括以下部分。

  • 关于 XPS

  • XPS 打印路径

  • GDI 打印路径

  • XPSDrv 驱动程序模型

  • 相关主题

关于 XPS

XPS 是电子文档格式(即打印后台文件格式),并且采用的是页面描述语言。此格式是开放文档格式,它使用 XML、开放式打包约定 (OPC) 及其他行业标准来创建跨平台的文档。XPS 简化了创建、共享、打印、查看和存档数字文档的流程。有关 XPS 的更多信息,请参见 XPS Web Site(XPS 网站)。

打印 XPS 文档示例和如何:以编程方式打印 XPS 文件中演示使用 WPF 打印基于 XPS 的内容的几种方法。在查看本主题中的内容时,参考这些示例会很有帮助。(非托管代码开发人员应查看 Microsoft XPS 文档转换器打印机转义的帮助。Windows 窗体开发人员必须使用 System.Drawing.Printing 命名空间中的 API,该命名空间不支持完整的 XPS 打印路径,但支持 GDI 到 XPS 的混合打印路径。请参见下面的“打印路径体系结构”)。

XPS 打印路径

XML 纸张规范 (XPS) 打印路径是一个新的 Windows 功能,可重新定义如何在 Windows 应用程序中处理打印。因为 XPS 可以替换文档表示语言(如 RTF)、打印后台程序格式(如 WMF)和页面描述语言(如 PCL 和 Postscript),所以在打印机驱动程序或设备中,从应用程序发布到最终处理,新的打印路径都保持 XPS 格式。

XPS 打印路径是基于 XPS 打印机驱动程序模型 (XPSDrv) 生成的,该模型为开发人员带来了多个优点,如“所见即所得”(WYSIWYG) 打印、改进了颜色支持以及大大提高了打印性能(有关 XPSDrv 的更多信息,请参见 Windows Driver Development Kit(Windows 驱动程序开发工具包))。

XPS 文档的打印后台程序的操作本质上与 Windows 的以前版本相同。但是,它已进行增强,以便除现有的 GDI 打印路径外,还支持 XPS 打印路径。新的打印路径在本机使用 XPS 打印后台文件。虽然为 Windows 以前版本编写的用户模式驱动程序将继续运行,但仍需要 XPS 打印机驱动程序 (XPSDrv),以便使用 XPS 打印路径。

XPS 打印路径的优势巨大,其中包括:

  • WYSIWYG 打印支持

  • 对高级颜色配置文件的本机支持(包括 32 位/通道 (bpc)、CMYK、已命名的颜色、n 墨迹)以及对透明和渐变的本机支持。

  • 提高了基于 .NET Framework 和基于 Win32 的应用程序的打印性能。

  • 行业标准 XPS 格式。

对于基本打印方案,提供了简单、直观的 API,只需单一入口点即可进入用户界面、完成配置和作业提交。对于高级方案,为用户界面 (UI) 自定义(或者根本没有 UI)、同步或异步打印和成批打印功能添加了附加支持,这两个选项在完全或部分信任模式下都提供打印支持。

XPS 的设计充分考虑了扩展性。使用扩展性框架,可以将特性和功能以模块化方式添加到 XPS 中。扩展性功能包括:

  • Print Schema(打印架构).该公共架构会定期更新,并可以实现设备功能的迅速扩展(请参见下面的“PrintTicket 和 PrintCapabilities”)。

  • 可扩展筛选管线。XPS 打印机驱动程序 (XPSDrv) 筛选管线设计用于启用直接和可缩放的 XPS 文档打印(请在 Windows Driver Development Kit 中查找“XPSDrv”)。

打印路径体系结构

虽然 Win32 和 .NET Framework 应用程序均支持 XPS,但 Win32 和 Windows 窗体应用程序使用 GDI-XPS 转换来为 XPS 打印机驱动程序 (XPSDrv) 创建 XPS 格式的内容。不要求这些应用程序使用 XPS 打印路径,而可以继续使用基于增强型图元文件 (EMF) 的打印。但是,大多数 XPS 功能和增强功能仅可用于面向 XPS 打印路径的应用程序。

为了使 Win32 和 Windows 窗体 应用程序能使用基于 XPSDrv 的打印机,XPS 打印机驱动程序 (XPSDrv) 支持从 GDI 到 XPS 格式的转换。XPSDrv 模型还提供从 XPS 到 GDI 格式的转换器,以便 Win32 应用程序能够打印 XPS 文档。对于 WPF 应用程序,只要写操作的目标打印队列没有 XPSDrv 驱动程序,XpsDocumentWriter 类的 WriteWriteAsync 方法就会自动完成从 XPS 到 GDI 格式的转换。(Windows 窗体应用程序不能打印 XPS 文档。)

下图描绘了打印子系统,并定义了 Microsoft 提供的部分以及软、硬件供应商提供的部分。

XPS 打印系统

基本 XPS 打印

WPF 定义基本和高级 API。对于不需要各种打印自定义或 XPS 完整功能集访问权的应用程序,可以提供基本打印支持。基本打印支持通过一个打印对话框控件公开,该控件要求最低的配置,其特色是有一个熟悉的 UI。可以通过此简化的打印模型来使用众多 XPS 功能。

PrintDialog

System.Windows.Controls.PrintDialog 控件为 UI、配置和 XPS 作业提交提供单入口点。有关如何实例化和使用该控件的信息,请参见如何:调用打印对话框

高级 XPS 打印

若要访问完整的 XPS 功能集,必须使用高级打印 API。下面更详细地介绍了几个相关的 API。有关 XPS 打印路径 API 的完整列表,请参见 System.Windows.XpsSystem.Printing 命名空间参考。

PrintTicket 和 PrintCapabilities

PrintTicketPrintCapabilities 类是高级 XPS 功能的基础。这两种类型的对象均是面向打印的功能(例如排序规则、双面打印、装订等)的 XML 格式的结构。这些结构由 Print Schema(打印架构)定义。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 或其派生类之一用于管理 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 方法还提供打印方法有关详细信息,请参见如何:以编程方式打印 XPS 文件

GDI 打印路径

虽然 WPF 应用程序本身支持 XPS 打印路径,但 Win32 和 Windows 窗体应用程序也可以利用某些 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 打印后台文件不嵌入设备字体。这两种字体都划分了子集(请参见下面的内容),而且打印机驱动程序可以在将文件传输给打印机之前移除这些设备字体。

减小打印后台文件的大小可通过几种机制来进行:

  • 字体子集划分。只有在实际的文档中使用的字符才存储在 XPS 文件中。

  • 高级图形支持。对透明和渐变基元的本机支持可避免 XPS 文档中的内容光栅化。

  • 公共资源的识别。将多次使用的资源(如表示公司徽标的图像)视为共享资源,并且只加载一次。

  • ZIP 压缩。所有 XPS 文档均使用 ZIP 压缩。

请参见

任务

打印 XPS 文档

概念

Windows Presentation Foundation 中的文档

文档序列化和存储

参考

PrintDialog

XpsDocumentWriter

XpsDocument

PrintTicket

PrintCapabilities

PrintServer

PrintQueue

Microsoft XPS 文档转换器打印机转义

其他资源

打印帮助主题

Print Schema(打印架构)

XPS

Printing and Print Spooler(打印和打印后台处理程序)