Información general sobre impresión
Con Microsoft .NET Framework, los programadores de aplicaciones que utilicen Windows Presentation Foundation (WPF) disponen de un nuevo conjunto enriquecido de APIs de impresión y administración del sistema de impresión. Con Windows Vista, algunas de estas mejoras del sistema de impresión están también disponibles para los programadores que creen aplicaciones Windows Forms y los programadores que utilicen código no administrado. En el núcleo de esta nueva funcionalidad está el nuevo formato de archivo XML Paper Specification (XPS) y la ruta de impresión XPS.
Este tema contiene las secciones siguientes.
Acerca de XPS
Ruta de impresión XPS
Ruta de impresión GDI
Modelo de controlador de XPSDrv
Temas relacionados
Acerca de XPS
XPS es un formato de documento electrónico, un formato de archivo de cola y un lenguaje de descripción de páginas. Es un formato de documento abierto que utiliza XML, Open Packaging Conventions (OPC) y otros estándares del sector para crear documentos multiplataforma. XPS simplifica el proceso mediante el cual los documentos digitales se crean, se comparten, se ven y se almacenan. Para obtener información adicional sobre XPS, vea el sitio web de XPS.
En Cómo: Imprimir mediante programación archivos XPS se muestran varias técnicas de impresión de contenido basadas en XPS que utilizan WPF. Quizá le resulte útil consultar como referencia estos ejemplos mientras revisa el contenido de este tema. (Es recomendable que los desarrolladores de código no administrado consulten la ayuda de escape de impresora de convertidor de documentos XPS de Microsoft. Los desarrolladores de Windows Forms deben usar la API del espacio de nombres System.Drawing.Printing, que no admite la ruta de impresión XPS completa, pero sí una ruta de impresión híbrida GDI-a-XPS. Vea Arquitectura de la ruta 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 el modo como se administra la impresión en las aplicaciones Windows. Dado que XPS puede reemplazar un lenguaje de presentación de documentos (como RTF), un formato de cola de impresión (como WMF) y un lenguaje de descripción de páginas (como PCL o Postscript), la nueva ruta de impresión mantiene el formato XPS desde la publicación de la aplicación hasta el procesamiento final en el controlador o dispositivo de impresión.
La ruta de impresión XPS se basa en el modelo de controlador de impresora XPS (XPSDrv), que ofrece varias ventajas a los programadores, tales como la impresión "what you see is what you get" (WYSIWYG), mejor compatibilidad de color y un rendimiento de impresión significativamente mejorado. (Para ver más información sobre XPSDrv, vea Windows Driver Development)
El funcionamiento de la cola de impresión para documentos XPS es esencialmente igual que en versiones anteriores de Windows. Sin embargo, se ha mejorado para que admita la ruta de impresión XPS además de la ruta de impresión GDI existente. La nueva ruta de impresión consume de forma nativa un archivo de cola XPS. Aunque los controladores de impresora de modo usuario escritos para versiones anteriores de Windows continuarán funcionando, se requiere un controlador de impresora XPS (XPSDrv) para utilizar la ruta de impresión XPS.
Las ventajas de la ruta de impresión XPS son significativas, e incluyen:
Compatibilidad con impresión WYSIWYG
Compatibilidad nativa con perfiles de color avanzados, que incluyen 32 bits por canal (bpc), CMYK, colores con nombre, tintas n y compatibilidad nativa de transparencia y degradados.
Rendimiento de impresión mejorado tanto para aplicaciones basadas en .NET Framework como en Win32.
Formato XPS estándar del sector.
Para los escenarios de impresión básicos, hay una API simple e intuitiva disponible con un punto único de entrada para la interfaz de usuario, la configuración y el envío de trabajos. Para escenarios avanzados, se agrega una compatibilidad adicional para la personalización de la user interface (UI) (o ninguna UI en absoluto), para la impresión sincrónica o asincrónica y capacidades de impresión por lotes. Ambas opciones ofrecen compatibilidad de impresión o en modo de confianza total o parcial.
XPS se ha diseñado pensando en la extensibilidad. Utilizando el marco de la extensibilidad, es posible agregar características y funciones a XPS de una manera modular. Entre las características de extensibilidad se incluyen:
Esquema de impresión. El esquema público se actualiza periódicamente y permite la extensión rápida de la funcionalidad del dispositivo. (Vea PrintTicket y PrintCapabilities, a continuación.)
Canalización de filtros extensible. La canalización de filtros del controlador de impresora XPS (XPSDrv) se ha diseñado para permitir la impresión tanto directa como escalable de documentos XPS. (Busque "XPSDrv" en Windows Driver Development Kit.)
Arquitectura de la ruta de impresión
Aunque tanto las aplicaciones Win32 como .NET Framework son compatibles con XPS, las aplicaciones Win32 y Windows Forms utilizan una GDI para la conversión de XPS, con el propósito de crear contenido XPS con formato para el controlador de impresora XPS (XPSDrv). Estas aplicaciones no necesitan usar la ruta de impresión XPS y pueden continuar usando la impresión basada en Enhanced Metafile (EMF). No obstante, la mayoría de las características y mejoras de XPS solamente están disponibles para las aplicaciones orientadas a la ruta de impresión XPS.
Para habilitar el uso de impresoras basadas en XPSDrv para aplicaciones Win32 y Windows Forms, el controlador de impresora XPS (XPSDrv) admite la conversión del formato GDI al formato XPS. El modelo XPSDrv también permite convertir el formato XPS al formato GDI para que las aplicaciones Win32 puedan imprimir documentos XPS. Para las aplicaciones WPF, la conversión del formato XPS al formato GDI la realizan automáticamente 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 XPSDrv. (Las aplicaciones Windows Forms no pueden imprimir documentos XPS).
La ilustración siguiente describe el subsistema de impresión y define las partes proporcionadas por Microsoft y las partes definidas por proveedores de software y hardware.
Impresión XPS básica
WPF define tanto una API básica como una avanzada. Para las aplicaciones que no requieran una personalización de impresión extensa o que tengan acceso al conjunto de características de XPS, se dispone de soporte de impresión básico. La compatibilidad de impresión básica se expone a través de un control de diálogo de impresión que requiere una configuración mínima y muestra una UI conocida. Muchas características de XPS están disponibles utilizando este modelo de impresión simplificado.
PrintDialog
El control System.Windows.Controls.PrintDialog proporciona un punto de entrada único para la configuración de UI y el envío de trabajos de XPS. Para obtener información sobre cómo crear instancias y utilizar el control, vea Cómo: Invocar un cuadro de diálogo de impresión.
Impresión XPS avanzada
Para tener acceso al conjunto completo de características de XPS debe utilizarse la API de impresión avanzada. Varias API relevantes se describen a continuación con mayor detalle. Para ver una lista completa de las APIs de ruta de impresión XPS, vea las referencias a los espacios de nombres System.Windows.Xps y System.Printing.
PrintTicket y PrintCapabilities
Las clases PrintTicket y PrintCapabilities son 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 tales como la intercalación, la impresión a doble cara, el grapado, etc. Estas estructuras las define el esquema de impresión. Un objeto PrintTicket indica una impresora cómo procesar un trabajo de impresión. La clase PrintCapabilities define la funcionalidad de una impresora. Consultando la funcionalidad de una impresora, se puede crear un objeto PrintTicket que aprovecha al máximo las ventajas de las características compatibles de una impresora. De igual forma, se puede evitar las características no compatibles.
En el siguiente ejemplo se muestra cómo consultar el objeto PrintCapabilities de una impresora y crear un objeto PrintTicket usando código.
' ---------------------- 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()
// ---------------------- 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>
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()
PrintServer y PrintQueue
La clase PrintServer representa un servidor de impresión de red, y la clase PrintQueue representa una impresora y la lista de espera de los trabajos de salida asociados. Juntas, estas APIs permiten la administración avanzada de los trabajos de impresión de un servidor. Para administrar un objeto PrintQueue se utiliza un objeto PrintServer o una de sus clases derivadas. El método AddJob se utiliza para insertar un nuevo trabajo de impresión en la cola.
En el ejemplo siguiente se muestra cómo crear un objeto LocalPrintServer y cómo obtener acceso a su objeto 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 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()
// -------------------- 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()
XpsDocumentWriter
Un objeto XpsDocumentWriter, con sus diversos métodos Write y WriteAsync, se utiliza para escribir documentos XPS en un objeto PrintQueue. Por ejemplo, el método Write(FixedPage, PrintTicket) se utiliza para generar sincrónicamente un documento XPS y PrintTicket. El método WriteAsync(FixedDocument, PrintTicket) se utiliza para generar de forma asincrónica un documento XPS y PrintTicket.
En el ejemplo siguiente se muestra cómo crear un objeto 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 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()
// -------------------- 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()
Los métodos AddJob también proporcionan maneras de imprimir. Vea Cómo: Imprimir mediante programación archivos XPS. para obtener detalles.
Ruta de impresión GDI
Aunque las aplicaciones WPF son compatibles de forma nativa con la ruta de acceso XPS, las aplicaciones Win32 y Windows Forms también pueden aprovechar algunas de las características de XPS. El controlador de impresora XPS (XPSDrv) puede convertir resultados basados en GDI al formato XPS. Para escenarios avanzados, se admite la conversión personalizada de contenido mediante el Escape de impresora de convertidor de documentos XPS de Microsoft. De igual forma, las aplicaciones WPF también pueden enviar resultados a la ruta de impresión GDI si llaman a uno de los métodos Write o WriteAsync de la clase XpsDocumentWriter y designa una impresora que no es XpsDrv como cola de impresión de destino.
Para las aplicaciones que no requieran o no admitan la funcionalidad XPS, no se modifica la ruta de impresión GDI actual.
- Para obtener material de referencia adicional sobre la ruta de impresión GDI y las diversas opciones de conversión de XPS, vea Escape de impresora de convertidor de documentos XPS de Microsoft y "XPSDrv" en Windows Driver Development Kit.
Modelo de controlador de XPSDrv
La ruta de impresión XPS mejora la eficacia del administrador de trabajos de impresión utilizando XPS como formato nativo de cola de impresión al imprimir en una impresora o un controlador compatible con XPS. El proceso simplificado de administración trabajos de impresión elimina la necesidad de generar un archivo de cola intermedio, tal como un archivo de datos EMF, antes de poner el documento en la cola. Utilizando menores tamaños de archivo de cola, 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 el resultado de la aplicación como una serie de llamadas a GDI para servicios de representación. A diferencia de EMF, el formato de cola de XPS representa el documento real, sin que sea necesaria ninguna otra interpretación cuando se envía a un controlador de impresora basado en XPS (XPSDrv). Los controladores pueden trabajar directamente con los datos en este formato. Esta función elimina las conversiones de datos y espacio de color necesarias al utilizar archivos EMF y controladores de impresión basados en GDI.
El tamaño de los archivo de cola suelen reducirse al utilizar documentos XPS destinados a un controlador de impresora XPS (XPSDrv), en comparación con sus equivalentes EMF; no obstante, 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 incrustan las fuentes de dispositivo, así como las fuentes con base en el equipo; por el contrario, los archivos de cola de GDI no incrustan las fuentes de dispositivo. No obstante, ambos tipos de fuentes se agrupan en subconjuntos (vea a continuación) y los controladores de impresora pueden quitar las fuentes de dispositivo antes de transmitir el archivo a la impresora.
La reducción de tamaño de la cola tiene lugar mediante diversos mecanismos:
Agrupación de fuentes en subconjuntos. Solamente se almacenan en el archivo XPS los caracteres utilizados realmente en el documento.
Compatibilidad con gráficos avanzados. La compatibilidad nativa con transparencia y primitivas de degradado evita la rasterización del contenido en el documento XPS.
Identificación de recursos comunes. Los recursos que se utilizan 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 utilizan la compresión ZIP.
Vea también
Referencia
Escape de impresora de convertidor de documentos XPS de Microsoft
Conceptos
Almacenamiento y serialización de documentos