Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Con Microsoft .NET, los desarrolladores de aplicaciones que usan Windows Presentation Foundation (WPF) tienen un amplio conjunto de API de administración de sistemas de impresión e impresión. El núcleo de esta funcionalidad es el formato de archivo XML Paper Specification (XPS) y la ruta de impresión XPS.
Acerca de XPS
XPS es un formato de documento electrónico, un formato de archivo de cola y un lenguaje para la descripción de páginas. Es un formato de documento abierto que usa XML, Open Packaging Conventions y otros estándares del sector para crear documentos multiplataforma. XPS simplifica el proceso por el que se crean, comparten, imprimen, visualizan y archivan documentos digitales. Para obtener más información sobre XPS, consulte Documentos XPS.
Ruta de impresión de XPS
La ruta de impresión XPS es una característica de Windows que vuelve a definir cómo se controla la impresión en las aplicaciones de Windows. La ruta de impresión de XPS puede reemplazar:
- Idiomas de presentación de documentos, como formato de texto enriquecido o formato de documento portátil.
- Imprimir formatos de cola, como Metarchivo de Windows o Metarchivo mejorado (EMF).
- 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.
La cola de impresión para documentos XPS admite tanto la ruta de impresión XPS como la ruta de impresión de 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).
Entre las ventajas de la ruta de impresión XPS se incluyen las siguientes:
- 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 mejorado de impresión: las características y mejoras de XPS solo están disponibles para las aplicaciones destinadas a la ruta de impresión XPS.
- Formato XPS estándar del sector.
Para 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. En escenarios avanzados, la API admite la personalización de la interfaz de usuario o ninguna interfaz de usuario en absoluto, la impresión sincrónica o asincrónica y las funcionalidades de impresión por lotes. Las opciones simples y avanzadas proporcionan compatibilidad con impresión en modos de confianza total o parcial.
XPS se diseñó teniendo en cuenta la extensibilidad, por lo que las características y funcionalidades se pueden agregar a XPS de forma modular. Las características de extensibilidad incluyen:
- 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 Arquitectura extensible.
- Una canalización de filtro extensible que los controladores XPSDrv usan para admitir la impresión directa y escalable de documentos XPS. Para obtener más información, consulte Controladores de impresora XPSDrv.
Arquitectura de ruta de impresión
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, entonces los métodos Write y WriteAsync de la clase XpsDocumentWriter convertirán automáticamente el contenido de XPS a formato GDI, para la ruta de impresión de GDI.
En la ilustración siguiente se muestra el subsistema de impresión y se definen las partes proporcionadas por Microsoft y proveedores de software y hardware independientes.
Impresión básica de XPS
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 al conjunto completo de características XPS, la compatibilidad básica con impresión puede ser suficiente. La compatibilidad básica con 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 System.Windows.Controls.PrintDialog control 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 avanzada de XPS
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 la ruta de impresión XPS, consulte los espacios de nombres System.Windows.Xps y System.Printing.
PrintTicket e PrintCapabilities
Las clases PrintTicket y PrintCapabilities son 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 dúplex, intercalación, impresión en dos lados y acoplamiento. Un PrintTicket
indica a una impresora cómo procesar un trabajo de impresión. La PrintCapabilities
clase define las funciones de una impresora. Consultando las funcionalidades de una impresora, se puede crear un PrintTicket
objeto que aprovecha al máximo las características admitidas de una impresora. De forma similar, se pueden evitar características no admitidas.
En el ejemplo siguiente se consulta el PrintCapabilities
de una impresora y se crea un PrintTicket
usando 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 e PrintQueue
La PrintServer clase representa un servidor de impresión de red y la PrintQueue clase representa una impresora y la cola de trabajos de salida asociadas. 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 objeto y se accede al equipo PrintQueueCollection local 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 muchos Write y WriteAsync métodos, se usa para agregar documentos XPS a PrintQueue. Por ejemplo, el Write(FixedDocumentSequence, PrintTicket) método se usa para agregar de forma sincrónica un documento XPS con un vale de impresión a una cola. El WriteAsync(FixedDocumentSequence, PrintTicket) método 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 y XpsDocumentWriter
se agregan documentos XPS, tanto de forma sincrónica como asincrónica, a un PrintQueue
código using.
/// <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 impresión de GDI
Aunque las aplicaciones WPF admiten de forma nativa la ruta de impresión XPS, también pueden generar 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 no XpsDrv.
En el caso de las aplicaciones que no requieren funcionalidad o compatibilidad con XPS, la ruta de impresión de GDI actual permanece sin cambios. Para obtener más información sobre la ruta de impresión de GDI y las diversas opciones de conversión XPS, consulte Convertidor de documentos de Microsoft XPS (MXDC) y controladores de impresora XPSDrv.
Modelo de controlador XPSDrv
La ruta de impresión XPS mejora la eficacia del colador mediante XPS como formato nativo de cola de impresión al imprimir en una impresora o controlador habilitado 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 operan directamente con los datos en ese formato. Esta funcionalidad elimina las conversiones de espacio de color y datos necesarios para los archivos EMF y los controladores de impresión basados en GDI.
El proceso simplificado de puesta en cola elimina la necesidad de generar un archivo de cola intermedio, como un archivo de datos EMF, antes de que el documento se ponga en cola. Con tamaños de archivo de spool 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 spool se realiza mediante varios mecanismos.
- Subconjunto de fuentes, que solo almacena los caracteres utilizados en un documento dentro del 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.
El tamaño del archivo de cola XPS podría no reducirse si un gráfico vectorial es muy complejo, tiene múltiples capas o está escrito de manera ineficaz. A diferencia de los archivos de cola de GDI, los archivos XPS insertan fuentes de dispositivo y fuentes basadas en equipos para fines de visualización en pantalla, aunque ambos tipos de fuentes se subcategorizan y los controladores de impresora pueden eliminar fuentes del dispositivo antes de transmitir el archivo a la impresora.
Sugerencia
También puede imprimir archivos XPS mediante PrintQueue.AddJob métodos. Para obtener más información, vea Cómo imprimir archivos XPS.
Consulte también
.NET Desktop feedback