标准 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 功能按以下顺序映射:
指定了 PrintSchemaKeywordMap 值,该值与 PrintTicket 功能名称匹配。
指定了 PrintSchemaPrivateNamespaceURI 属性,GPD 功能名称与 PrintTicket 功能名称匹配。 匹配功能名称并不简单,需要遵循许多规则:
如果第一个选项的 *Order 部分是 PAGE_SETUP 或 PAGE_FINISH,并且 GPD 功能不以“Page”开头,则在尝试匹配之前,GPD 功能名称前会添加“PAGE”。
如果第一个选项的 *Order 部分是 DOC_SETUP 或 DOC_FINISH,并且 GPD 功能不以“Document”开头,则在尝试匹配之前,GPD 功能名称前会添加“Document”。
如果第一个选项的 *Order 部分是 JOB_SETUP 或 JOB_FINISH,并且 GPD 功能不以“Job”开头,则在尝试匹配之前,GPD 功能名称前会添加“Job”。
任何不是 [A-Z]、[a-z]、[0-9] 或 “_” 的字符都将在尝试匹配之前替换为'_'字符。 但是,如果 *NoPunctuationCharSubstitute? 属性设置为 TRUE,则筛选器不会将“.”或“-”替换为“_”字符。
PPD 功能按以下顺序映射:
指定了 PrintSchemaKeywordMap 值,该值与 PrintTicket 功能名称匹配。
指定了 PrintSchemaPrivateNamespaceURI 属性,PPD 功能名称与 PrintTicket 功能名称匹配。 匹配功能名称并不简单,需要遵循许多规则:
如果 OrderDependency 部分是 ExitServer、Prolog 或 JCLSetup,并且 PPD 功能名称不以“Job”开头,则在尝试匹配之前,“Job”会被添加到 PPD 功能名之前。
如果 OrderDependency 部分是 DocumentSetup,并且 PPD 功能名称不以“Document”开头,则在尝试匹配之前,“Document”会被添加到 PPD 功能名之前。
如果 OrderDependency 部分为 AnySetup,则筛选器将执行两次匹配检查:
如果 PPD 功能名称不以“Document”开头,则在尝试匹配之前,“Document”会被添加到 PPD 功能名之前。
如果未找到匹配项,或者 PPD 功能名称不以“Job”开头,则在尝试匹配之前,“Job”会被添加到 PPD 功能名之前。
如果 OrderDependency 部分是 PageSetup,并且 PPD 功能名称不以“Page”开头,则在尝试匹配之前,“Page”会被添加到 PPD 功能名之前。
任何不是 [A-Z]、[a-z]、[0-9] 或 “_” 的字符都将在尝试匹配之前替换为'_'字符。 但是,如果是 *MSNoPunctuationCharSubstitute? 字符串设置为 TRUE,筛选器不会将“.”或“-”替换为“_”字符。
GPD 和 PPD 选项按以下顺序映射:
指定了 PrintSchemaKeywordMap 值,该值与 PrintTicket 选项名称匹配。
指定了 PrintSchemaPrivateNamespaceURI 属性,GPD/PPD 选项名称与 PrintTicket 选项名称匹配。 匹配选项名称并不简单,需要遵循许多规则:
如果 GPD/PPD 选项名称以 [0-9] 或 “_”开头,则在尝试匹配之前,会在 GPD/PPD 选项名称前添加一个“_”字符。 但是,以下附加规则适用:
如果这是 GPD 选项,并且 *NoPunctuationCharSubstitute? 属性设置为 TRUE,则筛选器不会在'_'前面加上'_'字符。
如果这是 PPD 选项,并且 *MSNoPunctuationCharSubstitute? 属性设置为 TRUE,则筛选器不会在'_'前面加上'_'字符。
任何不是 [A-Z]、[a-z]、[0-9] 或 “_” 的字符都将在尝试匹配之前替换为'_'字符。 但是,以下附加规则适用:
如果这是 GPD 选项,并且 *NoPunctuationCharSubstitute? 属性设置为 TRUE,则筛选器不会将'.'或'-'替换为'_'字符。
如果这是 PPD 选项,并且 *MSNoPunctuationCharSubstitute? 属性设置为 TRUE,则筛选器不会将'.'或'-'替换为'_'字符。
表单到托盘映射
XPS 到 PCL6 和 XPS 到 PS 筛选器支持表单到托盘映射表。 如果多个托盘支持所选媒体大小(例如字母),筛选器将按如下方式断开连接:
如果默认托盘(如 GPD 或 PPD 文件中指定的)配置为使用指定的媒体大小,则使用默认托盘。
否则,筛选器会选择配置有指定媒体大小的第一个托盘(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 命令。