Compartir vía


Información general sobre impresión

Con Microsoft .NET Framework, los desarrolladores de aplicaciones que usan Windows Presentation Foundation (WPF) tienen un nuevo y amplio conjunto de API de administración de impresión y del sistema de impresión. Con Windows Vista, algunas de estas mejoras del sistema de impresión también están disponibles para los desarrolladores que crean aplicaciones de Windows Forms, así como para los que usan código no administrado. El núcleo de esta nueva funcionalidad es el formato de archivo nuevo XML Paper Specification (XPS) y la ruta de impresión XPS.

En este tema se incluyen las siguientes secciones.

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 (OPC) 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.

Se explican varias técnicas de impresión de contenido basado en XPS con WPF en Imprimir archivos XPS mediante programación. Estos ejemplos le resultarán útil para comprender el contenido de este tema. (Los desarrolladores de código no administrado deben ver la documentación de la función MXDC_ESCAPE. Los desarrolladores de Windows Forms deben usar la API en el espacio de nombres System.Drawing.Printing que no admite la ruta de acceso de impresión XPS completa, pero admite una ruta de impresión híbrida de GDI a XPS. Consulte Arquitectura de ruta de acceso de impresión a continuación).

Ruta de impresión XPS

La ruta de impresión XML Paper Specification (XPS) es una nueva característica de Windows que redefine la administración de la impresión en aplicaciones Windows. Dado que XPS puede reemplazar un lenguaje de presentación de documento (por ejemplo, RTF), un formato de administrador de trabajos en cola de impresión (como WMF) y un lenguaje de descripción de página (por ejemplo, Postscript o PCL), la nueva ruta de impresión mantiene el formato XPS desde la publicación en la aplicación hasta el procesamiento final en el dispositivo o controlador de impresora.

La ruta de impresión XPS se basa en el modelo de controlador de impresora (XPSDrv), que proporciona varias ventajas a los desarrolladores, como impresión "lo que se ve es lo que se imprime" (WYSIWYG), soporte de color mejorado y rendimiento de impresión considerablemente superior. (Para obtener más información sobre XPSDrv, consulte el kit de documentación de controladores de Windows).

La operación del administrador de trabajos en cola de impresión para documentos XPS es esencialmente la misma que en versiones anteriores de Windows. Sin embargo, se ha mejorado para admitir la ruta de impresión de XPS, que se suma a la ruta de impresión GDI actual. La nueva ruta de impresión usa de forma nativa un archivo de cola de impresión XPS. Aunque los controladores de impresora de modo de usuario escritos para versiones anteriores de Windows continuarán funcionando, es necesario un controlador de impresora XPS (XPSDrv) a fin de poder usar la ruta de impresión XPS.

Las ventajas de la ruta de impresión XPS son significativas e incluyen:

  • Compatibilidad con impresión WYSIWYG.

  • Soporte nativo de perfiles de color avanzados, que incluyen 32 bits por canal (bpc), CMYK, colores con nombre, tintas n y soporte nativo de transparencia y degradados.

  • Mayor rendimiento de impresión para las aplicaciones basadas en .NET Framework y Win32.

  • Formato XPS estándar del sector.

Para los escenarios básicos de impresión se dispone de una sencilla e intuitiva API con un único punto de entrada para interfaz de usuario, configuración y envío de trabajos. Para los escenarios avanzados se agrega soporte adicional para la personalización de la UI, impresión sincrónica o asincrónica y capacidades de impresión por lotes. Ambas opciones ofrecen soporte de impresión en modo de confianza plena o parcial.

XPS se diseñó teniendo en cuenta la extensibilidad. Con el marco de extensibilidad se pueden agregar características y capacidades a XPS de manera modular. Las características de extensibilidad incluyen:

  • Esquema de impresión. El esquema público se actualiza periódicamente y permite la extensión rápida de las capacidades del dispositivo. (Consulte más abajo PrintTicket y PrintCapabilities).

  • Canalización de filtros extensible. La canalización de filtros del controlador de impresora XPS (XPSDrv) se diseñó para habilitar la impresión directa y escalable de documentos XPS. Para obtener más información, consulte Controladores de impresora XPSDrv.

Aunque las aplicaciones Win32 y .NET Framework admiten XPS, las aplicaciones de Win32 y Windows Forms usan una conversión GDI a XPS para crear contenido con formato XPS para el controlador de impresora XPS (XPSDrv). Estas aplicaciones no necesitan usar la ruta de impresión XPS y pueden seguir utilizando la impresión basada en Enhanced Metafile (EMF). Sin embargo, la mayoría de características y mejoras de XPS solo están disponibles para las aplicaciones destinadas a la ruta de impresión XPS.

Para habilitar el uso de las impresoras basadas en XPSDrv por parte de aplicaciones de Win32 y Windows Forms, el controlador de impresora XPS (XPSDrv) admite la conversión de formato GDI a XPS. El modelo XPSDrv también proporciona un convertidor de formato XPS a GDI para que las aplicaciones de Win32 puedan imprimir documentos XPS. Para aplicaciones de WPF, la conversión de formato XPS a GDI se realiza de forma automática mediante los métodos Write y WriteAsync de la clase XpsDocumentWriter, siempre que la cola de impresión de destino de la operación de escritura no tenga un controlador de XPSDrv. (Las aplicaciones de Windows Forms no pueden imprimir documentos XPS).

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 de software y hardware.

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

Impresión XPS básica

WPF define una API básica y una avanzada. Para aquellas aplicaciones que no requieren una amplia personalización de impresión o acceso a todo el conjunto de características de XPS, hay disponible soporte básico de impresión. El soporte básico de impresión se expone mediante un control de diálogo de impresión que requiere una configuración mínima y presenta una UI reconocible. Muchas de las características de XPS están disponibles mediante este modelo simplificado de impresión.

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 la creación de instancias y el uso del control, consulte Invocar un cuadro de diálogo de impresión.

Impresión XPS avanzada

Para tener acceso a un conjunto completo de características de XPS, debe usarse la API de impresión avanzada. A continuación se describen con más detalle varias API pertinentes. Para obtener una lista completa de las API de ruta de impresión XPS, consulte las referencias de 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 tipos de objetos son estructuras con formato XML de características orientadas a la impresión, como la intercalación, impresión a doble cara, grapado, etc. Estas estructuras se definen mediante el esquema de impresión. 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 muestra cómo consultar las PrintCapabilities de una impresora y crear un PrintTicket mediante código.

// ---------------------- GetPrintTicketFromPrinter -----------------------
/// <summary>
///   Returns a PrintTicket based on the current default printer.</summary>
/// <returns>
///   A PrintTicket for the current local default printer.</returns>
PrintTicket^ GetPrintTicketFromPrinter () 
{
   PrintQueue^ printQueue = nullptr;

   LocalPrintServer^ localPrintServer = gcnew LocalPrintServer();

   // Retrieving collection of local printer on user machine
   PrintQueueCollection^ localPrinterCollection = localPrintServer->GetPrintQueues();

   System::Collections::IEnumerator^ localPrinterEnumerator = localPrinterCollection->GetEnumerator();

   if (localPrinterEnumerator->MoveNext())
   {
      // Get PrintQueue from first available printer
      printQueue = ((PrintQueue^)localPrinterEnumerator->Current);
   } else
   {
      return nullptr;
   }
   // Get default PrintTicket from printer
   PrintTicket^ printTicket = printQueue->DefaultPrintTicket;

   PrintCapabilities^ printCapabilites = printQueue->GetPrintCapabilities();

   // Modify PrintTicket
   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;
   }
   return printTicket;
};// end:GetPrintTicketFromPrinter()
// ---------------------- GetPrintTicketFromPrinter -----------------------
/// <summary>
///   Returns a PrintTicket based on the current default printer.</summary>
/// <returns>
///   A PrintTicket for the current local default printer.</returns>
private PrintTicket GetPrintTicketFromPrinter()
{
    PrintQueue printQueue = null;

    LocalPrintServer localPrintServer = new LocalPrintServer();

    // Retrieving collection of local printer on user machine
    PrintQueueCollection localPrinterCollection =
        localPrintServer.GetPrintQueues();

    System.Collections.IEnumerator localPrinterEnumerator =
        localPrinterCollection.GetEnumerator();

    if (localPrinterEnumerator.MoveNext())
    {
        // Get PrintQueue from first available printer
        printQueue = (PrintQueue)localPrinterEnumerator.Current;
    }
    else
    {
        // No printer exist, return null PrintTicket
        return null;
    }

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

    PrintCapabilities printCapabilites = printQueue.GetPrintCapabilities();

    // Modify PrintTicket
    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;
    }

    return printTicket;
}// end:GetPrintTicketFromPrinter()
' ---------------------- GetPrintTicketFromPrinter -----------------------
''' <summary>
'''   Returns a PrintTicket based on the current default printer.</summary>
''' <returns>
'''   A PrintTicket for the current local default printer.</returns>
Private Function GetPrintTicketFromPrinter() As PrintTicket
    Dim printQueue As PrintQueue = Nothing

    Dim localPrintServer As New LocalPrintServer()

    ' Retrieving collection of local printer on user machine
    Dim localPrinterCollection As PrintQueueCollection = localPrintServer.GetPrintQueues()

    Dim localPrinterEnumerator As System.Collections.IEnumerator = localPrinterCollection.GetEnumerator()

    If localPrinterEnumerator.MoveNext() Then
        ' Get PrintQueue from first available printer
        printQueue = CType(localPrinterEnumerator.Current, PrintQueue)
    Else
        ' No printer exist, return null PrintTicket
        Return Nothing
    End If

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

    Dim printCapabilites As PrintCapabilities = printQueue.GetPrintCapabilities()

    ' Modify PrintTicket
    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

    Return printTicket
End Function ' end:GetPrintTicketFromPrinter()

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 él. Juntas, estas API permiten la administración avanzada de los trabajos de impresión de un servidor. Un PrintServer, o una de sus clases derivadas, se usa para administrar un PrintQueue. El método AddJob se usa para insertar un nuevo trabajo de impresión en la cola.

En el ejemplo siguiente se muestra cómo crear un LocalPrintServer y tener acceso a su PrintQueue predeterminado mediante código.

// -------------------- GetPrintXpsDocumentWriter() -------------------
/// <summary>
///   Returns an XpsDocumentWriter for the default print queue.</summary>
/// <returns>
///   An XpsDocumentWriter for the default print queue.</returns>
private XpsDocumentWriter GetPrintXpsDocumentWriter()
{
    // Create a local print server
    LocalPrintServer ps = new LocalPrintServer();

    // Get the default print queue
    PrintQueue pq = ps.DefaultPrintQueue;

    // Get an XpsDocumentWriter for the default print queue
    XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq);
    return xpsdw;
}// end:GetPrintXpsDocumentWriter()
' -------------------- GetPrintXpsDocumentWriter() -------------------
''' <summary>
'''   Returns an XpsDocumentWriter for the default print queue.</summary>
''' <returns>
'''   An XpsDocumentWriter for the default print queue.</returns>
Private Function GetPrintXpsDocumentWriter() As XpsDocumentWriter
    ' Create a local print server
    Dim ps As New LocalPrintServer()

    ' Get the default print queue
    Dim pq As PrintQueue = ps.DefaultPrintQueue

    ' Get an XpsDocumentWriter for the default print queue
    Dim xpsdw As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(pq)
    Return xpsdw
End Function ' end:GetPrintXpsDocumentWriter()

XpsDocumentWriter

Un XpsDocumentWriter, con sus métodos Write y WriteAsync, se usa para escribir documentos XPS en un PrintQueue. Por ejemplo, el método Write(FixedPage, PrintTicket) se usa para generar un documento XPS y PrintTicket sincrónicamente. El método WriteAsync(FixedDocument, PrintTicket) se usa para generar un documento XPS y PrintTicket asincrónicamente.

En el siguiente ejemplo se muestra cómo crear un XpsDocumentWriter mediante código.

// -------------------- GetPrintXpsDocumentWriter() -------------------
/// <summary>
///   Returns an XpsDocumentWriter for the default print queue.</summary>
/// <returns>
///   An XpsDocumentWriter for the default print queue.</returns>
private XpsDocumentWriter GetPrintXpsDocumentWriter()
{
    // Create a local print server
    LocalPrintServer ps = new LocalPrintServer();

    // Get the default print queue
    PrintQueue pq = ps.DefaultPrintQueue;

    // Get an XpsDocumentWriter for the default print queue
    XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq);
    return xpsdw;
}// end:GetPrintXpsDocumentWriter()
' -------------------- GetPrintXpsDocumentWriter() -------------------
''' <summary>
'''   Returns an XpsDocumentWriter for the default print queue.</summary>
''' <returns>
'''   An XpsDocumentWriter for the default print queue.</returns>
Private Function GetPrintXpsDocumentWriter() As XpsDocumentWriter
    ' Create a local print server
    Dim ps As New LocalPrintServer()

    ' Get the default print queue
    Dim pq As PrintQueue = ps.DefaultPrintQueue

    ' Get an XpsDocumentWriter for the default print queue
    Dim xpsdw As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(pq)
    Return xpsdw
End Function ' end:GetPrintXpsDocumentWriter()

Los métodos AddJob también proporcionan formas de imprimir. Consulte Imprimir archivos XPS mediante programación. para obtener más detalles.

Ruta de impresión GDI

Mientras las aplicaciones de WPF admiten de forma nativa la ruta de impresión XPS, las aplicaciones de Win32 y Windows Forms también pueden sacar partido de algunas características de XPS. El controlador de impresora XPS (XPSDrv) puede convertir una salida basada en GDI a formato XPS. Para escenarios avanzados, se admite la conversión personalizada de contenido mediante el convertidor de documentos XPS de Microsoft (MXDC). De forma similar, las aplicaciones de WPF también pueden generar una salida a la ruta de impresión GDI mediante la llamada a uno de los métodos Write o WriteAsync de la clase XpsDocumentWriter y la designación de una impresora que no sea XPSDrv como la cola de impresión de destino.

Para las aplicaciones que no requieren funcionalidad o soporte XPS, la ruta de impresión GDI actual se mantiene sin cambios.

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. 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. Mediante 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.

EMF es un formato cerrado que representa la salida de la aplicación como una serie de llamadas a GDI para la presentación de servicios. A diferencia de EMF, el formato de la cola XPS representa el documento real sin necesidad de más interpretación al generar una salida a un controlador de impresora basado en XPS (XPSDrv). Los controladores pueden trabajar directamente con los datos en el 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 tamaño de los archivos de cola de impresión suele reducirse cuando se usan documentos XPS cuyo destino es un controlador de impresora XPS (XPSDrv) en comparación a sus equivalentes EMF; sin embargo, hay excepciones:

  • Un gráfico vectorial muy complejo, con varias capas o escrito de forma ineficaz puede ser mayor que una versión de mapa de bits del mismo gráfico.

  • Para la presentación en pantalla, los archivos XPS insertan fuentes del dispositivo y del equipo, mientras que los archivos de cola de impresión GDI no insertan fuentes de dispositivo. Sin embargo, ambos tipos de fuentes se incluyen en un subconjunto (ver abajo) y los controladores de impresora pueden quitar las fuentes de dispositivo antes de transmitir el archivo a la impresora.

La reducción del tamaño de cola de impresión se consigue a través de varios mecanismos:

  • Creación de un subconjunto de fuentes. Solo los caracteres usados en el documento real se almacenan en el archivo XPS.

  • Compatibilidad con gráficos avanzados. El soporte nativo para transparencia y primitivas de degradado evita la rasterización del contenido en el documento XPS.

  • Identificación de recursos comunes. Los recursos que se usan varias veces (como una imagen que representa un logotipo corporativo) se tratan como recursos compartidos y se cargan solamente una vez.

  • Compresión ZIP. Todos los documentos XPS usan la compresión ZIP.

Vea también