使用 XPS 光栅化服务

重要

建议使用 Microsoft 的 IPP 收件箱类驱动程序以及打印支持应用 (PSA) ,自定义 Windows 10 和 11 中的打印体验,以便进行打印机设备开发。

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

XPS 光栅化服务实现 XPS 光栅器对象,这些对象可将 XPS 文档中的固定页面转换为位图。 此服务简化了 XPSDrv 筛选器的设计,该筛选器将 XPS 文档呈现为一系列位图图像。 筛选器可以告知 XPS 光栅器对象在固定页面中创建轴对齐矩形区域的位图图像。

例如,打印机的 XPSDrv 筛选器可能需要将固定页面作为一系列水平或垂直带发送到打印机。 在这种情况下,筛选器会告知 XPS 光栅器对象将每个波段光栅化为单独的位图。 或者,如果打印机具有足够的内存,筛选器可能会告知光栅器创建整个页面的位图图像。

XPS 光栅化服务在系统文件 Xpsrasterservice.dll 实现。 但是,XPSDrv 筛选器不直接访问此 DLL 中的入口点。 相反,筛选器通过 筛选器从打印筛选器管道管理器接收的打印管道属性包 访问 XPS 光栅化服务的接口。

若要可供 XPSDrv 筛选器使用,必须在描述打印 筛选器管道中的筛选器的筛选器管道配置文件 中指定 XPS 光栅化服务。 具体而言,配置文件必须包含 FilterServiceProvider 元素,并将 dll 属性设置为服务 DLL 名称,如以下 XML 示例所示:

<FilterServiceProvider dll = "XpsRasterService.dll" />

FilterServiceProvider 元素是 Filters 元素的子元素,用于列出管道中的筛选器。 在管道初始化期间,打印筛选器管道管理器加载 XPS 光栅化服务,并通过属性包使筛选器可以访问该服务。 有关加载 XPS 光栅化服务的筛选器管道配置文件的示例,请参阅 WDK 中的 XpsRasFilter 示例。 此示例位于 WDK 安装的 Src\Print\Xpsrasfilter 文件夹中。

获取 XPS 光栅化工厂

在对 XPS 文档进行光栅化之前,XPSDrv 筛选器必须从打印管道属性包中检索对光栅化工厂对象的引用。 此后,筛选器将从工厂获取它需要呈现的每个固定页的新 XPS 光栅器对象。

若要初始化 XPSDrv 筛选器,打印筛选器管道管理器会调用筛选器的 IPrintPipelineFilter::InitializeFilter 方法,并将属性包的 IPrintPipelinePropertyBag 接口作为输入参数传递给方法。

若要获取指向 XPS 光栅化工厂对象的指针,XPSDrv 筛选器调用 IPrintPipelinePropertyBag::GetProperty 方法。 属性名称“MS_IXpsRasterizationFactory”标识光栅化工厂对象。 对于此属性,从 GetProperty 获取的值是对光栅化工厂对象的 IUnknown 接口的引用。 获取此接口后,筛选器必须调用 IUnknown::QueryInterface 方法以获取对对象的 IXpsRasterizationFactory 接口的引用。 随后,筛选器可以调用 IXpsRasterizationFactory::CreateRasterizer 方法来创建 XPS 光栅器对象。

当不再需要工厂对象时,筛选器应通过在对象的 IXpsRasterizationFactory 接口上调用 Release 方法释放对象。

下面的代码示例演示如何从 IPrintPipelinePropertyBag 接口实例获取 IXpsRasterizationFactory 接口实例:

//
// Retrieve a reference to the XPS rasterization factory
// from the print pipeline property bag.
//
HRESULT CreateRasterizationFactory(
 IPrintPipelinePropertyBag *pPropertyBag,
 IXpsRasterizationFactory **ppXPSRasFactory)
{
    if (ppXPSRasFactory != NULL)
    {
        *ppXPSRasFactory = NULL;
    }

    if (pPropertyBag == NULL || ppXPSRasFactory == NULL)
    {
        return E_POINTER;
    }

    HRESULT hr;
    VARIANT var;
 IXpsRasterizationFactory *pXPSRasFactory;

    //
    // Retrieve the factory object from the property bag.
    //
 VariantInit(&var);
    hr = pPropertyBag->GetProperty(L"MS_IXpsRasterizationFactory",
                                   &var);
    if (SUCCEEDED(hr))
    {
        assert(var.vt == VT_UNKNOWN && var.punkVal != NULL);

        //
        // Get the factory object's IXpsRasterizationFactory interface.
        //
 IUnknown *pUnknown = var.punkVal;

        hr = pUnknown->QueryInterface(__uuidof(IXpsRasterizationFactory),
 reinterpret_cast<void**>(&pXPSRasFactory));
    }

    if (SUCCEEDED(hr))
    {
        //
        // Give the caller our reference to the IXpsRasterizationFactory interface.
        //
        *ppXPSRasFactory = pXPSRasFactory;
    }

 VariantClear(&var);
    return hr;
}

创建固定页的 XPS 对象模型

创建 XPS 光栅化工厂后,XPSDrv 筛选器可以使用工厂创建 XPS 光栅器对象。 XPS 光栅器对象具有 IXpsRasterizer 接口。 每个 XPS 光栅器对象专用于 XPS 文档的特定固定页。 若要创建 XPS 光栅器对象,工厂需要 XPS 对象模型 (固定页的 OM) 。 固定页) 的 XPS OM (包含在具有 IXpsOMPage 接口的 对象中。 XPS 光栅器对象使用此接口访问固定页面的内容。 有关 IXpsOMPage 接口的详细信息,请参阅 Windows SDK 文档。

XPSDrv 筛选器遵循以下步骤创建 XPS 光栅器对象:

  • 筛选器从输入流中读取具有 IFixedPage 接口的固定页对象。

  • 筛选器使用 IXpsOMPage 接口创建 XPS OM 对象,用于保存固定页面的内容。 XPS 光栅器稍后将使用此接口访问固定页面的内容。

  • 若要创建 XPS 光栅器对象,筛选器会将 XPS OM 对象的 IXpsOMPage 接口传递到 XPS 光栅化工厂的 IXpsRasterizationFactory::CreateRasterizer 方法。

不再需要 XPS 光栅器对象时,筛选器应通过在对象的 IXpsRasterizer 接口上调用 Release 方法释放对象。 有关使用 XPS 光栅化服务的 XPSDrv 筛选器的示例实现,请参阅 WDK 中的 XpsRasFilter 示例驱动程序。

若要与 XPS 光栅化服务一起使用,固定页面中的画布和视觉画笔最多可以嵌套 64 个级别。 有关画布和视觉画笔的详细信息,请下载 XML 纸张规范

位图分辨率和像素格式

固定页面的 XPS 光栅器对象必须知道呈现页面的分辨率。 XPSDrv 筛选器将此分辨率(以每英寸点数 (DPI) )指定为对创建 XPS 光栅 器对象的 IXpsRasterizationFactory::CreateRasterizer 的调用中的输入参数。 例如,如果显示设备的分辨率为 600 DPI,而固定页面描述标准字母大小的页面,则整个页面的位图图像具有以下尺寸:

width = (8.5 英寸) x (600 DPI) = 5100 点

height = (11 英寸) x (600 DPI) = 6600 点

若要创建固定页矩形区域的位图图像,XPSDrv 筛选器调用 XPS 光栅器对象的 IXpsRasterizer::RasterizeRect 方法。 此方法始终生成像素大小为 32 位的位图。 像素格式由在头文件 Wincodec.h 中定义的 GUID 值 GUID_WICPixelFormat32bppPBGRA指定。 格式包含 8 位红色、绿色和蓝色分量,并使用标准 (sRGB) 颜色空间。 此外,格式还包含 8 位 alpha 分量。 每个像素值中的颜色分量由 alpha 分量预乘。 有关此格式的详细信息,请参阅 本机像素格式概述

某些 XPSDrv 筛选器可能会对 XPS 光栅器对象生成的位图执行其他处理。 例如,彩色打印机的筛选器可能会先将位图转换为 CMYK 像素格式,然后再用打印机的页面描述语言包装位图并将其发送到打印机。

有关 XPS 光栅化服务用于与 XPSDrv 筛选器通信的接口的详细信息,请参阅 xpsrassvc.h 标头 DDI 参考。

XPSRas 和高精度像素格式

XPSRas 和 GPU

如果你的计算机运行Windows 8 WDDM 1.2 显示驱动程序,并且满足 XPSRas GPU 使用情况决策树中显示的所有条件,则始终使用 GPU 硬件加速。 这意味着,作为开发人员,无需执行任何步骤即可从 GPU 提供的性能增强中获益。 但是,若要进一步优化系统的图形性能,应考虑执行以下操作:

  • 调用具有一致矩形尺寸的 RasterizeRect 方法。 如果无法实现,最好在第一次调用时为 RasterizeRect 提供所需的最大矩形大小,并在后续调用中请求较小的矩形大小。

  • 仅在绝对需要时才使用抗锯齿。 当提供给 IXpsRasterizationFactory::CreateRasterizer 方法的 DPI 值相当高时,别名文本和向量看起来与其抗锯齿对应项相同。 例如,大于 200DPI 的 DPI 值被视为高。 应执行测试,以确保使用别名文本和矢量以及高 DPI 时,给定设备上的输出质量足够。

  • 如果在对 IXpsOMPage 进行光栅化之前可以操作文档,则子设置字体以及对多个页面上重复的元素使用资源字典将提高 XPSRas 性能。