OpenXPS 的驱动程序支持

重要

新式打印平台是 Windows 与打印机通信的首选方式。 建议使用 Microsoft 的 IPP 收件箱类驱动程序以及打印支持应用 (PSA) 来自定义 Windows 10 和 11 中的打印体验,以便进行打印机设备开发。

有关详细信息,请参阅新式打印平台打印支持应用设计指南

OpenXPS 是用于文档的 Open XML 纸张规范格式,并且它是在 Ecma 国际标准规范基础上制定的。

有关此规范的最新信息,请参阅 Open XML 纸张规范

Windows 8 全面支持 OpenXPS,同时也继续支持现有的 Microsoft XPS 格式。 本主题主要介绍通过 v4 驱动程序模型对 OpenXPS 的支持。 有关与 Windows 应用程序开发人员相关的 OpenXPS 支持,请参阅 OpenXPS 打印的应用支持

支持的 OpenXPS 方案

开发 Windows 打印路径是为了确保提交的 XPS 格式与目标打印驱动程序支持的格式相匹配,并根据需要进行格式转换。 Windows 还提供了用于查询打印驱动程序的 API,这样应用程序就可以提供兼容的元素,同时避免在打印系统内进行任何额外的转换。

打印驱动程序可以使用其清单来表明它是否支持 Microsoft XPS、Open XPS 或这两种格式。 无论是 Microsoft XPS 还是 OpenXPS,都可以使用现有的流和对象模型 (OM) 接口在打印筛选器管道中呈现给筛选器,而驱动程序不需要新的接口来支持 OpenXPS。 提交给筛选器的格式取决于驱动程序支持的格式,或者取决于应用程序提供的格式。

Microsoft XPS 文档编写器 (MXDW) 已更新,以便允许 MXDW 从任何 Windows 桌面应用程序输出 Microsoft XPS 或 OpenXPS。 同样,Windows 8 中的 Microsoft XPS 查看器和读取器应用也可以打开这两种 XPS 格式。 如有需要,用户可以从 XPS 查看器打印到 MXDW,以便转换格式。

不支持的 OpenXPS 方案

某些旧版功能要么不支持,要么在与 OpenXPS 一起使用时会降低使用体验。

不支持:不支持直接向后台处理程序发送 OpenXPS 文件(绕过 XPS 打印 API)的方案。 这样做会产生以下功能问题:

  • 直接发送到后台处理程序的 XPS 后台处理文件将被视作 MSXPS 并进行相应的处理。

  • 直接向后台处理程序发送 OpenXPS 文件的结果不明确,很可能会导致打印作业失败。

注意 目前没有为此方案提供支持的计划。

不推荐:不推荐直接从应用程序向 XPS 打印 API 发送 OpenXPS 流。 例如,不要直接向 StartXPSPrintJob 方法发送 OpenXPS 流。 否则,从一种类型的 XPS 转换为另一种类型的流时,会付出非常高的性能代价。

相反,应该使用 IPrintDocumentPackageTarget 将打印作业作为 XPS OM 提交,从而避免性能下降。

不推荐:直接将 XPS 后台处理文件发送到后台处理程序。 否则,打印系统将找不到打印路径 API 添加的所需元数据,并将格式假定为 MSXPS,然后尝试将其转换为 OpenXPS。 如果直接发送到后台处理程序的后台处理文件是 OpenXPS 格式文件,则打印筛选器管道将其“转换”为 OpenXPS 的尝试会产生不明确的结果。 如果发送到后台处理程序的文件是 MSXPS 格式文件,而驱动程序是仅限 OpenXPS 的驱动程序,则打印筛选器管道将成功转换为 OpenXPS。 但是,这种后期阶段的转换将导致打印系统性能显著下降。

对应用开发人员的影响

有关 Windows 8 支持 OpenXPS 对应用程序开发人员的影响,请参阅 OpenXPS 打印的应用支持

对驱动程序开发人员的影响

以下是在 v4 打印驱动程序中启用 OpenXPS 的基本步骤:

  • 驱动程序清单:在“驱动程序呈现”部分中添加“OpenXPS”。

  • 驱动程序清单:如果适用,在 FileSave 部分中添加“oxps”。

  • 筛选器管道:更新打印筛选器,以便处理 OpenXPS 元素。

对于给定的流,通过适当的对象接口,客户端可以使用 OpenXPS 格式将数据传输到打印筛选器管道中的筛选器。 要传输数据流,客户端需要使用 IID_IPrintReadStream 和 IID_IPrintWriteStream 接口。 要向 OM 组件传输数据,客户端需要使用 IID_IXpsDocumentProvider 和 IID_IXpsDocumentConsumer 接口。 声明支持 OpenXPS 的驱动程序必须确保所提供的打印筛选器能够在从管道管理器接收到 OpenXPS 格式时正确处理该格式。

驱动程序清单:DriverRender 部分。 在驱动程序安装过程中,安装程序会检查清单中的 DriverRender 部分,以便查看 XpsFormat 条目中是否包含 OpenXPS。 XpsFormat 条目可以同时包括 XPS(用于 Microsoft XPS)和 OpenXPS,以表示双重支持。 两种格式在 XpsFormat 项中的排列顺序决定了驱动程序的首选格式。

以下是一些如何更新 DriverRender 部分的示例。

表示仅支持 OpenXPS:

[DriverRender]
XpsFormat = OpenXPS

表示仅支持 MSXPS:

[DriverRender]
XpsFormat = XPS

表示支持两种格式,但会优先选择 OpenXPS:

[DriverRender]
XpsFormat = OpenXPS,XPS

表示支持两种格式,但会优先选择 MSXPS:

[DriverRender]
XpsFormat = XPS,OpenXPS

驱动程序开发人员决定其 V4 打印驱动程序的首选格式,而这一决定是根据驱动程序设计提供的功能作出的。 例如,可以开发一个打印驱动程序,以便为高保真图像提供 JPEG XR 支持。

打印系统会根据清单中的 DriverRender 信息做出各种决策。 以下是这些决定的一些示例:

  • 发送到 v4 驱动程序的基于 GDI 的打印作业

    Microsoft XPS 文档转换器 (MXDC) 会接收 GDI 打印作业输入,并将作业转换为 XPS 后台处理文件。 该后台处理文件的格式将与清单的 DriverRender 部分中指定的首选 XPS 格式一致。

  • XPS 打印 API 格式转换

    XPS 打印 API 将查询目标驱动程序支持的 XPS 格式。 如果驱动程序支持这两种格式,则 XPS 打印 API 会将 XPS 打印作业按应用程序提交的格式传给后台处理程序。 该过程不会进行任何转换。

    如果目标驱动程序只支持一种或另一种格式,那么作业将在后台处理之前转换为正确的格式。

    如果清单中未提供 XpsFormat,则默认行为仅为 MSXPS。 OpenXPS 输入将转换为 MSXPS。 这种行为为驱动程序提供了最强的向后兼容性。

  • 直接发送到后台处理程序的 XPS 文件

    直接发送到后台处理程序的 XPS 文件会默认为 MSXPS。 不支持直接向后台处理程序提交 OpenXPS。 但是,在 4.5+ 之前的 .NET 会序列化自己的 MSXPS,并直接将作业提交给后台处理程序。 这种行为是在引入 XPS 打印 API (xpsprint.dll) 之前实现的。

    为了与这些 .NET 应用程序向后兼容,打印筛选器管道管理器将检查后台处理文件,以确定它是否是直接从后台处理程序接收的。 如果是,则它会被假定为 MSXPS。 此时,打印筛选器管道管理器将查询驱动程序的 XPS 格式。 如果驱动程序支持 MSXPS,则不会执行转换。 如果驱动程序只支持 OpenXPS,则打印筛选器管道管理器将执行文件转换。 在作业的这一阶段进行转换,性能代价较高;但是,这样可以确保旧版 .NET 应用程序能够打印到新的 v4 OpenXPS 驱动程序。

驱动程序清单:FileSave 部分。 v4 打印驱动程序清单中的 FileSave 部分为 PORTPROMPT: 端口使用的“文件保存”对话框提供了扩展。 (在 Windows 8.1 中应使用 PORTPROMPT: 来代替 FILE:,这是因为 PORTPROMPT: 允许用户访问其拥有权限的所有文件位置,即使应用程序在低权限模式下运行也是如此)。FileSave 部分的条目通过索引与 DriverRender 部分的条目相关联。

示例:

[FileSave]
xps=0
oxps=0

[DriverRender]
XpsFormat=XPS,OpenXPS

这样将确保当用户向该驱动程序发送打印作业并将端口设置为 PORTPROMPT: 时,“文件保存”对话框将显示 XPS 和 OpenXPS 作为对话框中的文件类型选项,并分别应用 .xps 或 .oxps 作为文件扩展。

有关清单的“文件保存”部分其他选项的详细信息,请参阅 V4 驱动程序清单

OpenXPS 打印的应用支持

Open XML 纸张规范

V4 驱动程序清单