标准 XPS 筛选器

重要

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

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

Windows 提供两个(标准)XPS 筛选器,以支持从 XPS 到 PCL6 和 PostScript 级别 3 的内置转换。

Windows 提供的筛选器适用于打印类驱动程序和特定于型号的 v4 打印驱动程序。 这些 XPS 筛选器可以根据需要与 IHV 功能筛选器以及 IHV 后处理筛选器结合使用,以确保与现有固件实现的兼容性。

Windows 提供的 XPS 筛选器不可重新分发,也不适用于 v3 打印驱动程序。

清单文件

若要使用 Windows 提供的 XPS 筛选器,v4 驱动程序清单文件必须使用 DriverConfig 节下的 RequiredFiles 指令来指定筛选器。 下面是筛选器的名称:

MSxpsPCL6.dll。 提供从 XPS 到 PCL6 的转换。 MSxpsPS.dll。 提供从 XPS 到 PostScript 级别 3 的转换。 使用这些筛选器之一不需要 INF 更新,也不支持重新分发。 建议用户停止使用这些 XPS 筛选器。

若要配置打印筛选器管道以使用这些筛选器,必须创建配置文件,如以下示例所示。

指定转换为 PCL6 的示例配置文件。

<?xml version="1.0" encoding="utf-8"?>
<Filters>
  <Filter dll="MSxpsPCL6.dll" clsid="{3821E518-33AF-4d17-92B3-28EB410D46B6}" name="Microsoft XPS to PCL6">
    <Input guid="{4d47a67c-66cc-4430-850e-daf466fe5bc4}" comment="IID_IPrintReadStream" />
    <Output guid="{65bb7f1b-371e-4571-8ac7-912f510c1a38}" comment="IID_IPrintWriteStream" />
  </Filter>  
</Filters>

指定转换为 PostScript 的示例配置文件。

<?xml version="1.0" encoding="utf-8"?>
<Filters>
  <Filter dll="MSxpsPS.dll" clsid="{8636D90A-5E03-4d62-9269-E06493C57473}" name="Microsoft XPS to PS">
    <Input guid="{4d47a67c-66cc-4430-850e-daf466fe5bc4}" comment="IID_IPrintReadStream" />
    <Output guid="{65bb7f1b-371e-4571-8ac7-912f510c1a38}" comment="IID_IPrintWriteStream" />
  </Filter>  
</Filters>

支持的功能

标准 XPS 筛选器支持许多常见功能。 所有功能定义都使用驱动程序的 GPD 或 PPD 文件。 MSxpsPCL6.dll 筛选器需要使用 GPD 文件进行配置,MSxpsPS.dll 筛选器需要使用 PPD 文件进行配置。 除非另有说明,否则如果为某个功能指定了自定义 PDL 命令,则将使用该命令。

如果注入字符串存在于任何特定节(使用 *Order 命令指定)下,那么在 GPD 文件的情况下,筛选器将对这些字符串的内容进行许多假设,并避免发送默认命令。 这是因为在这种情况下发送默认命令可能会导致命令冲突。 因此,GPD 文件的创建者必须遵循以下准则:

  • JOB_SETUP.#

    • PCL6 二进制流标头(例如:")<SP>HP-PCL XL;1;<CR><LF>")必须存在。

    • BeginSession 运算符必须存在,包括所有必需的属性。

    • OpenDataSource 运算符必须存在,包括所有必需的属性。

  • PAGE_SETUP.#

    • BeginPage 运算符必须存在,包括所有必需的属性。
  • PAGE_FINISH.#

    • EndPage 运算符必须存在。
  • JOB_FINISH.#

    • CloseDataSource 运算符必须存在。

    • EndSession 运算符必须存在。

    • EndPJLCommands 运算符必须存在。

XPS 标准筛选器根据 *PrintableArea、*PrintableOrigin 或 *ImageableArea 命令生成适当的 PDL 数据来设置页面的原点。 为了避免与预期原点的额外偏移,GPD 文件不应在 *Cmd 字符串定义中为其纸张大小指定任何 =SetPageOrigin 命令。

有关标准 XPS 筛选器支持的 PrintTicket 功能的详细信息,请参阅支持的 PrintTicket 功能

在后处理筛选器中检索 PrintTicket

在随 Windows 8 一起发布的 v4 驱动程序模型中,当你在 MSxps 筛选器之后添加后处理筛选器时,有时还必须添加预处理筛选器。 添加预处理筛选器对于捕获作业级打印票证是必要的。 但这种方法本质上在基于流的 MSxps 筛选器之前添加了一个基于对象模型的筛选器,导致反序列化,然后序列化打印数据以简单地提取 PrintTicket。

在Windows 8.1 中,用户默认的 PrintTicket 与 MSxps 筛选器中的作业级 PrintTicket 合并,然后将合并的 PrintTicket 添加到打印筛选器管道的属性包中。 合并后的 PrintTicket 以与用户 PrintTicket 相同的方式添加到打印筛选器管道的属性包中。 该属性的命名如下:

#define XPS_FP_JOB_LEVEL_PRINTTICKET    "JobPrintTicket"

在 InitializeFilter 期间,MTI 筛选器会将 IPrintReadStreamFactory 的实现添加到属性包中。 此接口的一种方法 GetStream 将阻止,直到 PrintTicket 流可用。 这提供了一种同步访问属性的方法。

重要说明:如果从 InitializeFilter 调用 GetStream,则会导致死锁。

其他功能

对于标准 XPS 筛选器不支持的 PrintTicket 功能,筛选器将检查所有 PrintTicket 成员,以查看它们是否在 GPD/PPD 中引用,然后指定要输出的命令。 如果是这样,将生成指定的命令。

GPD 功能按以下顺序映射:

  1. 指定了 PrintSchemaKeywordMap 值,该值与 PrintTicket 功能名称匹配。

  2. 指定了 PrintSchemaPrivateNamespaceURI 属性,GPD 功能名称与 PrintTicket 功能名称匹配。 匹配功能名称并不简单,需要遵循许多规则:

    1. 如果第一个选项的 *Order 部分是 PAGE_SETUP 或 PAGE_FINISH,并且 GPD 功能不以“Page”开头,则在尝试匹配之前,GPD 功能名称前会添加“PAGE”。

    2. 如果第一个选项的 *Order 部分是 DOC_SETUP 或 DOC_FINISH,并且 GPD 功能不以“Document”开头,则在尝试匹配之前,GPD 功能名称前会添加“Document”。

    3. 如果第一个选项的 *Order 部分是 JOB_SETUP 或 JOB_FINISH,并且 GPD 功能不以“Job”开头,则在尝试匹配之前,GPD 功能名称前会添加“Job”。

    4. 任何不是 [A-Z]、[a-z]、[0-9] 或 “_” 的字符都将在尝试匹配之前替换为'_'字符。 但是,如果 *NoPunctuationCharSubstitute? 属性设置为 TRUE,则筛选器不会将“.”或“-”替换为“_”字符。

PPD 功能按以下顺序映射:

  1. 指定了 PrintSchemaKeywordMap 值,该值与 PrintTicket 功能名称匹配。

  2. 指定了 PrintSchemaPrivateNamespaceURI 属性,PPD 功能名称与 PrintTicket 功能名称匹配。 匹配功能名称并不简单,需要遵循许多规则:

    1. 如果 OrderDependency 部分是 ExitServer、Prolog 或 JCLSetup,并且 PPD 功能名称不以“Job”开头,则在尝试匹配之前,“Job”会被添加到 PPD 功能名之前。

    2. 如果 OrderDependency 部分是 DocumentSetup,并且 PPD 功能名称不以“Document”开头,则在尝试匹配之前,“Document”会被添加到 PPD 功能名之前。

    3. 如果 OrderDependency 部分为 AnySetup,则筛选器将执行两次匹配检查:

      1. 如果 PPD 功能名称不以“Document”开头,则在尝试匹配之前,“Document”会被添加到 PPD 功能名之前。

      2. 如果未找到匹配项,或者 PPD 功能名称不以“Job”开头,则在尝试匹配之前,“Job”会被添加到 PPD 功能名之前。

    4. 如果 OrderDependency 部分是 PageSetup,并且 PPD 功能名称不以“Page”开头,则在尝试匹配之前,“Page”会被添加到 PPD 功能名之前。

    5. 任何不是 [A-Z]、[a-z]、[0-9] 或 “_” 的字符都将在尝试匹配之前替换为'_'字符。 但是,如果是 *MSNoPunctuationCharSubstitute? 字符串设置为 TRUE,筛选器不会将“.”或“-”替换为“_”字符。

GPD 和 PPD 选项按以下顺序映射:

  1. 指定了 PrintSchemaKeywordMap 值,该值与 PrintTicket 选项名称匹配。

  2. 指定了 PrintSchemaPrivateNamespaceURI 属性,GPD/PPD 选项名称与 PrintTicket 选项名称匹配。 匹配选项名称并不简单,需要遵循许多规则:

    1. 如果 GPD/PPD 选项名称以 [0-9] 或 “_”开头,则在尝试匹配之前,会在 GPD/PPD 选项名称前添加一个“_”字符。 但是,以下附加规则适用:

      1. 如果这是 GPD 选项,并且 *NoPunctuationCharSubstitute? 属性设置为 TRUE,则筛选器不会在'_'前面加上'_'字符。

      2. 如果这是 PPD 选项,并且 *MSNoPunctuationCharSubstitute? 属性设置为 TRUE,则筛选器不会在'_'前面加上'_'字符。

    2. 任何不是 [A-Z]、[a-z]、[0-9] 或 “_” 的字符都将在尝试匹配之前替换为'_'字符。 但是,以下附加规则适用:

      1. 如果这是 GPD 选项,并且 *NoPunctuationCharSubstitute? 属性设置为 TRUE,则筛选器不会将'.'或'-'替换为'_'字符。

      2. 如果这是 PPD 选项,并且 *MSNoPunctuationCharSubstitute? 属性设置为 TRUE,则筛选器不会将'.'或'-'替换为'_'字符。

表单到托盘映射

XPS 到 PCL6 和 XPS 到 PS 筛选器支持表单到托盘映射表。 如果多个托盘支持所选媒体大小(例如字母),筛选器将按如下方式断开连接:

  1. 如果默认托盘(如 GPD 或 PPD 文件中指定的)配置为使用指定的媒体大小,则使用默认托盘。

  2. 否则,筛选器会选择配置有指定媒体大小的第一个托盘(GPD/PPD 文件中指定的从上到下)。

额外的背侧页面抑制

默认情况下,XPS 到 PCL6 和 XPS 到 PS 筛选器通过插入空页面来处理包含混合媒体大小、媒体类型、输入或输出箱的文档的双面打印。 当筛选器插入此空页时,它会强制设备在新媒体的正面打印下一页。 对于不需要输出背面页面的设备,可以通过在驱动程序的 GPD 或 PPD 文件中添加以下关键字来抑制这种行为。

文件类型 背侧页面抑制关键字
GPD *SuppressExtraBacksidePages?: TRUE
PPD *MSSuppressExtraBacksidePages: True

优化 SetPageDevice 命令

使用驱动程序的 PostScript 设备与 MSxpsPS.dll 一起使用的默认行为是,为每个页面发出 SetPageDevice 命令,此命令将声明为页面指定的完整选项集。 请注意,某些设备可能无法很好地使用此技术。

如果你的设备使用 MSxpsPS.dll,并且随附的 PPD 文件指定 *MSOptimizeSetPageDevice: True,则 PostScript 设备行为如下:-对于自上一页以来 SetPageDevice 命令的任何部分发生变化的每一页,都会发出一个新的 SetPageDevice 指令来指示为该页指定的选项集。 但是,如果自上一页以来 SetPageDevice 命令的任何部分都没有变化,则不会为该页发出 SetPageDevice 命令。

支持的 PrintTicket 功能

V4 打印机驱动程序渲染