Compartir a través de


Filtros XPS estándar

Importante

La plataforma de impresión moderna es el medio preferido de Windows para comunicarse con impresoras. Se recomienda usar el controlador de clase de bandeja de entrada IPP de Microsoft, junto con aplicaciones de soporte técnico de impresión (PSA), para personalizar la experiencia de impresión en Windows 10 y 11 para el desarrollo de dispositivos de impresora.

Para obtener más información, consulte Plataforma de impresión moderna y la Guía de diseño de aplicaciones para compatibilidad con impresión.

Windows proporciona dos filtros XPS (estándar) para admitir la conversión incorporada de XPS a PCL6 y PostScript nivel 3.

Los filtros proporcionados por Windows están disponibles tanto para los controladores de clase de impresión como para los controladores de impresión v4 específicos del modelo. Estos filtros XPS pueden combinarse con filtros de características IHV, así como con filtros de postprocesamiento IHV, según sea necesario para garantizar la compatibilidad con las implementaciones de firmware existentes.

Los filtros XPS proporcionados por Windows no son redistribuibles y no están disponibles para los controladores de impresión v3.

El archivo Manifest

Para usar los filtros XPS proporcionados por Windows, el archivo de manifiesto del controlador v4 debe usar la directiva RequiredFiles de la sección DriverConfig para especificar los filtros. Estos son los nombres de los filtros:

MSxpsPCL6.dll. Proporciona la conversión de XPS a PCL6. MSxpsPS.dll. Proporciona la conversión de XPS a PostScript nivel 3. No se requieren actualizaciones INF para usar uno de estos filtros, y no se admite la redistribución. Recomendamos a los usuarios que dejen de usar estos filtros XPS.

Para configurar la canalización de filtros de impresión para usar estos filtros, debe crear archivos de configuración como se muestra en los siguientes ejemplos.

Archivo de configuración de ejemplo que especifica la conversión a 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>

Archivo de configuración de ejemplo que especifica la conversión a 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>

Características admitidas

Los filtros XPS estándar admiten muchas características comunes. Todas las definiciones de funciones usan el archivo GPD o PPD del controlador. El filtro MSxpsPCL6.dll requiere el uso de un archivo GPD para la configuración, y el filtro MSxpsPS.dll requiere el uso de un archivo PPD para la configuración. A menos que se indique lo contrario, si se especifica un comando PDL personalizado para una función, se usará.

Si existen cadenas de inyección en alguna sección en particular (especificadas con el comando *Order), en el caso de los archivos GPD, el filtro hará una serie de suposiciones sobre el contenido de esas cadenas y evitará enviar comandos predeterminados. Esto se debe a que el envío de comandos por defecto en este caso podría causar colisiones de comandos. Por lo tanto, el creador de un fichero GPD debe seguir estas directrices:

  • JOB_SETUP.#

    • Debe existir un encabezado de flujo binario PCL6 (por ejemplo: ")<SP>HP-PCL XL;1;<CR><LF>").

    • Debe existir un operador BeginSession, incluidos todos los atributos necesarios.

    • Debe existir un operador OpenDataSource con todos los atributos necesarios.

  • PAGE_SETUP.#

    • Debe existir un operador BeginPage, con todos los atributos necesarios.
  • PAGE_FINISH.#

    • Debe existir un operador EndPage.
  • JOB_FINISH.#

    • Debe existir un operador CloseDataSource.

    • Debe existir un operador EndSession.

    • Debe existir un operador EndPJLCommands.

Los Filtros Estándar XPS producen los datos PDL apropiados para establecer el origen de una página, basándose en los comandos *PrintableArea, *PrintableOrigin o *ImageableArea. Y para evitar un desplazamiento adicional del origen esperado, los archivos GPD no deben especificar ningún comando =SetPageOrigin en la definición de cadena *Cmd para su tamaño de papel.

Para obtener más información sobre las funciones PrintTicket admitidas por los filtros XPS estándar, consulte Características PrintTicket admitidas.

Recuperación de PrintTicket en filtros de postprocesamiento

En el modelo de controlador v4 que se lanzó con Windows 8, cuando se añadía un filtro de postprocesamiento después de uno de los filtros MSxps, a veces también había que añadir un filtro de preprocesamiento. Añadir el filtro de preprocesamiento era necesario para capturar la ficha de impresión a nivel de trabajo. Pero este enfoque esencialmente añadía un filtro basado en modelo de objeto, antes de uno de los filtros MSxps basados en flujo, lo que resultaba en la deserialización, y luego serialización de los datos de impresión para simplemente extraer un PrintTicket.

En Windows 8.1, el PrintTicket predeterminado del usuario se fusiona con el PrintTicket de nivel de trabajo en los filtros MSxps, y el PrintTicket fusionado se añade entonces a la bolsa de propiedades del Print Filter Pipeline. El PrintTicket fusionado se agrega a la bolsa de propiedades de Print Filter Pipeline de la misma manera que el PrintTicket de usuario. El nombre de la propiedad es el siguiente:

#define XPS_FP_JOB_LEVEL_PRINTTICKET    "JobPrintTicket"

Durante InitializeFilter, los filtros MTI añadirán una implementación de IPrintReadStreamFactory a la bolsa de propiedades. El único método de esta interfaz, GetStream, se bloqueará hasta que el flujo PrintTicket esté disponible. Esto permite sincronizar el acceso a la propiedad.

Importante: Si GetStream es llamado desde InitializeFilter, causará un bloqueo.

Otras características

En el caso de las características de PrintTicket que no son soportadas por los filtros XPS estándar, los filtros comprobarán todos los miembros de PrintTicket para ver si están referenciados en el GPD/PPD, y luego especificarán los comandos a emitir. En caso afirmativo, se generarán los comandos especificados.

Las características GPD se mapean en el siguiente orden:

  1. Se especifica un valor PrintSchemaKeywordMap que coincide con el nombre de la característica PrintTicket.

  2. Se especifica el atributo PrintSchemaPrivateNamespaceURI y el nombre de la característica GPD coincide con el nombre de la característica PrintTicket. La coincidencia de los nombres de las características no es sencilla y sigue una serie de reglas:

    1. Si la sección *Order de la primera opción es PAGE_SETUP o PAGE_FINISH, y la característica GPD no empieza por "Page", entonces se añade "Page" al nombre de la característica GPD antes de intentar la coincidencia.

    2. Si la sección *Order de la primera opción es DOC_SETUP o DOC_FINISH y la característica GPD no empieza por "Document", se añade "Document" al nombre de la característica GPD antes de intentar la comparación.

    3. Si la sección *Order de la primera opción es JOB_SETUP o JOB_FINISH y la característica GPD no empieza por "Job", se antepondrá "Job" al nombre de la característica GPD antes de intentar la coincidencia.

    4. Cualquier carácter que no sea [A-Z], [a-z], [0-9] o '_' se sustituye por un carácter '_' antes de intentar la coincidencia. Sin embargo, si el atributo *NoPunctuationCharSubstitute? está establecido en TRUE, el filtro no sustituye '.' o '-' por un carácter '_'.

Las características PPD se asignan en el siguiente orden:

  1. Se especifica un valor PrintSchemaKeywordMap y coincide con el nombre de la característica PrintTicket.

  2. Se especifica el atributo PrintSchemaPrivateNamespaceURI y el nombre de la característica PPD coincide con el nombre de la característica PrintTicket. La coincidencia de los nombres de las características no es sencilla y sigue una serie de reglas:

    1. Si la sección OrderDependency es ExitServer, Prolog o JCLSetup y el nombre de la función PPD no empieza por "Job", se añade "Job" al nombre de la función PPD antes de intentar la coincidencia.

    2. Si la sección OrderDependency es DocumentSetup y el nombre de la característica PPD no empieza por "Document", se antepondrá "Document" al nombre de la característica PPD antes de intentar la coincidencia.

    3. Si la sección OrderDependency es AnySetup, el filtro realiza dos comprobaciones de coincidencia:

      1. Si el nombre de la característica PPD no empieza por "Document", se añade "Document" al nombre de la característica PPD antes de intentar la coincidencia.

      2. Si no se encuentra ninguna coincidencia, o si el nombre de la característica PPD no empieza por "Job", se añade "Job" al nombre de la característica PPD antes de intentar la coincidencia.

    4. Si la sección OrderDependency es PageSetup y el nombre de la función PPD no empieza por "Page", se añade "Page" al nombre de la función PPD antes de intentar la coincidencia.

    5. Cualquier carácter que no sea [A-Z], [a-z], [0-9] o '_' se sustituye por un carácter '_' antes de intentar la coincidencia. Sin embargo, si la cadena *MSNoPunctuationCharSubstitute? La cadena se establece en TRUE, el filtro no sustituye '.' o '-' por un carácter '_'.

Las opciones GPD y PPD se asignan en el siguiente orden:

  1. Se especifica un valor PrintSchemaKeywordMap que coincide con el nombre de la opción PrintTicket.

  2. Se especifica el atributo PrintSchemaPrivateNamespaceURI y el nombre de la opción GPD/PPD coincide con el nombre de la opción PrintTicket. La coincidencia de nombres de opción no es sencilla y sigue una serie de reglas:

    1. Si el nombre de la opción GPD/PPD comienza con [0-9] o '_', se añade un carácter '_' al nombre de la opción GPD/PPD antes de intentar la coincidencia. Sin embargo, se aplican las siguientes reglas adicionales:

      1. Si se trata de una opción GPD y el atributo *NoPunctuationCharSubstitute? está establecido en TRUE, el filtro no antepone un carácter "_" a "_".

      2. Si se trata de una opción PPD y la cadena *MSNoPunctuationCharSubstitute? está definida como TRUE, el filtro no antepone un carácter "_" a "_".

    2. Cualquier carácter que no sea [A-Z], [a-z], [0-9] o '_' se sustituye por un carácter '_' antes de intentar la coincidencia. Sin embargo, se aplican las siguientes reglas adicionales:

      1. Si se trata de una opción GPD y el atributo *NoPunctuationCharSubstitute? está establecido en TRUE, el filtro no sustituye "." o "-" por un carácter "_".

      2. Si se trata de una opción PPD y la cadena *MSNoPunctuationCharSubstitute? tiene el valor TRUE, el filtro no sustituye los caracteres '.' o '-' por '_'.

Asignación de formulario a bandeja

Los filtros XPS a PCL6 y XPS a PS admiten la tabla de asignación de formulario a bandeja. Si varias bandejas admiten el tamaño de soporte seleccionado (por ejemplo, carta), los filtros desempatan de la siguiente manera:

  1. Si la bandeja predeterminada (como se especifica en el archivo GPD o PPD) está configurada para usar el tamaño de soporte especificado, se usa la bandeja predeterminada.

  2. En caso contrario, el filtro elige la primera bandeja (de arriba a abajo, tal como se especificaron en el archivo GPD/PPD) que esté configurada con el tamaño de soporte especificado.

Eliminación de páginas del reverso

De forma predeterminada, los filtros XPS a PCL6 y XPS a PS gestionan la impresión dúplex de documentos que contienen distintos tamaños de soporte, tipos de soporte y bandejas de entrada o salida, insertando una página vacía. Cuando los filtros insertan esta página vacía, obligan al dispositivo a imprimir la página siguiente en el anverso de un nuevo soporte. En el caso de los dispositivos que no requieren la impresión de una página en el reverso, este comportamiento puede suprimirse añadiendo las siguientes palabras clave al archivo GPD o PPD del controlador.

Tipo de archivo Palabra clave de eliminación de la página posterior
GPD *SuppressExtraBacksidePages?: TRUE
PPD *MSSuppressExtraBacksidePages: True

Optimización de los comandos SetPageDevice

El comportamiento predeterminado de un dispositivo PostScript que usa un controlador con MSxpsPS.dll es que, se emite un comando SetPageDevice para cada página, y este comando establece el conjunto completo de opciones especificadas para la página. Tenga en cuenta que algunos dispositivos pueden no funcionar bien con esta técnica.

Sin embargo, si su dispositivo usa MSxpsPS.dll y el archivo PPD que lo acompaña especifica *MSOptimizeSetPageDevice: True, entonces el comportamiento del dispositivo PostScript es el siguiente: - Para cada página en la que se haya producido un cambio en cualquier parte del comando SetPageDevice desde la página anterior, se emite un nuevo comando SetPageDevice para indicar el conjunto de opciones especificado para la página. Pero si no se ha producido ningún cambio en ninguna parte del comando SetPageDevice desde la página anterior, no se emite ningún comando SetPageDevice para la página.

Características de PrintTicket admitidas

Representación del controlador de impresora V4