Cómo: Ampliar el esquema de impresión y crear nuevas clases del sistema de impresión

Cuando la aplicación debe funcionar con dispositivos de impresión especializados que tengan características no reflejadas por las clases PrintSystemObject, PrintQueue, PrintCapabilities y PrintTicket existentes, quizá desee derivar las nuevas clases mediante herencia, crear versiones extendidas de las clases PrintCapabilities y PrintTicket y, probablemente, extender también el Print Schema.En este artículo se describen las principales partes de este tipo de proyectos; pero se describe sólo una de las muchas formas de extender las clases administradas pertinentes.

Se recomienda que lea este artículo junto con la amplia documentación del Print Schema.En este artículo se presupone que, al menos, el lector tiene una idea básica de qué es el esquema y de qué son los documentos de PrintTicket y PrintCapabilities.

Este artículo tiene las secciones siguientes.

  • Derivar un nueva clase mediante herencia

  • Determinar si las características del dispositivo ya están definidas en el esquema de impresión

  • Crear los tipos que van a representar las características del dispositivo

  • Extender las clases PrintCapabilities y PrintTicket

    • Extender la clase PrintTicket

    • Extender la clase PrintCapabilities

  • Leer y escribir las secuencias XML de PrintCapabilities y PrintTicket

  • Sobrecargar y extender las propiedades y los métodos

  • Expandir las características definidas por el esquema

  • Extender el espacio de nombres System.Printing.IndexedProperties

Ejemplo

El proyecto de ejemplo que se presenta en este artículo no proporciona todos los detalles necesarios para compilar y ejecutar una aplicación.Su finalidad es proporcionar una imagen sólo de los pasos principales necesarios para extender la funcionalidad de los espacios de nombres System.Printing y System.Printing.IndexedProperties a los dispositivos de impresión que tienen las características no admitidas explícitamente en estos espacios de nombres.Los ejemplos de código se proporcionan sólo cuando se necesitan detalles concretos.

Asimismo, estos ejemplos no incluyen necesariamente las técnicas de las buenas prácticas de programación ni código seguro.Se pasa por alto cualquier información que no sea importante para el tema del artículo.

Finalmente, este artículo se dirige principalmente a los programadores de aplicaciones en lugar de a los programadores de controladores de dispositivos.Por esta razón, se hace hincapié en escribir los objetos PrintTicket, en vez de los objetos PrintCapabilities.

Derivar un nueva clase mediante herencia

Empiece por derivar una clase que represente el dispositivo a partir de la clase PrintQueue.En el ejemplo de código siguiente, se deriva una clase BrailleEmbosser.Braille es un idioma que leen los invidentes ya que sus símbolos están formados por "puntos" que sobresalen de la superficie del papel para que puedan sentirlos con las puntas de los dedos.Una impresora Braille es simplemente una impresora que imprime Braille.Algunos controladores de las impresoras Braille pueden traducir el Braille normal al grado 3 de Braille, también denominado Braille 3, versión que ahorra espacio de Braille y que usa muchas contracciones y abreviaturas.El ejemplo proporciona una propiedad para representar esta característica.

A menudo también deberá sobrecargar algunas propiedades y métodos heredados.Vea la sección Sobrecargar y extender las propiedades y los métodos que aparece más adelante para obtener detalles.

class BrailleEmbosser : PrintQueue
{
   public BrailleEmbosser(PrintServer ps, String s, PrintSystemDesiredAccess access) : base(ps, s, access)
   {
      // Optionally, include here code to set non-inherited fields.}

   // other constructor declarations omitted

   private Boolean isBraille3Enabled;

   public Boolean IsBraile3Enabled
   {
      get { return isBraille3Enabled; }
      set { isBraille3Enabled = value; }
   }

   // remainder of class definition omitted
}

Determinar si las características del dispositivo ya están definidas en el esquema de impresión

Las clases PrintTicket y PrintCapabilities tienen propiedades que representan las características de impresora más habituales, pero hay muchas más características definidas en la especificación Print Schema Public Keywords que no se reflejan explícitamente en esas clases.(Para obtener una lista de las características comunes, vea las propiedades de la clase PrintCapabilities.) Debe leer la especificación para determinar si las características especiales del dispositivo se definen en ella.Para cualquier característica que esté incluida en la especificación, existe una gran ventaja al usar el modelo de la especificación: un modelo y terminología comunes permiten que los documentos XML de PrintTicket creados para un dispositivo puedan ser usados por otro.(Quizá otro fabricante haya fabricado el segundo dispositivo y, por esta razón, puede que se haya diseñado después de haberse creado originalmente el documento de PrintTicket.) Se pueden incrustar print tickets (solicitudes de impresión) en los propios documentos; por tanto, cuando se distribuye el documento a otras personas con impresoras distintas también se incluyen las opciones y el formato de impresión establecidas por el autor.

En el resto de este artículo, las características explícitamente admitidas por las clases PrintTicket y PrintCapabilities se denominará "características comunes". Las que se definen en la especificación Print Schema Public Keywords, pero que no admiten explícitamente las dos clases, "características definidas" y las que no se definen en la especificación de palabras clave públicas, "nuevas características".

Asimismo, puede que el dispositivo tenga una característica que tenga una coincidencia casi completa con una característica ya definida, pero con una o más opciones adicionales no reconocidas en la especificación Print Schema Public Keywords.El Print Schema se puede extender para controlar dichas características con el fin de aprovechar al máximo las definiciones existentes.Para obtener más información sobre cómo trabajar con este tipo de característica, vea la sección Expandir las características definidas por el esquema que aparece más adelante.

Crear los tipos que van a representar las características del dispositivo

Las propiedades de PrintTicket y PrintCapabilities, que corresponden a características de la impresora toman tipos especiales, suelen ser enumeraciones que representan una característica y sus valores posibles.La enumeración Collation es, por ejemplo, el tipo de la propiedad PrintTicket.Collation.También es el tipo de los miembros de la colección que constituye el tipo datos al que pertenece la propiedad PrintCapabilities.CollationCapability.

Cree las clases para las características definidas por el dispositivo y para las características nuevas usando estas clases existentes como modelos.En el ejemplo de código siguiente, se declara una enumeración BrailleGrade3.Se construye basándose en el modelo de la enumeración Collation ya que la traducción de Grade 3 es análoga a la intercalación: cualquier impresora debe admitir por lo menos un tipo de salida (intercalado o sin intercalar) porque son mutuamente excluyentes.Algunas impresoras admiten los dos.(Hay pocas impresoras que sólo admitan el resultado intercalado, pero se debe tener en cuenta esa posibilidad.) Por tanto, puede haber impresoras que sólo admitan salida de Braille sin traducir, sólo salida traducida (no es probable, pero sí posible) o ambos.La enumeración BrailleGrade3 incluye un valor Unknown por la misma razón que lo hace Collation: para controlar situaciones en las que una aplicación que genera un documento de PrintTicket ha establecido la característica de intercalación en un valor que no reconoce la especificación Print Schema Public Keywords.Si su aplicación crea un objeto PrintTicket mediante este tipo de documento, la propiedad PrintTicket.Collation obtendrá el valor Desconocido.(Los objetos PrintCapabilities nunca usan el valor Unknown.)

public enum BrailleGrade3 { Translated, Untranslated, Unknown } 

Las enumeraciones no son siempre la mejor forma de representar una característica.A veces es mejor una clase de tipo de referencia.Esto ocurre, sobre todo, cuando la característica tiene una estructura anidada de partes subordinadas que tienen su propio valor.Por ejemplo, la clase PageMediaSize tiene las propiedades Height y Width.La propiedad PageMediaSize es el tipo de la propiedad PrintTicket.PageMediaSize.También es el tipo de los miembros de la colección que define el tipo de datos al que pertenece la propiedad PrintCapabilities.PageMediaSizeCapability.

Extender las clases PrintCapabilities y PrintTicket

Aunque las clases PrintTicket y PrintCapabilities no se pueden heredar, puede extender el Print Schema para reconocer las características definidas y las nuevas.

Extender la clase PrintTicket

Para utilizar la clase PrintTicket con el sistema extendido de características, siga los pasos siguientes.A continuación se describen algunos detalles.

Procedimiento de alto nivel para extender la clase PrintTicket

  1. Si el dispositivo tiene características nuevas, cree una nueva clase para encapsularlas.(Vea la sección Crear una clase NewFeaturesPrintTicket para obtener algunos detalles.)

  2. Si el dispositivo tiene definidas las características, cree una clase para encapsularlas.(Vea la sección Crear una clase DefinedFeaturesPrintTicket para obtener algunos detalles.)

  3. Cree una clase que represente una solicitud de impresión completa.Esta clase representará el papel en la aplicación que representaría la clase PrintTicket si el dispositivo no tuviese características definidas ni nuevas.(Vea la sección Crear una clase WholePrintTicket para obtener algunos detalles.)

Procedimiento para crear una clase NewFeaturesPrintTicket

  1. Si el dispositivo tiene características nuevas, declare una clase para encapsularlas.Se denominará NewFeaturesPrintTicket.

  2. Proporcione a la nueva clase las propiedades necesarias para representar las nuevas características del dispositivo.Cada propiedad suele pertenecer a uno de los tipos nuevos creados, normalmente una enumeración.Vea la sección Crear los tipos que van a representar las características del dispositivo que aparece más atrás.

  3. Proporcione a la nueva clase una propiedad adicional, que se denominará PrivateNamespace, que contendrá una referencia al espacio de nombres XML privado que define las nuevas características del dispositivo.Necesitará esta cadena al escribir el marcado XML en los documentos de PrintCapabilities y PrintTicket.Vea la sección Leer y escribir las secuencias XML de PrintCapabilities y PrintTicket que aparece más atrás.

  4. Proporcione a la clase dos constructores.Los constructores se deben basar en los dos constructores de PrintTicket.Uno no toma parámetros, el otro, un objeto Stream con contenido XML.La secuencia XML será un documento de PrintTicket que defina características nuevas en lugar de comunes.(Vea Print Schema-Related Technologies y PrintTicket Schema and Document Construction.) Los constructores con el parámetro deben producir excepciones basadas en el modelo del constructor de la clase PrintTicket usada como parámetro en el constructor de la clase.

  5. Cree un método GetXmlStream y un método SaveTo para la clase.Utilice la palabra clave de acceso "internal" para ambos. Su finalidad es que coincidan con la funcionalidad de los métodos con igual nombre definidos en la clase PrintTicket salvo que procesarán los documentos de PrintTicket que definen las nuevas características en lugar de las comunes.Estos métodos se deben asegurar de que las secuencias generadas tengan una declaración de espacio de nombres adicional (el valor de la propiedad PrivateNamespace) en el elemento <PrintTicket … > de apertura.Vea la sección Leer y escribir las secuencias XML de PrintCapabilities y PrintTicket que aparece más atrás.

Procedimiento para crear una clase DefinedFeaturesPrintTicket

  • Si el dispositivo tiene definidas características nuevas, declare una clase para encapsularlas.Se denominará DefinedFeaturesPrintTicket.Se debe construir como construyó NewFeaturesPrintTicket anteriormente, con las excepciones siguientes.

    • Las propiedades de la clase deben tener nombres que coincidan con el nombre de la característica correspondiente de la especificación Print Schema Public Keywords.

    • No cree ninguna propiedad PrivateNamespace.El espacio de nombres de las características definidas es el mismo para las características comunes.Vea la sección Leer y escribir las secuencias XML de PrintCapabilities y PrintTicket que aparece más atrás.

    • Los métodos GetXmlStream y SaveTo no generan secuencias con una declaración de espacio de nombres adicional.

Procedimiento para crear una clase WholePrintTicket

  1. Declare una clase que representará una solicitud de impresión completa y, de esta forma, representará el papel en la aplicación que habría representado la clase PrintTicket si el dispositivo no tuviese características definidas ni nuevas.Se denominará WholePrintTicket.

  2. Proporcione una propiedad a WholePrintTicket, se denominará CommonFeatures, de tipo PrintTicket.

  3. Proporcione a WholePrintTicket una o las dos propiedades adicionales siguientes, en función de si tiene nuevas características, características definidas o ambos tipos.

    • NewFeatures de tipo NewFeaturesPrintTicket.

    • DefinedFeatures de tipo DefinedFeaturesPrintTicket.

  4. Proporcione a WholePrintTicket dos constructores.Uno que no tome ningún parámetro y otro que tome un objeto Stream con contenido XML.El constructor con un parámetro hará lo siguiente.

    1. Pasar Stream al constructor del objeto PrintTicket al que hace referencia la propiedad CommonFeatures.Ese constructor omitirá cualquier marcado de Stream que no sea pertinente para las características comunes.

    2. Pasar Stream al constructor del objeto NewFeaturesPrintTicket al que hace referencia la propiedad NewFeatures.Ese constructor omitirá cualquier marcado de Stream que no sea pertinente para las características nuevas.Si la nueva característica contiene marcado, Stream empezará por <psf:PrintTicket xmlns:psf="https://schemas.microsoft.com/windows/2003/08/printing/printschemaframework" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1" xmlns:espacio-de-nombres-abreviatura=nombre-del-espacio-de-nombres-completo>, donde nombre-del-espacio-de-nombres-completo es la dirección URL usada para identificar las nuevas características y espacio-de-nombres-abreviatura es su abreviatura.(Para obtener más información, vea la sección Leer y escribir las secuencias XML de PrintCapabilities PrintTicket más adelante.)

    3. Pasar Stream al constructor del objeto DefinedFeaturesPrintTicket al que hace referencia la propiedad DefinedFeatures.Ese constructor omitirá cualquier marcado de Stream que no sea pertinente para las características definidas.

  5. Cree GetXmlStream y un método SaveTo para la clase.Su finalidad es coincidir con la funcionalidad de los métodos de igual nombre definidos en la clase PrintTicket.Deben tener las características siguientes.

    • Cada uno de estos métodos debe llamar al método de igual nombre sobre los objetos a los que hacen referencia las propiedades CommonFeatures, DefinedFeatures (si la hay) y NewFeatures (si la hay).

    • Cada método debe concatenar las secuencias generadas por las llamadas descritas en el punto anterior.Obviamente, todas las etiquetas finales </PrintTicket>, menos la última deben eliminarse; del mismo modo, deben borrarse todas las etiquetas de inicio <PrintTicket … > excepto la primera.A menos que no haya características nuevas, la etiqueta de apertura debe tener la declaración de espacio de nombres adicional.(Vea el paso 4b.) Por este motivo, siempre debería hacer que la secuencia de características nuevas, si la hubiera, fuese la primera en la secuencia concatenada ya que siempre tendrá la declaración del nuevo espacio de nombres en su etiqueta inicial <PrintTicket … >.

    • Para realizar la concatenación, los métodos GetXmlStream y SaveTo de WholePrintTicket deberán funcionar primero internamente en una secuencia temporal.Específicamente, se logrará que las tres clases distintas, cada una serializa su contenido en la secuencia temporal, realicen el trabajo de concatenación (y de eliminación: vea el siguiente punto) y, a continuación, generen el resultado de concatenación en el flujo de salida final.

    • Después de la concatenación, los métodos GetXmlStream y SaveTo de WholePrintTicket también deberán quitar las copias duplicadas y triplicadas de los elementos de la secuencia antes de devolver la secuencia final.Estas entradas duplicadas y triplicadas estarán en la secuencia ya que cada uno de estos tres objetos, PrintTicket, NewFeaturesPrintTicket y DefinedFeaturesPrintTicket, conservan todo el documento original de PrintTicket que se usó para crearlos, aunque cada uno de ellos exponga sólo un subconjunto del documento en sus propiedades.

    • Si el constructor WholePrintTicket(Stream), vea más arriba, dividió la secuencia de entrada en tres partes creando secuencias independientes para los elementos de marcado definidos, nuevos y comunes, podría evitar el paso de eliminación descrito en el punto anterior.Después, se pasa cada una de estas secuencias menores al constructor correspondiente de las tres propiedades de WholePrintTicket.Esta técnica exige que agregue una etiqueta de cierre </PrintTicket> a cada una de las tres secuencias.A la secuencia de las propiedades CommonFeatures y DefinedFeatures, agrega una etiqueta de apertura como ésta: <psf:PrintTicket xmlns:psf="https://schemas.microsoft.com/windows/2003/08/printing/printschemaframework" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1">.La etiqueta de apertura del constructor de la propiedad NewFeatures agregaría un espacio de nombres privado adicional como éste: <psf:PrintTicket xmlns:psf="https://schemas.microsoft.com/windows/2003/08/printing/printschemaframework" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1" xmlns:espacio-de-nombres-abreviatura=nombre-del-espacio-de-nombres-completo>, donde nombre-del-espacio-de-nombres-completo es la dirección URL usada para identificar el esquema que define las nuevas características y espacio-de-nombres-abreviatura es su abreviatura.)

En el ejemplo de código siguiente, se muestra parte del resultado de este procedimiento cuando se aplica al ejemplo de impresora Braille.(Por razones de espacio y simplicidad, se ha omitido gran parte de él.) Observe que la propiedad BrailleGrade3 es un tipo de Nullable<T>.Este ejemplo sigue el modelo de las propiedades de PrintTicket como Collation.En el ejemplo, se supone que hay características nuevas y definidas, aunque no se especifique ninguna característica definida concreta.

class NewFeaturesPrintTicket
{
    public NewFeaturesPrintTicket()
    {
        // Optionally, initialize fields.For example:
        privateNamespace = "http://www.AjaxEmbossers.com/schemas/deluxemodels/v.1.0";
    }

    public NewFeaturesPrintTicket(Stream printTicketDocument)
    {
    // Parse the stream and initialize fields representing features here.// Optionally, initialize other fields.For example:
    privateNamespace = "http://www.AjaxEmbossers.com/schemas/deluxemodels/v.1.0";
    }

    private Nullable<BrailleGrade3> brailleGrade3;
    public Nullable<BrailleGrade3> BrailleGrade3
    {
        get { return brailleGrade3; }
        set { brailleGrade3 = value;}
    }

    private String privateNamespace;
    public String PrivateNamespace
    {
        get { return privateNamespace; }
        set { privateNamespace = value; }
    }
}

class DefinedFeaturesPrintTicket
{
  // Details omitted.Use the NewFeaturesPrintTicket
  // as a model, but leave out the privateNamespace field
  // and property.}

class WholePrintTicket
{
    public WholePrintTicket()
    {
        commonFeatures = new PrintTicket();
        newFeatures = new NewFeaturesPrintTicket();
        definedFeatures = new DefinedFeaturesPrintTicket();
    }

    public WholePrintTicket(Stream wholePrintTicket)
    {
         // Method 1: Pass the stream to the three constructors.// Be sure to reset the read-write position of the stream
         // to the beginning of the stream after each call to a 
         // constructor.// commonFeatures = new PrintTicket(wholePrintTicket);
              // reset read-write head here
        // newFeatures = new NewFeaturesPrintTicket(wholePrintTicket);
              // reset read-write head here
        // definedFeatures = new DefinedFeaturesPrintTicket(wholePrintTicket);
              // reset read-write head here

        // Method 2: Parse the stream and split it into three streams.// Then pass them to the constructors of the three properties.// commonFeatures = new PrintTicket(commonFeaturesPrintTicketDocument);
        // newFeatures = new NewFeaturesPrintTicket(newFeaturesPrintTicketDocument);
        // definedFeatures = new DefinedFeaturesPrintTicket(definedFeaturesPrintTicketDocument);
    }

    private PrintTicket commonFeatures;
    public PrintTicket CommonFeatures
    {
        get { return commonFeatures; }
        set { commonFeatures = value;}
    }

    private PrintTicket newFeatures;
    public PrintTicket NewFeatures
    {   // Details omitted.See CommonFeatures above.}

    private PrintTicket definedFeatures;
    public PrintTicket DefinedFeatures
    {   // Details omitted.See CommonFeatures above.}
}

Extender la clase PrintCapabilities

Para usar la clase PrintCapabilities con el dispositivo, debe extenderse de forma similar a como se extendió la clase PrintTicket.Puesto que puede utilizar la extensión de PrintTicket como modelo, sólo se incluye aquí una breve información general.

  • Cree tres clases nuevas, una para encapsular las nuevas características (NewFeaturesPrintCapabilities), otra para encapsular las definidas (DefinedFeaturesPrintCapabilities) y otra para representar un documento de PrintCapabilities completo (WholePrintCapabilities).

  • Los tipos de las propiedades de las dos primeras clases nuevas suelen ser ReadOnlyCollection<T>.Utilice las propiedades existentes de PrintCapabilities, como CollationCapability, como modelos.

  • Siguiendo también el modelo de la clase PrintCapabilities existente, los nombres de propiedad deben tener "Capability" al fin; por ejemplo, BrailleGrade3Capability.

  • La clase NewFeaturesPrintCapabilities tendrá una propiedad PrivateNamespace idéntica a la que creó para NewFeaturesPrintTicket.

  • Ninguna de las clases tendrá ningún método que no sean los que heredan de la clase Object.

  • Cada una de las clases tendrá un constructor único que toma un parámetro Stream.Stream será un documento de PrintCapabilities.

  • El constructor DefinedFeaturesPrintCapabilities debe validar que el objeto Stream que se le pasó se ajuste al Print Schema Framework antes de que use Stream para inicializar propiedades.(Una forma fácil de hacerlo es pasar primero Stream al constructor PrintCapabilities.Si el último no produce ninguna excepción, la secuencia es válida.)

  • El constructor NewFeaturesPrintCapabilities debe validar que el objeto Stream que se le pasó se ajuste al espacio de nombres privado antes de que use Stream para inicializar propiedades.

  • Los dos constructores DefinedFeaturesPrintCapabilities y NewFeaturesPrintCapabilities producirán excepciones en el modelo del constructor PrintCapabilities existente.

  • La clase WholePrintCapabilities tendrá las propiedades CommonFeatures, DefinedFeatures y NewFeatures.Los tipos de estas propiedades serán PrintCapabilities, DefinedFeaturesPrintCapabilities y NewFeaturesPrintCapabilties, respectivamente.Cada uno se creará basándose en el modelo de las propiedades de WholePrintTicket.

  • El constructor de la clase WholePrintCapabilities tomará un solo parámetro Stream que representa un documento de PrintCapabilities completo.El constructor debe pasar la entrada Stream completa a los tres constructores de sus propiedades miembro.Puesto que la clase WholePrintCapabilities no tiene ningún método que exporte su configuración en formato XML (como los métodos GetXmlStream y SaveTo de WholePrintTicket), no tiene importancia el hecho de que haya marcado duplicado o triplicado en las tres propiedades.

Para obtener información adicional, vea PrintCapabilities Schema and Document Construction.

Leer y escribir secuencias XML de PrintCapabilities y PrintTicket

El trabajo principal de los constructores y los métodos de las clases PrintTicket y PrintCapabilities existentes y de las clases nuevas creadas anteriormente en la sección Extender las clases PrintCapabilities y PrintTicket es leer, analizar, escribir y, a veces, validar los objetos Stream cuyo contenido sea un documento de PrintTicket o un documento de PrintCapabilities.Debe estar familiarizado con E/S de archivos básica, así como con los métodos de esas clases.Puesto que el contenido de estas secuencias es XML, también se debe familiarizar con la compatibilidad de lectura y escritura de XML que se describe en Opciones de procesamiento XML en .NET Framework.Si la aplicación funciona con documentos de XML Paper Specification (XPS), hay API en los espacios de nombres System.Windows.Xps, System.Windows.Xps.Packaging y System.Windows.Xps.Serialization diseñados para leer y escribir en documentos de la XPS, lo que incluye leer y escribir PrintTickets.Vea también PackageRelationship para obtener información sobre cómo agregar una relación a un PrintTicket en un paquete.

Se pueden encontrar ejemplos completos de un documento de PrintTicket y un documento de PrintCapabilities en PrintTicket Example y PrintCapabilities Document Example.

A continuación, se muestra un ejemplo sencillo de un documento de PrintCapabilities en el que se han pasado por alto todas las características del dispositivo menos una.La característica mostrada es DocumentCollate que es la característica representada por las propiedades PrintCapabilities.CollationCapability y PrintTicket.Collation.

<psf:PrintCapabilities xmlns:psf="https://schemas.microsoft.com/windows/2003/08/printing/printschemaframework" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1">

   <!-- other features omitted --> 
   
   <psf:Feature name="psk:DocumentCollate">
        <psf:Property name="psf:SelectionType">
            <psf:Value xsi:type="xsd:QName">psk:PickOne</psf:Value>
        </psf:Property>
        <psf:Property name="psk:DisplayName">
            <psf:Value xsi:type="xsd:string">Collate Copies</psf:Value>
        </psf:Property>
        <psf:Option name="psk:Collated" constrained="psk:None">
            <psf:Property name="psk:DisplayName">
                <psf:Value xsi:type="xsd:string">Yes</psf:Value>
            </psf:Property>
        </psf:Option>
        <psf:Option name="psk:Uncollated" constrained="psk:None">
            <psf:Property name="psk:DisplayName">
                <psf:Value xsi:type="xsd:string">No</psf:Value>
            </psf:Property>
        </psf:Option>
    </psf:Feature>
                   
   <!-- other features omitted --> 
   
</PrintCapabilities>

Observe que se muestra una lista de todas las opciones posibles de la característica (tanto intercaladas como sin intercalar) y se identifica el estado de cada una (es decir, si se restringe o no).En un documento de PrintCapabilities completo, se identifica el estado de cada opción de cada característica; por tanto, el documento es un tipo de captura de la configuración del dispositivo.

A continuación, se muestra un ejemplo sencillo de un documento de PrintTicket que contiene una única característica.

<psf:PrintTicket xmlns:psf="https://schemas.microsoft.com/windows/2003/08/printing/printschemaframework" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1">
  
  <!-- other features omitted -->
  
  <psf:Feature name="psk:DocumentCollate">
    <psf:Option name="psk:Collated" />
  </psf:Feature>  
    
  <!-- other features omitted -->
  
</PrintTicket>

Observe que la estructura puede ser algo más fácil porque no es necesario que un documento de PrintTicket especifique explícitamente el estado de cada opción.Sólo necesita identificar la opción solicitada.

La sintaxis y la estructura de la característica se definen en DocumentCollate mediante el Print Schema Framework y las Print Schema Public Keywords.Al trabajar con nuevas características, estará trabajando con las características definidas en un espacio de nombres XML privado definido en un esquema suplementario.El fabricante del dispositivo suele proporcionar esta información, mediante una asociación comercial, o lo hace una organización de normalización no lucrativa; pero podría ser el usuario quién lo cree.Use Print Schema Framework y Print Schema Public Keywords existentes para obtener la sintaxis necesaria y buscar modelos en los que pueda basar las definiciones.La propia Microsoft creó un nuevo espacio de nombres para extender el sistema de PrintCapabilities y PrintTicket a su nuevo controlador del Escritor de documentos XPS de Microsoft (MXDW).Para obtener detalles vea Valor de configuración de MXDW.

Si suponemos que una compañía ficticia de Ajax Embosser definió la característica de traducción de BrailleGrade3 de forma que sea similar a como Microsoft definió la característica de intercalación de documentos, podemos ver que las entradas de los documentos de PrintCapabilities y PrintTicket para la característica tendrían el siguiente aspecto.Observe que el espacio de nombres en el que se define la característica se debe declarar en las etiquetas de apertura <PrintCapabilities … > y <PrintTicket … >.

Marcado del documento de PrintCapabilities

<psf:PrintCapabilities xmlns:psf="https://schemas.microsoft.com/windows/2003/08/printing/printschemaframework" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
           xmlns:ajax="http://www.AjaxEmbossers.com/schemas/deluxemodels" version="1">

   <!-- other features omitted --> 
   
   <psf:Feature name="ajax:BrailleGrade3Translation">
        <psf:Property name="psf:SelectionType">
            <psf:Value xsi:type="xsd:QName">psk:PickOne</psf:Value>
        </psf:Property>
        <psf:Property name="psk:DisplayName">
            <psf:Value xsi:type="xsd:string">Braille3 translation</psf:Value>
        </psf:Property>
        <psf:Option name="ajax:Translated" constrained="psk:None">
            <psf:Property name="psk:DisplayName">
                <psf:Value xsi:type="xsd:string">Yes</psf:Value>
            </psf:Property>
        </psf:Option>
        <psf:Option name="ajax:Untranslated" constrained="psk:None">
            <psf:Property name="psk:DisplayName">
                <psf:Value xsi:type="xsd:string">No</psf:Value>
            </psf:Property>
        </psf:Option>
    </psf:Feature>
                   
   <!-- other features omitted --> 
   
</PrintCapabilities>

Marcado del documento de PrintTicket

<psf:PrintTicket xmlns:psf="https://schemas.microsoft.com/windows/2003/08/printing/printschemaframework" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
           xmlns:ajax="http://www.AjaxEmbossers.com/schemas/deluxemodels" version="1">
  
  <!-- other features omitted -->
  
  <psf:Feature name="ajax:BrailleGrade3Translation">
    <psf:Option name="ajax:Translated" />
  </psf:Feature>  
    
  <!-- other features omitted -->
  
</PrintTicket>

Para obtener más información sobre cómo escribir los documentos de PrintTicket que controlen las nuevas características, vea Creating a Device-Specific PrintTicket.Para obtener la documentación completa sobre cómo crear documentos de PrintTicket y PrintCapabilities, vea las secciones PrintCapabilities Schema and Document Construction y PrintTicket Schema and Document Construction de la documentación del esquema de impresión.

Sobrecargar y extender las propiedades y los métodos

Cualquier método de cualquier clase que tenga como parámetro un objeto de la clase PrintTicket o devuelva un objeto PrintTicket y que desee usar con el sistema de características extendidas, se deberá reemplazar mediante un método que use WholePrintTicket en lugar de PrintTicket.De igual forma, cualquier propiedad de tipo PrintTicket que desee utilizar se deberá reemplazar por propiedades de tipo WholePrintTicket.Los mismos puntos se aplican, mutatis mutandis, a PrintCapabilities y WholePrintCapabilities.

Cuando la clase que hospeda el método o la propiedad se pueda heredar, puede derivar una clase y sobrecargar el método o la propiedad que va a usar WholePrintTicket en lugar de PrintTicket.

Si la clase que hospeda dicho método no se puede heredar, deberá extenderla de la forma en la que se extendieron PrintTicket y PrintCapabilities anteriormente: cree una clase que tenga la clase inicial como miembro.A continuación, asigne a los métodos y las propiedades de la clase exterior los mismos nombres que los de los métodos correspondientes que tienen (o devuelven) los parámetros PrintTicket o PrintCapabilities.Normalmente, la clase exterior debe coincidir con la funcionalidad de la clase interior del mismo nombre, pero utilizará los parámetros WholePrintTicket o WholePrintCapabilities en lugar de los parámetros PrintTicket o PrintCapabilities.Además, para las propiedades de la clase interior de tipo PrintTicket o PrintCapabilities, cree una propiedad coincidente del mismo nombre en la clase exterior que usa WholePrintTicket o WholePrintCapabilities.

Probablemente, los métodos más importantes que deberá sobrecargar son las dos versiones de MergeAndValidatePrintTicket. La clase BrailleEmbosser (vea la sección Derivar una nueva clase mediante herencia) necesitará reemplazos que usen los parámetros WholePrintTicket y que agreguen la lógica para validar las solicitudes con nuevas características en el esquema del espacio de nombres privado.Puede sobrecargar los métodos existentes o crear nuevos métodos denominados MergeAndValidateWholePrintTicket.

Dos métodos que devuelven PrintTicket son ConvertDevModeToPrintTicket y Clone.En .NET Framework hay otros 15 métodos, sin contar las sobrecargas, que toman un parámetro PrintTicket y 19 propiedades de tipo PrintTicket.Probablemente, cualquier aplicación especificada usará sólo unos pocos; por tanto, la carga de trabajo no será tan grande como podrían sugerir esos números.Afortunadamente, el único método que devuelve un objeto PrintCapabilities es GetPrintCapabilities y no existen propiedades con tipo PrintCapabilities.

Expandir las características definidas por el esquema

Las características totalmente nuevas no son la única situación que podría requerir una extensión de Print Schema.Además, es posible que un dispositivo proporcione opciones nuevas y sin definir a una característica conocida y definida.Puesto que se debe usar un espacio de nombres privado para las nuevas opciones sin definir de la misma forma que se debe utilizar para una característica totalmente nueva, es probable que sea más fácil tratar tales características extendidas como lo haría con características totalmente nuevas (pero use los nombres definidos por el esquema para la característica y los de sus opciones que ya estén definidos): hospédelos en NewFeaturesPrintTicket y NewFeaturesPrintCapabilities.La información necesaria para describir todos los detalles necesarios para implementar este tipo de extensión de esquema, sobrepasa los límites de este artículo, pero tenga en cuenta que el trabajo de concatenación realizado por los métodos WholePrintTicket.GetXmlStream y WholePrintTicket.SaveAs tendría que convertirse en algo más complicado.

Extender el espacio de nombres System.Printing.IndexedProperties

Si desea aprovechar las API del espacio de nombres System.Printing.IndexedProperties, quizá deba derivar una nueva clase de PrintProperty.Debería hacerlo si una propiedad que ha creado para la clase derivada de PrintQueue tiene un tipo que no está representado por ninguna de las clases existentes de System.Printing.IndexedProperties.Para obtener ejemplos sobre lo que se puede hacer con el espacio de nombres System.Printing.IndexedProperties, vea Cómo: Clonar una impresora y Cómo: Obtener propiedades de un objeto de sistema de impresión sin reflexión.

Esto no se aplica necesariamente a nuestro ejemplo anterior, ya que la única propiedad que agregamos a nuestra clase BrailleEmbosser es IsBraile3Enabled, que es Boolean.Ya hay una clase System.Printing.IndexedProperties.PrintBooleanProperty.

Vea también

Tareas

Cómo: Clonar una impresora

Cómo: Obtener propiedades de un objeto de sistema de impresión sin reflexión

Referencia

System.Printing

System.Printing.IndexedProperties

System.Printing.Interop

System.Windows.Xps

System.Windows.Xps.Packaging

System.Windows.Xps.Serialization

GetPrintCapabilities

PackageRelationship

PrintCapabilities

PrintQueue

PrintSystemObject

PrintTicket

MXDW Configuration Settings

Conceptos

Opciones de procesamiento XML en .NET Framework

Documentos en WPF

Información general sobre impresión

Otros recursos

Esquema de impresión

Marco de trabajo del esquema de impresión

Crear un elemento PrintTicket específico de dispositivo

Tecnologías relacionadas con el esquema de impresión

Esquema PrintTicket y construcción de documentos

Ejemplo de PrintTicket

Ejemplo de documento PrintCapabilities

Esquema PrintCapabilities y construcción de documentos

Palabras clave públicas del esquema de impresión

Microsoft XPS Document Writer