标准 XPS 筛选器

重要

建议使用 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. 如果第一个选项的 “订单 ”部分PAGE_SETUP或PAGE_FINISH,并且 GPD 功能不以“Page”开头,则在尝试匹配之前将“Page”附加到 GPD 功能名称。

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

    3. 如果第一个选项的 “订单 ”部分JOB_SETUP或JOB_FINISH,并且 GPD 功能不以“作业”开头,则在尝试匹配之前将“作业”追加到 GPD 功能名称。

    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?string 设置为 TRUE,则筛选器不会在“_”字符前面添加“_”。

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

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

      2. 如果这是 PPD 选项和 *MSNoPunctuationCharSubstitute?string 设置为 TRUE,则筛选器不会将“.”或“-”替换为“_”字符。

窗体到托盘映射

XPS 到 PCL6 和 XPS 到 PS 筛选器支持表单到托盘映射表。 如果多个托盘支持所选媒体大小 (例如字母) ,则筛选器将按如下所示打破领带:

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

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

额外的背面页面抑制

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

文件类型 后台页面抑制关键字
GPD *SuppressExtraBacksidePages?: TRUE
Ppd *MSSuppressExtraBacksidePages: True

优化 SetPageDevice 命令

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

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

支持的 PrintTicket 功能

V4 打印机驱动程序渲染