Información general sobre la impresión de documentos (WPF .NET)

Con Microsoft .NET los desarrolladores de aplicaciones que usan Windows Presentation Foundation (WPF) tienen un amplio conjunto de API de administración de impresión y del sistema de impresión. El núcleo de esta funcionalidad es el formato de archivo XML Paper Specification (XPS) y la ruta de impresión XPS.

Sobre XPS

XPS es un formato de documento electrónico, un formato de archivo de cola de impresión y un lenguaje de descripción de página. Se trata de un formato de documento abierto que usa XML, Convenciones de empaquetado abierto y otros estándares del sector para crear documentos multiplataforma. XPS simplifica el proceso de creación, uso compartido, impresión, visualización y archivado de documentos digitales. Para obtener más información sobre XPS, consulte Documentos XPS.

Ruta de impresión XPS

La ruta de impresión de XPS es una nueva característica de Windows que redefine la administración de la impresión en aplicaciones Windows. La ruta de impresión XPS puede reemplazar:

  • Los idiomas de presentación de documentos, como formato de texto enriquecido o formato de documento portátil.
  • Los formatos de administrador de trabajos de impresión, como Windows Metafile o Enhanced Metafile (EMF).
  • Los lenguajes de descripción de página, como Printer Command Language o PostScript.

Como resultado, la ruta de impresión XPS mantiene el formato XPS de la publicación de la aplicación hasta el procesamiento final en el controlador o dispositivo de la impresora.

El administrador de trabajos de impresión para documentos XPS admite tanto la ruta de impresión XPS como la ruta de impresión GDI. La ruta de impresión XPS consume de forma nativa un archivo de cola XPS y requiere un controlador de impresora XPS. La ruta de impresión XPS se basa en el modelo del controlador de impresora XPS (XPSDrv).

Las ventajas de la ruta de impresión XPS incluyen:

  • Compatibilidad con impresión WYSIWYG.
  • Compatibilidad nativa con perfiles de color avanzados, como 32 bits por canal, el modelo de color CMYK, colores con nombre, n-inks y transparencias y degradados.
  • Rendimiento de impresión mejorado: las características y mejoras de XPS solo están disponibles para las aplicaciones que tienen como destino la ruta de impresión XPS.
  • Formato XPS estándar del sector.

En escenarios de impresión básicos hay disponible una API sencilla e intuitiva con una interfaz de usuario estándar para la configuración de impresión y el envío de trabajos. Para los escenarios avanzados, la API admite la personalización de la interfaz de usuario o que no haya interfaz de usuario en absoluto, impresión sincrónica o asincrónica y capacidades de impresión por lotes. Las opciones simples y avanzadas están admitidas en la impresión en modos de confianza total o parcial.

XPS se ha diseñado teniendo en cuenta la extensibilidad, por lo que las características y capacidades se pueden agregar a XPS de forma modular. Las características de extensibilidad incluyen:

  • Un esquema de impresión que admite la extensión rápida de las funcionalidades del dispositivo. La parte pública del esquema se actualiza periódicamente para agregar funcionalidades de dispositivo deseadas. Para obtener más información, consulte la Arquitectura extensible.
  • Una canalización de filtro extensible que los controladores XPSDrv usan para admitir, tanto la impresión directa, como escalable de documentos XPS. Para obtener más información, consulte Controladores de impresora XPSDrv.

Las aplicaciones WPF admiten de forma nativa la ruta de impresión XPS y pueden usar las API de impresión XPS para imprimir directamente en el controlador XPSDrv. Si la cola de impresión de destino de la operación de escritura no tiene un controlador XPSDrv, los métodos Write y WriteAsync de la clase XpsDocumentWriter convertirán automáticamente el contenido del formato XPS a GDI para usar la ruta de impresión de GDI.

En la siguiente ilustración se muestra el subsistema de impresión y se definen las partes proporcionadas por Microsoft y las partes definidas por proveedores independientes de software y hardware.

Captura de pantalla que muestra el sistema de impresión XPS.

Impresión XPS básica

WPF tiene una API de impresión que admite características de impresión básicas y avanzadas. Para aquellas aplicaciones que no requieren una amplia personalización de impresión o acceso a todo el conjunto de características de XPS, un soporte básico de impresión puede ser suficiente. El soporte básico de impresión se proporciona a través de un control PrintDialog que requiere una configuración mínima, tiene una interfaz de usuario conocida y admite muchas características XPS.

PrintDialog

El control System.Windows.Controls.PrintDialog proporciona un único punto de entrada para la interfaz de usuario, la configuración y el envío de trabajos XPS. Para obtener información sobre cómo crear instancias y usar el control, consulte Cómo mostrar un cuadro de diálogo de impresión.

Impresión XPS avanzada

Para acceder al conjunto completo de características XPS, use la API de impresión avanzada. En esta sección se describen varias API relevantes, como PrintTicket, PrintCapabilities, PrintServer, PrintQueue y XpsDocumentWriter. Para obtener una lista completa de las API de ruta de impresión XPS, consulte los espacios de nombres System.Windows.Xps y System.Printing.

PrintTicket y PrintCapabilities

Las clases PrintTicket y PrintCapabilities constituyen la base de las características avanzadas de XPS. Ambos objetos contienen estructuras con formato XML de características orientadas a impresión definidas por el esquema de impresión. Las características incluyen impresión a doble cara, intercalación, impresión en dos lados y acoplamiento. Un PrintTicket indica a una impresora cómo procesar un trabajo de impresión. La clase PrintCapabilities define las capacidades de una impresora. Mediante una consulta de las capacidades de una impresora, se puede crear un PrintTicket que aproveche al máximo las características compatibles de una impresora. De forma similar, se pueden evitar las características no compatibles.

En el ejemplo siguiente se consulta el PrintCapabilities de una impresora y se crea un PrintTicket mediante código.

/// <summary>
/// Returns a print ticket, which is a set of instructions telling a printer how
/// to set its various features, such as duplexing, collating, and stapling.
/// </summary>
/// <param name="printQueue">The print queue to print to.</param>
/// <returns>A print ticket.</returns>
public static PrintTicket GetPrintTicket(PrintQueue printQueue)
{
    PrintCapabilities printCapabilites = printQueue.GetPrintCapabilities();

    // Get a default print ticket from printer.
    PrintTicket printTicket = printQueue.DefaultPrintTicket;

    // Modify the print ticket.
    if (printCapabilites.CollationCapability.Contains(Collation.Collated))
        printTicket.Collation = Collation.Collated;
    if (printCapabilites.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge))
        printTicket.Duplexing = Duplexing.TwoSidedLongEdge;
    if (printCapabilites.StaplingCapability.Contains(Stapling.StapleDualLeft))
        printTicket.Stapling = Stapling.StapleDualLeft;

    // Returns a print ticket, which is a set of instructions telling a printer how
    // to set its various features, such as duplexing, collating, and stapling.
    return printTicket;
}
''' <summary>
''' Returns a print ticket, which is a set of instructions telling a printer how
''' to set its various features, such as duplexing, collating, and stapling.
''' </summary>
''' <param name="printQueue">The print queue to print to.</param>
''' <returns>A print ticket.</returns>
Public Shared Function GetPrintTicket(printQueue As PrintQueue) As PrintTicket

    Dim printCapabilites As PrintCapabilities = printQueue.GetPrintCapabilities()

    ' Get a default print ticket from printer.
    Dim printTicket As PrintTicket = printQueue.DefaultPrintTicket

    ' Modify the print ticket.
    If printCapabilites.CollationCapability.Contains(Collation.Collated) Then
        printTicket.Collation = Collation.Collated
    End If
    If printCapabilites.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge) Then
        printTicket.Duplexing = Duplexing.TwoSidedLongEdge
    End If
    If printCapabilites.StaplingCapability.Contains(Stapling.StapleDualLeft) Then
        printTicket.Stapling = Stapling.StapleDualLeft
    End If

    ' Returns a print ticket, which is a set of instructions telling a printer how
    ' to set its various features, such as duplexing, collating, and stapling.
    Return printTicket

End Function

PrintServer y PrintQueue

La clase PrintServer representa un servidor de impresión de red y la clase PrintQueue representa una impresora y la cola de trabajos de salida asociados a ella. Juntas, estas API admiten la administración avanzada de los trabajos de impresión para un servidor. Un PrintServer, o una de sus clases derivadas, se usa para administrar un PrintQueue.

En el ejemplo siguiente se crea un LocalPrintServer y se accede al equipo local PrintQueueCollection mediante código.

/// <summary>
/// Return a collection of print queues, which individually hold the features or states
/// of a printer as well as common properties for all print queues.
/// </summary>
/// <returns>A collection of print queues.</returns>
public static PrintQueueCollection GetPrintQueues()
{
    // Create a LocalPrintServer instance, which represents 
    // the print server for the local computer.
    LocalPrintServer localPrintServer = new();

    // Get the default print queue on the local computer.
    //PrintQueue printQueue = localPrintServer.DefaultPrintQueue;

    // Get all print queues on the local computer.
    PrintQueueCollection printQueueCollection = localPrintServer.GetPrintQueues();

    // Return a collection of print queues, which individually hold the features or states
    // of a printer as well as common properties for all print queues.
    return printQueueCollection;
}
''' <summary>
''' Return a collection of print queues, which individually hold the features or states
''' of a printer as well as common properties for all print queues.
''' </summary>
''' <returns>A collection of print queues.</returns>
Public Shared Function GetPrintQueues() As PrintQueueCollection

    ' Create a LocalPrintServer instance, which represents 
    ' the print server for the local computer.
    Dim localPrintServer As LocalPrintServer = New LocalPrintServer()

    ' Get the default print queue on the local computer.
    'Dim  printQueue As PrintQueue = localPrintServer.DefaultPrintQueue

    ' Get all print queues on the local computer.
    Dim printQueueCollection As PrintQueueCollection = localPrintServer.GetPrintQueues()

    ' Return a collection of print queues, which individually hold the features or states
    ' of a printer as well as common properties for all print queues.
    Return printQueueCollection

End Function

XpsDocumentWriter

XpsDocumentWriter, con sus varios métodos Write y WriteAsync, se usa para agregar documentos XPS en un PrintQueue. Por ejemplo, el método Write(FixedDocumentSequence, PrintTicket) se usa para agregar de forma sincrónica un documento XPS con un vale de impresión a una cola. El método WriteAsync(FixedDocumentSequence, PrintTicket) se usa para agregar de forma asincrónica un documento XPS con un vale de impresión a una cola.

En el ejemplo siguiente se crea un XpsDocumentWriter y se agregan documentos XPS, tanto de forma sincrónica como asincrónica, a un PrintQueue, mediante código.

/// <summary>
/// Asynchronously, add the XPS document together with a print ticket to the print queue.
/// </summary>
/// <param name="xpsFilePath">Path to source XPS file.</param>
/// <param name="printQueue">The print queue to print to.</param>
/// <param name="printTicket">The print ticket for the selected print queue.</param>
public static void PrintXpsDocumentAsync(string xpsFilePath, PrintQueue printQueue, PrintTicket printTicket)
{
    // Create an XpsDocumentWriter object for the print queue.
    XpsDocumentWriter xpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue);

    // Open the selected document.
    XpsDocument xpsDocument = new(xpsFilePath, FileAccess.Read);

    // Get a fixed document sequence for the selected document.
    FixedDocumentSequence fixedDocSeq = xpsDocument.GetFixedDocumentSequence();

    // Asynchronously, add the XPS document together with a print ticket to the print queue.
    xpsDocumentWriter.WriteAsync(fixedDocSeq, printTicket);
}

/// <summary>
/// Synchronously, add the XPS document together with a print ticket to the print queue.
/// </summary>
/// <param name="xpsFilePath">Path to source XPS file.</param>
/// <param name="printQueue">The print queue to print to.</param>
/// <param name="printTicket">The print ticket for the selected print queue.</param>
public static void PrintXpsDocument(string xpsFilePath, PrintQueue printQueue, PrintTicket printTicket)
{
    // Create an XpsDocumentWriter object for the print queue.
    XpsDocumentWriter xpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue);

    // Open the selected document.
    XpsDocument xpsDocument = new(xpsFilePath, FileAccess.Read);

    // Get a fixed document sequence for the selected document.
    FixedDocumentSequence fixedDocSeq = xpsDocument.GetFixedDocumentSequence();

    // Synchronously, add the XPS document together with a print ticket to the print queue.
    xpsDocumentWriter.Write(fixedDocSeq, printTicket);
}
''' <summary>
''' Asynchronously, add the XPS document together with a print ticket to the print queue.
''' </summary>
''' <param name="xpsFilePath">Path to source XPS file.</param>
''' <param name="printQueue">The print queue to print to.</param>
''' <param name="printTicket">The print ticket for the selected print queue.</param>
Public Shared Sub PrintXpsDocumentAsync(xpsFilePath As String, printQueue As PrintQueue, printTicket As PrintTicket)

    ' Create an XpsDocumentWriter object for the print queue.
    Dim xpsDocumentWriter As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue)

    ' Open the selected document.
    Dim xpsDocument As XpsDocument = New XpsDocument(xpsFilePath, FileAccess.Read)

    ' Get a fixed document sequence for the selected document.
    Dim fixedDocSeq As FixedDocumentSequence = xpsDocument.GetFixedDocumentSequence()

    ' Asynchronously, add the XPS document together with a print ticket to the print queue.
    xpsDocumentWriter.WriteAsync(fixedDocSeq, printTicket)

End Sub

''' <summary>
''' Synchronously, add the XPS document together with a print ticket to the print queue.
''' </summary>
''' <param name="xpsFilePath">Path to source XPS file.</param>
''' <param name="printQueue">The print queue to print to.</param>
''' <param name="printTicket">The print ticket for the selected print queue.</param>
Public Shared Sub PrintXpsDocument(xpsFilePath As String, printQueue As PrintQueue, printTicket As PrintTicket)

    ' Create an XpsDocumentWriter object for the print queue.
    Dim xpsDocumentWriter As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue)

    ' Open the selected document.
    Dim xpsDocument As XpsDocument = New XpsDocument(xpsFilePath, FileAccess.Read)

    ' Get a fixed document sequence for the selected document.
    Dim fixedDocSeq As FixedDocumentSequence = xpsDocument.GetFixedDocumentSequence()

    ' Synchronously, add the XPS document together with a print ticket to the print queue.
    xpsDocumentWriter.Write(fixedDocSeq, printTicket)

End Sub

ruta de acceso de impresión de GDI

Aunque las aplicaciones WPF admiten de forma nativa la ruta de impresión XPS, también pueden generar una salida a la ruta de impresión GDI llamando a uno de los métodos Write o WriteAsync de la clase XpsDocumentWriter y seleccionando la cola de impresión para una impresora que no sea XpsDrv.

Para las aplicaciones que no requieren funcionalidad o soporte XPS, la ruta de impresión GDI actual se mantiene sin cambios. Para obtener más información sobre la ruta de impresión GDI y las distintas opciones de conversión XPS, consulte Convertidor de documentos XPS de Microsoft (MXDC) y Controladores de impresora XPSDrv.

Modelo de controlador XPSDrv

La ruta de impresión XPS mejora la eficacia del administrador de trabajos en cola ya que usa XPS como el formato nativo del administrador de trabajos de impresión cuando se imprime en un controlador o una impresora habilitados para XPS. A diferencia de EMF, que representa la salida de la aplicación como una serie de llamadas a GDI para los servicios de representación, el formato de cola XPS representa el documento. Por lo tanto, cuando los archivos de cola XPS se envían a un controlador de impresora basado en XPS, no requieren una interpretación adicional, ya que los controladores funcionan directamente en los datos en ese formato. Esta capacidad elimina las conversiones de espacio de color y datos que son necesarias cuando se usan archivos EMF y controladores de impresión basados en GDI.

El proceso simplificado de administración de trabajos en cola elimina la necesidad de generar un archivo de cola intermedio, como es el archivo de datos EMF, antes de poner en cola el documento. Gracias a tamaños de archivo de cola más pequeños, la ruta de impresión XPS puede reducir el tráfico de red y mejorar el rendimiento de impresión. En comparación con sus equivalentes EMF, los tamaños de archivo de cola XPS se reducen normalmente al usar la ruta de impresión XPS. La reducción del tamaño del archivo de cola se realiza mediante varios mecanismos:

  • Subconfiguración de fuente, que solo almacena los caracteres usados en un documento en el archivo XPS.
  • Compatibilidad con gráficos avanzados, que admite de forma nativa primitivos de transparencia y degradado para evitar la rasterización del contenido XPS.
  • Identificación de recursos comunes, como una imagen de un logotipo corporativo que se usa varias veces en un documento. Los recursos comunes se tratan como recursos compartidos y solo se cargan una vez.
  • Compresión ZIP, que se usa en todos los documentos XPS.

Es posible que el tamaño del archivo de cola XPS no se reduzca si un gráfico vectorial es muy complejo, multicapa o está escrito ineficazmente. A diferencia de los archivos de cola GDI, los archivos XPS insertan fuentes de dispositivo y fuentes basadas en equipos con fines de visualización de pantalla, aunque ambos tipos de fuentes son subconjuntos y los controladores de impresora pueden quitar fuentes del dispositivo antes de transmitir el archivo a la impresora.

Sugerencia

También puede imprimir archivos XPS mediante métodos PrintQueue.AddJob. Para obtener más información, consulte Cómo imprimir archivos XPS.

Vea también