Filtros XPS padrão
Importante
A plataforma de impressão moderna é o meio preferencial 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 Windows fornece dois filtros XPS (padrão) para dar suporte à conversão interna de XPS para PCL6 e PostScript nível 3.
Os filtros fornecidos pelo Windows estão disponíveis para drivers de classe de impressão e drivers de impressão v4 específicos do modelo. Esses filtros XPS podem ser combinados com Filtros de Recursos IHV, bem como filtros de pós-processamento IHV, conforme necessário para garantir a compatibilidade com implementações de firmware existentes.
Os filtros XPS fornecidos pelo Windows não são redistribuíveis e não estão disponíveis para drivers de impressão v3.
O arquivo de manifesto
Para usar os filtros XPS fornecidos pelo Windows, o arquivo de manifesto do driver v4 deve usar a diretiva RequiredFiles na seção DriverConfig para especificar os filtros. Estes são os nomes dos filtros:
MSxpsPCL6.dll. Fornece conversão de XPS para PCL6. MSxpsPS.dll. Fornece conversão de XPS para PostScript nível 3. Nenhuma atualização INF é necessária para utilizar um desses filtros e não há suporte para redistribuição. Recomendamos que os usuários interrompam o uso desses filtros XPS.
Configuração de pipeline de filtro de impressão
Para configurar o pipeline de filtro de impressão para usar esses filtros, você deve criar arquivos de configuração, conforme mostrado nos exemplos a seguir.
Arquivo de configuração de exemplo que especifica a conversão para 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>
Arquivo de configuração de exemplo que especifica a conversão para 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>
Recursos compatíveis
Os filtros XPS padrão oferecem suporte a muitos recursos comuns. Todas as definições de recursos usam o arquivo GPD ou PPD para o driver. O filtro MSxpsPCL6.dll requer o uso de um arquivo GPD para configuração e o filtro MSxpsPS.dll requer o uso de um arquivo PPD para configuração. A menos que indicado de outra forma, se um comando PDL personalizado for especificado para um recurso, ele será usado.
Se existirem cadeias de caracteres de injeção em qualquer seção específica (especificada com o comando *Order), no caso de arquivos GPD, o filtro fará várias suposições sobre o conteúdo dessas cadeias de caracteres e evitará o envio de comandos padrão. Isso ocorre porque o envio de comandos padrão nesse caso pode causar colisões de comandos. Portanto, o criador de um arquivo GPD deve seguir estas diretrizes:
JOB_SETUP.#
Um cabeçalho de fluxo binário PCL6 (por exemplo: ")<SP>HP-PCL XL;1;<CR><LF>") deve existir.
Um operador BeginSession deve existir, incluindo todos os atributos necessários.
Um operador OpenDataSource deve existir, incluindo todos os atributos necessários.
PAGE_SETUP.#
- Um operador BeginPage deve existir, incluindo todos os atributos necessários.
PAGE_FINISH.#
- Um operador EndPage deve existir.
JOB_FINISH.#
Um operador CloseDataSource deve existir.
Um operador EndSession deve existir.
Um operador EndPJLCommands deve existir.
Os Filtros Padrão XPS produzem dados PDL apropriados para definir a origem de uma página, com base nos comandos *PrintableArea, *PrintableOrigin ou *ImageableArea. E para evitar deslocamento adicional da origem esperada, os arquivos GPD não devem especificar nenhum comando =SetPageOrigin na definição de cadeia de caracteres *Cmd para o tamanho do papel.
Para obter mais informações sobre os recursos do PrintTicket compatíveis com os filtros XPS padrão, consulte Recursos do PrintTicket com suporte.
Recuperando PrintTicket em filtros de pós-processamento
No modelo de driver v4 lançado com o Windows 8, quando você adicionava um filtro de pós-processamento após um dos filtros MSxps, às vezes também precisava adicionar um filtro de pré-processamento. A adição do filtro de pré-processamento foi necessária para capturar o tíquete de impressão no nível do trabalho. Mas essa abordagem essencialmente adicionou um filtro baseado em modelo de objeto, antes de um dos filtros MSxps baseados em fluxo, resultando na desserialização e, em seguida, na serialização dos dados de impressão para simplesmente extrair um PrintTicket.
No Windows 8.1, o PrintTicket padrão do usuário é mesclado com o PrintTicket no nível do trabalho nos filtros MSxps e o PrintTicket mesclado é adicionado ao recipiente de propriedades do Pipeline de Filtro de Impressão. O PrintTicket mesclado é adicionado ao recipiente de propriedades do Pipeline de Filtro de Impressão da mesma maneira que o PrintTicket do Usuário. A propriedade é nomeada da seguinte maneira:
#define XPS_FP_JOB_LEVEL_PRINTTICKET "JobPrintTicket"
Durante InitializeFilter, os Filtros MTI adicionarão uma implementação de IPrintReadStreamFactory ao recipiente de propriedades. O método dessa interface, GetStream, será bloqueado até que o fluxo PrintTicket esteja disponível. Isso fornece um meio de sincronizar o acesso à propriedade.
Importante : Se GetStream for chamado de InitializeFilter, isso causará um deadlock.
Outros recursos
No caso de recursos PrintTicket que não são compatíveis com os filtros XPS padrão, os filtros verificarão todos os membros PrintTicket para ver se eles são referenciados no GPD/PPD e, em seguida, especificarão os comandos a serem gerados. Nesse caso, os comandos especificados serão gerados.
Os recursos GPD são mapeados na seguinte ordem:
Um valor PrintSchemaKeywordMap é especificado e corresponde ao nome do recurso PrintTicket.
O atributo PrintSchemaPrivateNamespaceURI é especificado e o nome do recurso GPD corresponde ao nome do recurso PrintTicket. A correspondência de nomes de recursos não é simples e segue várias regras:
Se a seção *Order da primeira opção for PAGE_SETUP ou PAGE_FINISH e o recurso GPD não começar com "Page", "Page" será anexado ao nome do recurso GPD antes de tentar corresponder.
Se a seção *Order da primeira opção é DOC_SETUP ou DOC_FINISH, e o recurso GPD não começa com "Documents", então "Documents" é adicionado ao nome do recurso GPD antes de tentar corresponder.
Se a seção *Order da primeira opção é JOB_SETUP ou JOB_FINISH, e o recurso GPD não começa com "Job", então "Job" é adicionado ao nome do recurso GPD antes de tentar corresponder.
Qualquer caractere que não seja [A-Z], [a-z], [0-9] ou '_' é substituído por um caractere '_' antes de tentar corresponder. No entanto, se o *NoPunctuationCharSubstitute? for definido como TRUE, o filtro não substituirá '.' ou '-' por um caractere '_'.
Os recursos PPD são mapeados na seguinte ordem:
Um valor PrintSchemaKeywordMap é especificado e corresponde ao nome do recurso PrintTicket.
O atributo PrintSchemaPrivateNamespaceURI é especificado e o nome do recurso PPD corresponde ao nome do recurso PrintTicket. A correspondência de nomes de recursos não é simples e segue várias regras:
Se a seção OrderDependency for ExitServer, Prolog ou JCLSetup e o nome do recurso PPD não começar com "Job", "Job" será anexado ao nome do recurso PPD antes de tentar corresponder.
Se a seção OrderDependency for DocumentSetup e o nome do recurso PPD não começar com "Document", "Document" será anexado ao nome do recurso PPD antes de tentar corresponder.
Se a seção OrderDependency for AnySetup, o filtro executará duas verificações de correspondência:
Se o nome do recurso PPD não começar com "Documents", "Documents" será anexado ao nome do recurso PPD antes de tentar corresponder.
Se nenhuma correspondência for encontrada ou se o nome do recurso PPD não começar com "Job", "Job" será anexado ao nome do recurso PPD antes de tentar corresponder.
Se a seção OrderDependency é PageSetup, e o nome do recurso PPD não começa com "Page", então "Page" é adicionado ao nome do recurso PPD antes de tentar corresponder.
Qualquer caractere que não seja [A-Z], [a-z], [0-9] ou '_' é substituído por um caractere '_' antes de tentar corresponder. No entanto, se o comando *MSNoPunctuationCharSubstitute? cadeia de caracteres é definida como TRUE, o filtro não substitui '.' ou '-' por um caractere '_'.
As opções GPD e PPD são mapeadas na seguinte ordem:
Um valor PrintSchemaKeywordMap é especificado e corresponde ao nome da opção PrintTicket.
O atributo PrintSchemaPrivateNamespaceURI é especificado e o nome da opção GPD/PPD corresponde ao nome da opção PrintTicket. A correspondência de nomes de opção não é simples e segue várias regras:
Se o nome da opção GPD/PPD começar com [0-9] ou '_', um caractere '_' será anexado ao nome da opção GPD/PPD antes de tentar corresponder. No entanto, aplicam-se as seguintes regras adicionais:
Se essa for uma opção GPD e o *NoPunctuationCharSubstitute? for definido como TRUE, o filtro não precederá '_' com um caractere '_'.
Se essa for uma opção PPD e a cadeia de caracteres *MSNoPunctuationCharSubstitute? for definida como TRUE, o filtro não precederá '_' com um caractere '_'.
Qualquer caractere que não seja [A-Z], [a-z], [0-9] ou '_' é substituído por um caractere '_' antes de tentar corresponder. No entanto, aplicam-se as seguintes regras adicionais:
Se esta for uma opção GPD e o atributo *NoPunctuationCharSubstitute? estiver definido como TRUE, o filtro não substituirá '.' ou '-' por um caractere '_'.
Se esta for uma opção PPD e a cadeia de caracteres *MSNoPunctuationCharSubstitute? estiver definida como TRUE, o filtro não substituirá '.' ou '-' por um caractere '_'.
Mapeamentos de formulário para bandeja
Os filtros XPS para PCL6 e XPS para PS dão suporte à tabela de mapeamento de formulário para bandeja. Se várias bandejas suportarem o tamanho de mídia selecionado (por exemplo, carta), os filtros desempatarão da seguinte maneira:
Se a bandeja padrão (conforme especificado no arquivo GPD ou PPD) estiver configurada para usar o tamanho de mídia especificado, a bandeja padrão será usada.
Caso contrário, o filtro escolhe a primeira bandeja (de cima para baixo, conforme especificado no arquivo GPD/PPD) configurada com o tamanho de mídia especificado.
Supressão extra de página traseira
Por padrão, os filtros XPS para PCL6 e XPS para PS lidam com a impressão duplex de documentos que contêm tamanhos de mídia mistos, tipos de mídia, compartimentos de entrada ou saída, inserindo uma página vazia. Quando os filtros inserem essa página vazia, isso força o dispositivo a imprimir a próxima página na frente de uma nova mídia. Para dispositivos que não exigem que uma página traseira seja gerada, esse comportamento pode ser suprimido adicionando as seguintes palavras-chave ao arquivo GPD ou PPD do driver.
Tipo de arquivo | Palavra-chave de supressão de página traseira |
---|---|
GPD | *SuppressExtraBacksidePages?: TRUE |
PPD | *MSSuppressExtraBacksidePages: True |
Otimizando comandos SetPageDevice
O comportamento padrão de um dispositivo PostScript que usa um driver com MSxpsPS.dll é que um comando SetPageDevice é emitido para cada página e esse comando indica o conjunto completo de opções especificadas para a página. Observe que alguns dispositivos podem não funcionar bem com essa técnica.
No entanto, se o dispositivo usar MSxpsPS.dll e o arquivo PPD que o acompanha especificar *MSOptimizeSetPageDevice: True, o seguinte será o comportamento do dispositivo PostScript: - Para cada página em que houve uma alteração em qualquer parte do comando SetPageDevice desde a página anterior, um novo comando SetPageDevice será emitido para indicar o conjunto de opções especificado para a página. Mas se não houver nenhuma alteração em nenhuma parte do comando SetPageDevice desde a página anterior, um comando SetPageDevice não será emitido para a página.