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 sistema 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 de plataforma cruzada. 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 é 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 Rich Text Format ou Portable Document Format.
  • Formatos de spooler de impressão, como Metarquivo do Windows ou EMF (Metarquivo Avançado).
  • 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 é criado no modelo de driver 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-inks e transparências e gradientes.
  • Desempenho de impressão aprimorado — os recursos e aprimoramentos 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 de impressão básicos, 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 oferecem suporte à 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 maneira modular. Os recursos de extensibilidade incluem:

  • Um esquema de impressão que oferece suporte à 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 Drivers de impressora XPSDrv.

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 e WriteAsync da classe converterão automaticamente o WriteXpsDocumentWriter conteúdo do formato XPS para o 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.

Screenshot showing the XPS print system.

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 por meio de um controle PrintDialog que requer configuração mínima, tem uma interface do usuário familiar e oferece suporte a muitos recursos XPS.

PrintDialog

O System.Windows.Controls.PrintDialog controle fornece um único ponto de entrada para a 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, PrintQueue e XpsDocumentWriter. Para obter uma lista completa de APIs de caminho de impressão XPS, consulte os System.Windows.Xps namespaces e System.Printing .

PrintTicket e PrintCapabilities

As PrintTicket classes e PrintCapabilities são a base dos recursos XPS avançados. Ambos os objetos contêm estruturas formatadas em XML de recursos orientados a impressão que são definidos pelo esquema de impressão. Os recursos incluem duplexação, agrupamento, impressão frente e verso e grampeamento. A PrintTicket instrui uma impressora como processar um trabalho de impressão. A PrintCapabilities classe define os recursos de uma impressora. Ao consultar os recursos de uma impressora, é possível criar um PrintTicket que aproveite ao máximo os recursos suportados de uma impressora. Da mesma forma, os recursos sem suporte podem ser evitados.

O exemplo a seguir consulta o PrintCapabilities de uma impressora e cria um PrintTicket código de uso.

/// <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 PrintServer classe representa um servidor de impressão de rede e a classe representa uma impressora e a PrintQueue fila de trabalho de saída associada a ela. Juntas, essas APIs oferecem suporte ao gerenciamento avançado dos trabalhos de impressão de um servidor. Um PrintServer, ou uma de suas classes derivadas, é usado para gerenciar um PrintQueuearquivo .

O exemplo a seguir cria um LocalPrintServer e acessa o código de uso do PrintQueueCollection computador local.

/// <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 Write e WriteAsync métodos, é usado para adicionar documentos XPS a um PrintQueuearquivo . Por exemplo, o Write(FixedDocumentSequence, PrintTicket) método é usado para adicionar de forma síncrona um documento XPS com um tíquete de impressão a uma fila. O WriteAsync(FixedDocumentSequence, PrintTicket) método é 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 e XpsDocumentWriter adiciona documentos XPS, de forma síncrona e assíncrona, a um PrintQueue código de uso.

/// <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 gerar saída para o caminho de impressão GDI chamando um dos métodos ou WriteAsync da classe e selecionando a fila de WriteXpsDocumentWriter 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 o caminho de impressão GDI e as várias opções de conversão XPS, consulte Conversor de documentos Microsoft XPS (MXDC) e drivers de impressora XPSDrv.

Modelo de driver XPSDrv

O caminho de impressão XPS melhora a eficiência do spooler usando XPS como o formato de spool de impressão nativo 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 no 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 interpretação adicional, pois os drivers operam diretamente nos dados nesse formato. Esse recurso elimina as conversões de dados e espaço de cores 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 que o documento seja spooled. Com tamanhos de arquivo de spool menores, o caminho de impressão XPS pode reduzir o tráfego de rede e melhorar o desempenho de impressão. Em comparação com seus equivalentes EMF, os tamanhos de arquivo 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:

  • Subconfiguração de fonte, que armazena apenas os caracteres usados em um documento no arquivo XPS.
  • Suporte gráfico avançado, que suporta nativamente transparência e primitivas de 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 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 vetorial for altamente complexo, multicamadas ou escrito de forma ineficiente. Ao contrário dos arquivos de spool GDI, os arquivos XPS incorporam fontes de dispositivo e fontes baseadas em computador para fins de exibição de tela, embora ambos os tipos de fontes sejam subdefinidos 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 PrintQueue.AddJob métodos. Para obter mais informações, consulte Como imprimir arquivos XPS.

Confira também