Use o serviço de rasterização XPS
Importante
A plataforma de impressão moderna é o meio preferido do Windows para se comunicar com as impressoras. Recomendamos que você use o driver de classe de caixa de entrada IPP da Microsoft juntamente com PSA (Aplicativos de Suporte à Impressão) para personalizar a experiência de impressão no Windows 10 e 11 para o desenvolvimento de dispositivos de impressora.
Para obter mais informações, consulte Plataformade impressão moderna e o Guia de design do aplicativo de suporte de impressão.
O serviço de rasterização XPS implementa objetos de rasterização XPS que convertem páginas fixas em documentos XPS em bitmaps. Esse serviço simplifica o design de um filtro XPSDrv que renderiza um documento XPS como uma série de imagens de bitmap. O filtro pode dizer a um objeto rasterizador XPS para criar uma imagem de bitmap de uma região retangular alinhada ao eixo em uma página fixa.
Por exemplo, um filtro XPSDrv para uma impressora pode exigir que uma página fixa seja enviada para a impressora como uma série de faixas horizontais ou verticais. Nesse caso, o filtro informa ao objeto rasterizador XPS para rasterizar cada banda como um bitmap separado. Como alternativa, se a impressora tiver memória suficiente, o filtro poderá informar ao rasterizador para criar uma imagem de bitmap da página inteira.
O serviço de rasterização XPS é implementado no arquivo do sistema Xpsrasterservice.dll. No entanto, os filtros XPSDrv não acessam diretamente os pontos de entrada nessa DLL. Em vez disso, um filtro acessa as interfaces do serviço de rasterização XPS por meio do recipiente de propriedades do pipeline de impressão que o filtro recebe do gerenciador de pipeline do filtro de impressão.
Para estar disponível para uso por um filtro XPSDrv, o serviço de rasterização XPS deve ser especificado no arquivo de configuração do pipeline de filtro que descreve os filtros no pipeline de filtro de impressão. Especificamente, o arquivo de configuração deve conter um elemento FilterServiceProvider com um atributo dll definido como o nome da DLL de serviço, conforme mostrado no exemplo XML a seguir:
<FilterServiceProvider dll = "XpsRasterService.dll" />
O elemento FilterServiceProvider é um filho do elemento Filters que lista os filtros no pipeline. Durante a inicialização do pipeline, o gerenciador de pipeline de filtro de impressão carrega o serviço de rasterização XPS e torna o serviço acessível ao filtro por meio do recipiente de propriedades. Para obter um exemplo de um arquivo de configuração de pipeline de filtro que carrega o serviço de rasterização XPS, consulte o exemplo XpsRasFilter no WDK. Este exemplo está localizado na pasta Src\Print\Xpsrasfilter na instalação do WDK.
Obtendo uma fábrica de rasterização XPS
Antes de rasterizar um documento XPS, um filtro XPSDrv deve recuperar uma referência ao objeto de fábrica de rasterização do recipiente de propriedades do pipeline de impressão. Depois disso, o filtro obtém um novo objeto rasterizador XPS da fábrica para cada página fixa que ele precisa renderizar.
Para inicializar um filtro XPSDrv, o gerenciador de pipeline de filtro de impressão chama o método IPrintPipelineFilter::InitializeFilter do filtro e passa a interface IPrintPipelinePropertyBag do recipiente de propriedades para o método como um parâmetro de entrada.
Para obter um ponteiro para o objeto de fábrica de rasterização XPS, o filtro XPSDrv chama o método IPrintPipelinePropertyBag::GetProperty. O nome da propriedade "MS_IXpsRasterizationFactory" identifica o objeto de fábrica de rasterização. Para essa propriedade, o valor obtido de GetProperty é uma referência à interface IUnknown do objeto de fábrica de rasterização. Depois de obter essa interface, o filtro deve chamar o método IUnknown::QueryInterface para obter uma referência à interface IXpsRasterizationFactory do objeto. Posteriormente, o filtro pode chamar o método IXpsRasterizationFactory::CreateRasterizer para criar objetos rasterizadores XPS.
Quando o objeto de fábrica não for mais necessário, o filtro deverá liberar o objeto chamando o método Release na interface IXpsRasterizationFactory do objeto.
O exemplo de código a seguir mostra como obter uma instância de interface IXpsRasterizationFactory de uma instância de interface IPrintPipelinePropertyBag:
//
// 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;
}
Criando um modelo de objeto XPS de uma página fixa
Depois de criar uma fábrica de rasterização XPS, um filtro XPSDrv pode usar a fábrica para criar objetos de rasterização XPS. Um objeto rasterizador XPS tem uma interface IXpsRasterizer. Cada objeto rasterizador XPS é dedicado a uma página fixa específica de um documento XPS. Para criar um objeto rasterizador XPS, uma fábrica requer um OM (modelo de objeto) XPS da página fixa. O XPS OM (da página fixa) está contido em um objeto que tem uma interface IXpsOMPage. O objeto rasterizador XPS usa essa interface para acessar o conteúdo da página fixa. Para obter mais informações sobre a interface IXpsOMPage, consulte a documentação do SDK do Windows.
O filtro XPSDrv segue estas etapas para criar um objeto rasterizador XPS:
O filtro lê um objeto de página fixa com uma interface IFixedPage do fluxo de entrada.
O filtro cria um objeto OM XPS com uma interface IXpsOMPage para manter o conteúdo da página fixa. O rasterizador XPS usará essa interface para acessar o conteúdo da página fixa.
Para criar o objeto rasterizador XPS, o filtro passa a interface IXpsOMPage do objeto XPS OM para o método IXpsRasterizationFactory::CreateRasterizer da fábrica de rasterização XPS.
Quando o objeto rasterizador XPS não for mais necessário, o filtro deverá liberar o objeto chamando o método Release na interface IXpsRasterizer do objeto. Para obter um exemplo de implementação de um filtro XPSDrv que usa o serviço de rasterização XPS, consulte o driver de exemplo XpsRasFilter no WDK.
Para uso com o Serviço de Rasterização XPS, telas e pincéis visuais em uma página fixa podem ser aninhados até um limite de 64 níveis. Para obter mais informações sobre telas e pincéis visuais, baixe a Especificação de papel XML.
Resolução de bitmap e formato de pixel
O objeto rasterizador XPS de uma página fixa deve saber a resolução na qual a página será renderizada. O filtro XPSDrv especifica essa resolução, em pontos por polegada (DPI), como um parâmetro de entrada na chamada para IXpsRasterizationFactory::CreateRasterizer que cria o objeto rasterizador XPS. Por exemplo, se um dispositivo de exibição tiver uma resolução de 600 DPI e uma página fixa descrever uma página de tamanho carta padrão, uma imagem de bitmap de toda a página terá as seguintes dimensões:
largura = (8,5 polegadas) x (600 DPI) = 5100 pontos
altura = (11 polegadas) x (600 DPI) = 6600 pontos
Para criar uma imagem de bitmap da região retangular de uma página fixa, um filtro XPSDrv chama o método IXpsRasterizer::RasterizeRect do objeto rasterizador XPS. Esse método sempre produz um bitmap com um tamanho de pixel de 32 bits. O formato de pixel é especificado pelo valor GUID GUID_WICPixelFormat32bppPBGRA, que é definido no arquivo de cabeçalho Wincodec.h. O formato contém componentes vermelho, verde e azul de 8 bits e usa o espaço de cores padrão (sRGB). Além disso, o formato contém um componente alfa de 8 bits. Os componentes de cor em cada valor de pixel são pré-multiplicados pelo componente alfa. Para obter mais informações sobre esse formato, consulte Visão geral dos formatos de pixel nativos.
Alguns filtros XPSDrv podem executar processamento adicional de um bitmap produzido por um objeto rasterizador XPS. Por exemplo, um filtro para uma impressora colorida pode converter o bitmap em um formato de pixel CMYK antes de encapsular o bitmap na linguagem de descrição de página da impressora e enviá-lo para a impressora.
Para obter mais informações sobre as interfaces que o serviço de rasterização XPS usa para se comunicar com filtros XPSDrv, consulte a referência DDI do cabeçalho xpsrassvc.h.
XPSRas e formatos de pixel de alta precisão
No Windows 8, o serviço de rasterização XPS expõe uma nova interface, IXpsRasterizationFactory1, que é uma nova versão do IXpsRasterizationFactory. IXpsRasterizationFactory1 expõe um novo método, IXpsRasterizationFactory1::CreateRasterizer, que é idêntico à versão Windows 7 (IXpsRasterizationFactory::CreateRasterizer), exceto que ele usa um novo parâmetro para o formato de pixel de saída.
Esse recurso expõe uma nova enumeração, XPSRAS_PIXEL_FORMAT, que permite que um chamador selecione o formato de pixel usado pela interface IWICBitmap que é retornado pelo método IXpsRasterizer::RasterizeRect .
XPSRas e a GPU
Se você tiver um computador que esteja executando Windows 8 com um driver de vídeo WDDM 1.2 e todas as condições mostradas na Árvore de Decisão de Uso de GPU XPSRas tiverem sido atendidas, a aceleração de hardware de GPU sempre será usada. Isso significa que, como desenvolvedor, você não precisa executar nenhuma etapa para se beneficiar dos aprimoramentos de desempenho fornecidos pela GPU. No entanto, para otimizar ainda mais o desempenho gráfico do seu sistema, você deve considerar fazer o seguinte:
Chame o método RasterizeRect com dimensões de retângulo consistentes. Se isso não for possível, é ideal fornecer RasterizeRect com o maior tamanho de retângulo necessário na primeira invocação e solicitar tamanhos de retângulo menores em chamadas subsequentes.
Use anti-aliasing somente quando for absolutamente necessário. O texto e os vetores com alias têm a mesma aparência de seus equivalentes com suavização de serrilhado, quando o valor de DPI fornecido para o método IXpsRasterizationFactory::CreateRasterizer é consideravelmente alto. Por exemplo, um valor de DPI maior que 200DPI é considerado alto. O teste deve ser feito para garantir que a qualidade de saída em um determinado dispositivo seja suficiente ao usar texto e vetores com alias junto com um DPI alto.
Se um documento puder ser manipulado antes de rasterizar o IXpsOMPage, o subconjunto de fontes e o uso de dicionários de recursos para elementos repetidos em várias páginas melhorarão o desempenho do XPSRas.