Visão geral da impressão

Com o Microsoft .NET Framework, os desenvolvedores de aplicativos que usam o Windows Presentation Foundation (WPF) têm um novo e avançado conjunto de APIs de gerenciamento de sistema de impressão e impressão. Com o Windows Vista, alguns desses aprimoramentos do sistema de impressão também estão disponíveis para desenvolvedores que criam aplicativos do Windows Forms e desenvolvedores que usam código não gerenciado. No centro dessa nova funcionalidade está o novo formato de arquivo XPS (XML Paper Specification) e o caminho de impressão XPS.

Este tópico inclui as seções a seguir.

Sobre XPS

XPS é um formato de documento eletrônico, um formato de arquivo spool e uma linguagem de descrição de página. É um formato de documento aberto que usa XML, Open Packaging Conventions (OPC) 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 informações adicionais sobre XPS, consulte Documentos XPS.

Várias técnicas para imprimir conteúdo baseado em XPS usando WPF são demonstradas em Arquivos XPS de impressão programática. Talvez seja útil consultar esses exemplos durante o exame do conteúdo contido neste tópico. (Os desenvolvedores de código não gerenciado devem consultar a documentação do MXDC_ESCAPE função. Os desenvolvedores do Windows Forms devem usar a API no namespace que não oferece suporte ao caminho de impressão XPS completo, mas oferece suporte a System.Drawing.Printing um caminho de impressão híbrido GDI-para-XPS. Consulte Arquitetura do caminho de impressão abaixo.)

Caminho de impressão XPS

O caminho de impressão XPS (XML Paper Specification) é um novo recurso do Windows que redefine como a impressão é tratada em aplicativos do Windows. Porque o XPS pode substituir uma linguagem de apresentação de documento (como RTF), um formato de spooler de impressão (como WMF) e uma linguagem de descrição de página (como PCL ou Postscript); o novo caminho de impressão mantém o formato XPS desde a publicação do aplicativo até o processamento final no driver de impressão ou dispositivo.

O caminho de impressão XPS é construído sobre o modelo de driver de impressora XPS (XPSDrv), que fornece vários benefícios para os desenvolvedores, como impressão "o que você vê é o que você obtém" (WYSIWYG), suporte a cores aprimorado e desempenho de impressão significativamente aprimorado. (Para obter mais informações sobre XPSDrv, consulte o Documentação do Kit de Driver do Windows.)

A operação do spooler de impressão para documentos XPS é essencialmente a mesma que nas versões anteriores do Windows. No entanto, ele foi aprimorado para oferecer suporte ao caminho de impressão XPS, além do caminho de impressão GDI existente. O novo caminho de impressão consome nativamente um arquivo de spool XPS. Embora os drivers de impressora de modo de usuário escritos para versões anteriores do Windows continuem a funcionar, um driver de impressora XPS (XPSDrv) é necessário para usar o caminho de impressão XPS.

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

  • Suporte de impressão WYSIWYG

  • Suporte nativo a perfis de cores avançados, que incluem 32 bits por canal (bpc), CMYK, cores nomeadas, n-inks e suporte nativo à transparência e gradientes.

  • Desempenho de impressão aprimorado para aplicativos baseados no .NET Framework e Win32.

  • Formato XPS padrão da indústria.

Para cenários básicos de impressão, uma API simples e intuitiva está disponível com um único ponto de entrada para interface do usuário, configuração e envio de trabalho. Para cenários avançados, um suporte adicional é adicionado para a interface do usuário), impressão síncrona ou assíncrona e recursos de impressão em lote. As duas opções fornecem suporte de impressão no modo de confiança total ou parcial.

XPS foi projetado com extensibilidade em mente. Usando a estrutura de extensibilidade, recursos e capacidades podem ser adicionados ao XPS de maneira modular. Os recursos de extensibilidade incluem:

  • Esquema de Impressão. O esquema público é atualizado regularmente e permite a rápida extensão de recursos do dispositivo. (Consulte PrintTicket e PrintCapabilities abaixo).

  • Pipeline de filtro extensível. O pipeline de filtro do driver de impressora XPS (XPSDrv) foi projetado para permitir a impressão direta e escalável de documentos XPS. Para obter mais informações, consulte Drivers de impressora XPSDrv.

Enquanto os aplicativos Win32 e .NET Framework oferecem suporte a XPS, os aplicativos Win32 e Windows Forms usam uma conversão GDI para XPS para criar conteúdo formatado XPS para o driver de impressora XPS (XPSDrv). Esses aplicativos não são necessários para usar o caminho de impressão XPS e podem continuar a usar a impressão baseada em EMF (metarquivo avançado). No entanto, a maioria dos recursos e aprimoramentos XPS só estão disponíveis para aplicativos destinados ao caminho de impressão XPS.

Para habilitar o uso de impressoras baseadas em XPSDrv por aplicativos Win32 e Windows Forms, o driver de impressora XPS (XPSDrv) oferece suporte à conversão de GDI para o formato XPS. O modelo XPSDrv também fornece um conversor para XPS para o formato GDI para que os aplicativos Win32 possam imprimir documentos XPS. Para aplicativos WPF, a conversão de XPS para o XpsDocumentWriter formato GDI é feita automaticamente pelos métodos e WriteAsync da classe sempre que a fila Write de impressão de destino da operação de gravação não tiver um driver XPSDrv. (Os aplicativos do Windows Forms não podem imprimir documentos XPS.)

A ilustração a seguir descreve o subsistema de impressão e define as partes fornecidas pela Microsoft e as partes definidas pelos fornecedores de software e hardware:

Screenshot shows the XPS print system.

Impressão XPS básica

O WPF define uma API básica e avançada. 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 está disponível. O suporte básico à impressão é exposto por meio de um controle de caixa de diálogo de impressão que requer configuração mínima e apresenta uma interface do usuário familiar. Muitos recursos XPS estão disponíveis usando este modelo de impressão simplificado.

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 obter informações sobre como criar uma instância e usar o controle, consulte Invocar uma caixa de diálogo de impressão.

Impressão XPS avançada

Para acessar o conjunto completo de recursos XPS, a API de impressão avançada deve ser usada. Várias APIs relevantes são descritas com mais detalhes abaixo. Para obter uma lista completa das APIs de caminho de impressão XPS, consulte as referências de System.Windows.Xps namespace e System.Printing .

PrintTicket e PrintCapabilities

As PrintTicket classes e PrintCapabilities são a base dos recursos XPS avançados. Ambos os tipos de objetos são estruturas formatadas em XML de recursos orientados à impressão, como agrupamento, impressão frente e verso, grampeamento, etc. Essas estruturas são definidas pelo esquema de impressão. 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 demonstra como consultar o PrintCapabilities de uma impressora e criar um PrintTicket código de uso.

// ---------------------- 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()
// ---------------------- 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>
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()

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 permitem o 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 AddJob método é usado para inserir um novo trabalho de impressão na fila.

O exemplo a seguir demonstra como criar um LocalPrintServer e acessar seu padrão PrintQueue usando código.

// -------------------- 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()
' -------------------- 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()

XpsDocumentWriter

Um XpsDocumentWriter, com seus muitos e WriteWriteAsync métodos, é usado para gravar documentos XPS em um PrintQueuearquivo . Por exemplo, o Write(FixedPage, PrintTicket) método é usado para gerar uma saída de um documento XPS e PrintTicket de forma síncrona. O WriteAsync(FixedDocument, PrintTicket) método é usado para gerar uma saída de um documento XPS e PrintTicket de forma assíncrona.

O exemplo a seguir demonstra como criar um XpsDocumentWriter código de uso.

// -------------------- 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()
' -------------------- 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()

Os AddJob métodos também fornecem maneiras de imprimir. Consulte Imprimir arquivos XPS de forma programática. para obter detalhes.

Caminho de impressão GDI

Embora os aplicativos WPF ofereçam suporte nativo ao caminho de impressão XPS, os aplicativos Win32 e Windows Forms também podem aproveitar alguns recursos XPS. O driver de impressora XPS (XPSDrv) pode converter a saída baseada em GDI para o formato XPS. Para cenários avançados, a conversão personalizada de conteúdo é suportada usando o Microsoft XPS Document Converter (MXDC). Da mesma forma, os aplicativos WPF também podem gerar saída para o caminho de impressão GDI chamando um dos métodos ou WriteAsync da XpsDocumentWriter classe e designando uma impressora não-XpsDrv como a fila de impressão de Write destino.

Para aplicativos que não exigem funcionalidade ou suporte XPS, o caminho de impressão GDI atual permanece inalterado.

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. 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. Por meio de 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.

EMF é um formato fechado que representa a saída do aplicativo como uma série de chamadas para GDI para prestação de serviços. Ao contrário do EMF, o formato de spool XPS representa o documento real sem exigir interpretação adicional ao gerar uma saída para um driver de impressora baseado em XPS (XPSDrv). Os drivers podem operar diretamente nos dados no formato. Esse recurso elimina as conversões de dados e espaço de cores necessárias quando você usa arquivos EMF e drivers de impressão baseados em GDI.

Os tamanhos de arquivo de spool geralmente são reduzidos quando você usa documentos XPS destinados a um driver de impressora XPS (XPSDrv) em comparação com seus equivalentes EMF; no entanto, há exceções:

  • Um gráfico vetorial que é muito complexo, multi-camadas ou que foi escrito de forma ineficiente, pode ser maior que uma versão em bitmap do mesmo elemento gráfico.

  • Para fins de exibição em tela, os arquivos XPS inserem fontes de dispositivo, bem como fontes baseadas em computador, enquanto que arquivos de spool GDI não inserem fontes de dispositivo. Mas os dois tipos de fontes são subdivididas (veja abaixo) e os drivers de impressora podem remover as fontes de dispositivo antes de transmitir o arquivo para a impressora.

A redução de tamanho do spool é executada através de vários mecanismos:

  • Subdivisão de fonte. Somente os caracteres usados no documento real são armazenados no arquivo XPS.

  • Suporte avançado a elementos gráficos. O suporte nativo para primitivas de transparência e gradiente evita a rasterização do conteúdo no documento XPS.

  • Identificação de recursos comuns. Os recursos que são usados várias vezes (como uma imagem que representa um logotipo corporativo) são tratados como recursos compartilhados e são carregados apenas uma vez.

  • Compactação ZIP. Todos os documentos XPS usam compactação ZIP.

Confira também