Visão geral da impressão de documentos (WPF .NET)
Com o Microsoft .NET, os desenvolvedores de aplicativos que usam o Windows Presentation Foundation (WPF) têm um rico conjunto de APIs de gerenciamento de sistemas de impressão e impressão. O núcleo dessa funcionalidade é o formato de arquivo XPS (XML Paper Specification) e o caminho de impressão XPS.
Sobre XPS
XPS é um formato de documento eletrônico, um formato de arquivo de spool e uma linguagem de descrição de página. É um formato de documento aberto que usa XML, Open Packaging Conventions e outros padrões do setor para criar documentos multiplataforma. O XPS simplifica o processo pelo qual os documentos digitais são criados, compartilhados, impressos, visualizados e arquivados. Para obter mais informações sobre XPS, consulte Documentos XPS.
Caminho de impressão XPS
O caminho de impressão XPS é uma funcionalidade do Windows que redefine como a impressão é tratada em aplicações do Windows. O percurso de impressão do XPS pode substituir:
- Idiomas de apresentação de documentos, como Rich Text Format ou Portable Document Format.
- Formatos de spooler de impressão, como Metafile do Windows ou Enhanced Metafile (EMF).
- Linguagens de descrição de página, como Printer Command Language ou PostScript.
Como resultado, o caminho de impressão XPS mantém o formato XPS desde a publicação do aplicativo até o processamento final no driver ou dispositivo da impressora.
O spooler de impressão para documentos XPS suporta o caminho de impressão XPS e o caminho de impressão GDI. O caminho de impressão XPS consome nativamente um arquivo de spool XPS e requer um driver de impressora XPS. O caminho de impressão XPS é baseado no modelo de controlador de impressora XPS (XPSDrv).
Os benefícios do caminho de impressão XPS incluem:
- Suporte de impressão WYSIWYG.
- Suporte nativo de perfis de cores avançados, como 32 bits por canal, o modelo de cores CMYK, cores nomeadas, n-tintas e transparências e gradientes.
- Melhor desempenho de impressão — os recursos e aprimoramentos do XPS só estão disponíveis para aplicativos destinados ao caminho de impressão XPS.
- Formato XPS padrão da indústria.
Para cenários básicos de impressão, uma API simples e intuitiva está disponível com uma interface do usuário padrão para configuração de impressão e envio de trabalho. Para cenários avançados, a API oferece suporte à personalização da interface do usuário ou a nenhuma interface do usuário, impressão síncrona ou assíncrona e recursos de impressão em lote. As opções simples e avançadas fornecem suporte de impressão nos modos de confiança total ou parcial.
O XPS foi projetado com a extensibilidade em mente, para que recursos e capacidades possam ser adicionados ao XPS de forma modular. Os recursos de extensibilidade incluem:
- Um esquema de impressão que suporta a extensão rápida dos recursos do dispositivo. A parte pública do esquema é atualizada regularmente para adicionar os recursos desejados do dispositivo. Para obter mais informações, consulte Arquitetura extensível.
- Um pipeline de filtro extensível que os drivers XPSDrv usam para oferecer suporte à impressão direta e escalável de documentos XPS. Para obter mais informações, consulte os drivers de impressora XPSDrv .
Arquitetura do caminho de impressão
Os aplicativos WPF suportam nativamente o caminho de impressão XPS e podem usar APIs de impressão XPS para imprimir diretamente no driver XPSDrv. Se a fila de impressão de destino da operação de gravação não tiver um driver XPSDrv, os métodos Write e WriteAsync da classe XpsDocumentWriter converterão automaticamente o conteúdo do formato XPS para GDI, para o caminho de impressão GDI.
A ilustração a seguir mostra o subsistema de impressão e define as partes fornecidas pela Microsoft e por fornecedores independentes de software e hardware.
Impressão XPS básica
O WPF tem uma API de impressão que suporta recursos de impressão básicos e avançados. Para os aplicativos que não exigem personalização de impressão extensiva ou acesso ao conjunto completo de recursos XPS, o suporte básico de impressão pode ser suficiente. O suporte básico de impressão é fornecido através de um controlo PrintDialog que requer configuração mínima, tem uma interface de utilizador familiar e suporta muitos recursos XPS.
ImprimirDiálogo
O controle System.Windows.Controls.PrintDialog fornece um único ponto de entrada para interface do usuário, configuração e envio de trabalho XPS. Para saber como instanciar e usar o controle, consulte Como exibir uma caixa de diálogo de impressão.
Impressão XPS avançada
Para acessar o conjunto completo de recursos XPS, use a API de impressão avançada. Várias APIs relevantes são descritas nesta seção, incluindo PrintTicket, PrintCapabilities, PrintServer, PrintQueuee XpsDocumentWriter. Para obter uma lista completa das APIs de caminho de impressão XPS, consulte os namespaces System.Windows.Xps e System.Printing.
PrintTicket e PrintCapabilities
As classes PrintTicket e PrintCapabilities são a base dos recursos avançados do XPS. Ambos os objetos contêm estruturas formatadas XML de recursos orientados à impressão que são definidos pelo esquema de impressão. Os recursos incluem impressão duplex, agrupamento, impressão frente e verso e agrafagem. Um comando PrintTicket
instrui uma impressora sobre como processar um trabalho de impressão. A classe PrintCapabilities
define os recursos de uma impressora. Ao consultar as capacidades de uma impressora, pode ser criado um PrintTicket
que tira o máximo partido das funcionalidades suportadas por uma impressora. Da mesma forma, funções que não são suportadas podem ser evitadas.
O exemplo a seguir consulta o PrintCapabilities
de uma impressora e cria um 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
A classe PrintServer representa um servidor de impressão de rede e a classe PrintQueue representa uma impressora e a fila de trabalhos de saída associada a ela. Juntas, essas APIs oferecem suporte ao gerenciamento avançado dos trabalhos de impressão para um servidor. Um PrintServer
, ou uma de suas classes derivadas, é usado para gerenciar um PrintQueue
.
O exemplo a seguir cria um LocalPrintServer e acessa o PrintQueueCollection do computador local usando 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, com seus muitos métodos Write e WriteAsync, é usado para adicionar documentos XPS a um PrintQueue. Por exemplo, o método Write(FixedDocumentSequence, PrintTicket) é usado para adicionar de forma síncrona um documento XPS com um tíquete de impressão a uma fila. O método WriteAsync(FixedDocumentSequence, PrintTicket) é usado para adicionar de forma assíncrona um documento XPS com um tíquete de impressão a uma fila.
O exemplo a seguir cria um XpsDocumentWriter
e adiciona documentos XPS, de forma síncrona e assíncrona, a um PrintQueue
usando 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
Caminho de impressão GDI
Embora as aplicações WPF suportem nativamente o caminho de impressão XPS, elas também podem imprimir no caminho de impressão GDI chamando um dos métodos Write ou WriteAsync da classe XpsDocumentWriter e selecionando a fila de impressão para uma impressora não-XpsDrv.
Para aplicativos que não exigem funcionalidade ou suporte XPS, o caminho de impressão GDI atual permanece inalterado. Para obter mais informações sobre a via de impressão GDI e as várias opções de conversão XPS, consulte Microsoft XPS document converter (MXDC) e controladores de impressora XPSDrv.
Modelo de driver XPSDrv
O caminho de impressão XPS melhora a eficiência do spooler ao usar o XPS como o formato de spool de impressão nativo, ao imprimir para uma impressora ou um driver compatível com XPS. Ao contrário do EMF, que representa a saída do aplicativo como uma série de chamadas para GDI para serviços de renderização, o formato de spool XPS representa o documento. Assim, quando os arquivos de spool XPS são enviados para um driver de impressora baseado em XPS, eles não exigem mais interpretação, pois os drivers operam diretamente nos dados nesse formato. Esse recurso elimina as conversões de espaço de dados e cores necessárias para arquivos EMF e drivers de impressão baseados em GDI.
O processo de spooling simplificado elimina a necessidade de gerar um ficheiro de spool intermédio, como um ficheiro de dados EMF (Enhanced Metafile Format), antes que o documento seja encaminhado. Com tamanhos menores dos ficheiros de spool, a trajetória de impressão XPS pode reduzir o tráfego de rede e melhorar o desempenho da impressão. Em comparação com seus equivalentes EMF, os tamanhos dos arquivos de spool XPS normalmente são reduzidos ao usar o caminho de impressão XPS. A redução do tamanho do arquivo de spool é feita através de vários mecanismos:
- Subconjunto de fontes, que armazena apenas os caracteres usados dentro de um documento no ficheiro XPS.
- Suporte gráfico avançado, que suporta nativamente primitivas de transparência e gradiente para evitar a rasterização do conteúdo XPS.
- Identificação de recursos comuns, como uma imagem de um logotipo corporativo que é usado várias vezes em um documento. Os recursos comuns são tratados como recursos partilhados e são carregados apenas uma vez.
- compressão ZIP, que é usado em todos os documentos XPS.
O tamanho do arquivo de spool XPS pode não ser reduzido se um gráfico vetorial for altamente complexo, com várias camadas ou escrito de forma ineficiente. Ao contrário dos arquivos de spool GDI, os arquivos XPS integram fontes de dispositivo e fontes de software para fins de exibição, embora ambos os tipos de fontes sejam subconjuntos e os drivers de impressora possam remover fontes de dispositivo antes de transmitir o arquivo para a impressora.
Dica
Você também pode imprimir arquivos XPS usando métodos PrintQueue.AddJob. Para obter mais informações, consulte Como imprimir arquivos XPS.
Ver também
.NET Desktop feedback