Compartilhar via


Visão geral de documentos de impressão (WPF .NET)

Com o Microsoft .NET, os desenvolvedores de aplicativos que usam o WPF (Windows Presentation Foundation) têm um conjunto avançado de APIs de gerenciamento de sistema de impressão e impressão. O núcleo dessa funcionalidade é o formato de arquivo XPS (Especificação de Papel XML) e o caminho de impressão XPS.

Sobre o XPS

O 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, Convenções de Empacotamento Aberto 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, exibidos e arquivados. Para obter mais informações sobre o XPS, confira documentos XPS.

Caminho de impressão XPS

O caminho de impressão XPS é um recurso do Windows que redefine como a impressão é tratada em aplicativos do Windows. O caminho de impressão XPS pode substituir:

  • Idiomas de apresentação de documentos, como Formato rich text ou formato de documento portátil.
  • Imprimir formatos de spooler, como Metafile do Windows ou EMF (Metafile Avançado).
  • Idiomas de descrição de página, como Linguagem de Comando de Impressora ou PostScript.

Como resultado, o caminho de impressão XPS mantém o formato XPS da publicação do aplicativo até o processamento final no driver ou dispositivo da impressora.

O spooler de impressão para documentos XPS dá suporte tanto ao caminho de impressão XPS quanto ao 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 é criado no modelo XPSDrv (driver de impressora XPS).

Os benefícios do caminho de impressão XPS incluem:

  • Suporte à impressão WYSIWYG.
  • Suporte nativo de perfis de cores avançados, como 32 bits por canal, o modelo de cores CMYK, cores nomeadas, tintas n-tipo e transparências e gradientes.
  • Melhor desempenho de impressão— os recursos e aprimoramentos do XPS só estão disponíveis para aplicativos direcionados ao caminho de impressão XPS.
  • Formato XPS padrão do setor.

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 dá 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 à impressão em modos de confiança total ou parcial.

O XPS foi projetado com extensibilidade em mente, para que recursos e recursos possam ser adicionados ao XPS de maneira modular. Os recursos de extensibilidade incluem:

  • Um esquema de impressão que dá suporte à extensão rápida dos recursos do dispositivo. A parte pública do esquema é atualizada regularmente para adicionar recursos de dispositivo desejados. Para obter mais informações, consulte Arquitetura Extensível.
  • Um pipeline de filtro extensível que os drivers XPSDrv usam para dar suporte à impressão direta e escalável de documentos XPS. Para obter mais informações, consulte drivers de impressora XPSDrv.

Os aplicativos WPF dão suporte nativo ao 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 XPS para o formato 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 fornecedores independentes de software e hardware.

Captura de tela mostrando o sistema de impressão XPS.

Impressão XPS básica

O WPF tem uma API de impressão que dá suporte a 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 de recursos XPS completo, o suporte básico à impressão pode ser suficiente. O suporte básico à impressão é fornecido por meio de um controle PrintDialog que requer configuração mínima, tem uma interface familiar e dá suporte a muitos recursos XPS.

PrintDialog

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 de 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 de recursos avançados do XPS. Ambos os objetos contêm estruturas formatadas em XML de recursos orientados a impressão definidos pelo esquema de impressão. Os recursos incluem impressão duplex, ordenação, impressão de dois lados e grampeamento. Um 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, é possível criar um PrintTicket que aproveite ao máximo os recursos suportados pela impressora. Da mesma forma, funcionalidades sem suporte podem ser evitadas.

O exemplo a seguir consulta o PrintCapabilities de uma impressora e cria uma 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 trabalho de saída associada a ela. Juntas, essas APIs dão 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 os aplicativos WPF ofereçam suporte nativo ao caminho de impressão XPS, eles também podem utilizar o caminho de impressão GDI chamando um dos métodos Write ou WriteAsync da classe XpsDocumentWriter e selecionando a fila de impressão de uma impressora que não seja XpsDrv.

Para aplicativos que não exigem funcionalidade ou suporte do XPS, o caminho de impressão GDI atual permanece inalterado. Para obter mais informações sobre o caminho de impressão GDI e as várias opções de conversão XPS, confira MXDC (conversor de documentos do Microsoft XPS) e drivers de impressora XPSDrv.

Modelo de driver XPSDrv

O caminho de impressão XPS aprimora a eficiência do spooler usando XPS como o formato de spool de impressão nativa ao imprimir em uma impressora ou driver habilitado para 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. Portanto, quando os arquivos de spool XPS são gerados para um driver de impressora baseado em XPS, eles não exigem uma interpretação adicional, pois os drivers operam diretamente nos dados nesse formato. Essa funcionalidade elimina as conversões de espaço de cores e dados necessárias para arquivos EMF e drivers de impressão baseados em GDI.

O processo simplificado de spooling elimina a necessidade de gerar um arquivo de spool intermediário, como um arquivo de dados EMF, antes de o documento ser enviado para a fila de impressão. Com menores tamanhos de arquivo de spool, o caminho de impressão XPS consegue reduzir o tráfego de rede e aprimorar o desempenho da impressão. Em comparação com seus equivalentes em EMF, o tamanho dos arquivos de spool XPS normalmente é reduzido ao usar o caminho de impressão XPS. A redução do tamanho do arquivo do Spool é feita por meio de vários mecanismos:

  • Subconjunto de fonte, que armazena apenas os caracteres usados em um documento no arquivo XPS.
  • Suporte a elementos gráficos avançados, que dá suporte nativo à transparência e aos primitivos gradientes para evitar a rasterização do conteúdo XPS.
  • Identificação de recursos comuns, como uma imagem de um logotipo corporativo que é usada várias vezes em um documento. Os recursos comuns são tratados como recursos compartilhados e são carregados apenas uma vez.
  • Compactação ZIP, que é usada em todos os documentos XPS.

O tamanho do arquivo de spool XPS pode não ser reduzido se um gráfico de vetor for altamente complexo, com várias camadas ou gravado de forma ineficiente. Ao contrário dos arquivos de spool GDI, os arquivos XPS inserem fontes de dispositivo e fontes baseadas em computador para fins de exibição de tela, embora ambos os tipos de fontes sejam subconjuntos e os drivers de impressora possam remover fontes do 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.

Consulte também