Visão geral da impressão
Com o Microsoft .NET Framework, os desenvolvedores de aplicativos que usam o WPF (Windows Presentation Foundation) têm um novo conjunto avançado 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 e desenvolvedores do Windows Forms usando código não gerenciado. No centro dessa nova funcionalidade está o novo formato de arquivo XPS (Especificação de Papel XML) e o caminho de impressão XPS.
Este tópico contém as seções a seguir.
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, OPC (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, exibidos e arquivados. Para obter informações adicionais sobre XPS, consulte documentos XPS.
Várias técnicas para imprimir conteúdo baseado em XPS usando o WPF são demonstradas em Imprimir arquivos XPS programaticamente. Você pode achar útil fazer referência a esses exemplos durante a revisão do conteúdo contido neste tópico. (Os desenvolvedores de código não gerenciado devem ver a documentação da função MXDC_ESCAPE. Os desenvolvedores do Windows Forms devem usar a API no namespace System.Drawing.Printing que não dá suporte ao caminho de impressão XPS completo, mas dá suporte a um caminho de impressão GDI a XPS híbrido. Veja arquitetura do caminho de impressão abaixo.)
Caminho de impressão XPS
O caminho de impressão XPS (Especificação de Papel XML) é um novo recurso do Windows que redefine como a impressão é tratada em aplicativos do Windows. Como 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 no dispositivo.
O caminho de impressão XPS é criado com base no XPSDrv (modelo de driver de impressora XPS), que oferece vários benefícios para os desenvolvedores, como impressão "o que você vê é o que você obtém" (WYSIWYG), melhor suporte a cores e desempenho de impressão significativamente melhorado. (Para obter mais informações sobre o XPSDrv, consulte a documentação do Windows Driver Kit.)
A operação do spooler de impressão para documentos XPS é essencialmente a mesma das versões anteriores do Windows. No entanto, ele foi aprimorado para dar 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 no modo de usuário escritos para versões anteriores do Windows continuem funcionando, um XPSDrv (driver de impressora XPS) é 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 à impressão WYSIWYG
Suporte nativo de perfis de cores avançados, que incluem 32 bits por canal (bpc), CMYK, cores nomeadas, n-tintas e suporte nativo de transparência e gradientes.
Melhor desempenho de impressão para aplicativos baseados em .NET Framework e Win32.
Formato XPS padrão do setor.
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, é acrescentado um suporte adicional para a interface do usuário, impressão síncrona ou assíncrona e capacidades de impressão em lote. Ambas as opções fornecem suporte de impressão no modo de confiança total ou parcial.
O XPS foi projetado com extensibilidade em mente. Usando a estrutura de extensibilidade, funcionalidades e capacidades podem ser adicionadas ao XPS de maneira modular. Os recursos de extensibilidade incluem:
Esquema de impressão. O esquema público é atualizado regularmente e permite a extensão rápida dos recursos do dispositivo. (Consulte PrintTicket e PrintCapabilities abaixo.)
Canalização de Filtro Extensível. O filtro do driver de impressora XPS (XPSDrv) foi projetado para habilitar tanto a impressão direta quanto a escalável de documentos XPS. Para obter mais informações, consulte drivers de impressora XPSDrv.
Arquitetura da trajetória de impressão
Embora os aplicativos Win32 e .NET Framework ofereçam suporte a XPS, os aplicativos Win32 e Windows Forms usam uma conversão de GDI para XPS para criar conteúdo formatado em XPS para o driver de impressora XPS (XPSDrv). Esses aplicativos não são obrigados a usar o caminho de impressão XPS e podem continuar a usar a impressão baseada em EMF (Enhanced Metafile). No entanto, a maioria dos recursos e aprimoramentos do XPS só está disponível 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 XPSDrv (driver de impressora XPS) dá suporte à conversão de GDI para o formato XPS. O modelo XPSDrv também fornece um conversor para formato XPS para GDI para que os aplicativos Win32 possam imprimir documentos XPS. Para aplicativos WPF, a conversão de formato XPS para GDI é feita automaticamente pelos métodos Write e WriteAsync da classe XpsDocumentWriter sempre que a fila 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 ilustra o subsistema de impressão e define as partes fornecidas pela Microsoft e as partes definidas pelos fornecedores de software e hardware:
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 de recursos XPS completo, o suporte básico à impressão está disponível. O suporte básico à impressão é exposto por meio de um controle 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 esse modelo de impressão simplificado.
PrintDialog
O controle System.Windows.Controls.PrintDialog fornece um único ponto de entrada para a interface do usuário, configuração e submissão de trabalhos XPS. Para obter informações sobre como instanciar 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 API relevantes são descritas com mais detalhes abaixo. Para obter uma lista completa de APIs de caminho de impressão XPS, consulte as referências de namespace 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 tipos de objetos são estruturas formatadas em XML de recursos orientados para impressão, como ordenação, impressão de dois lados, stapling etc. Essas estruturas são definidas pelo esquema de impressão. Um PrintTicket instrui uma impressora sobre como processar um trabalho de impressão. A classe PrintCapabilities 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 compatíveis de uma impressora. Da mesma forma, recursos não suportados podem ser evitados.
O exemplo a seguir demonstra como consultar o PrintCapabilities de uma impressora e criar uma PrintTicket usando código.
// ---------------------- 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 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 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 PrintQueue. O método AddJob é usado para inserir um novo trabalho de impressão na fila.
O exemplo a seguir demonstra como criar um LocalPrintServer e acessar seu PrintQueue padrão 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 métodos Write e WriteAsync, é usado para gravar documentos XPS em um PrintQueue. Por exemplo, o método Write(FixedPage, PrintTicket) é usado para gerar um documento XPS e PrintTicket de forma síncrona. O método WriteAsync(FixedDocument, PrintTicket) é usado para gerar um documento XPS e PrintTicket de forma assíncrona.
O exemplo a seguir demonstra como criar uma XpsDocumentWriter 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()
Os métodos AddJob também fornecem maneiras de imprimir. Imprimir arquivos XPS programaticamente: consulte . 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 XPSDrv (driver de impressora XPS) pode converter a saída baseada em GDI em formato XPS. Para cenários avançados, há suporte para a conversão personalizada de conteúdo usando o
Para aplicativos que não exigem funcionalidade ou suporte do XPS, o caminho de impressão GDI atual permanece inalterado.
- Para obter material de referência adicional sobre o caminho de impressão do GDI e as várias opções de conversão XPS, consulte o Microsoft XPS Document Converter (MXDC) e os drivers de impressora XPSDrv .
Modelo de driver XPSDrv
O caminho de impressão do XPS melhora a eficiência do spooler, usando o XPS como formato nativo de spool de impressão ao imprimir em uma impressora ou driver XPS -enabled. O processo de spooling simplificado elimina a necessidade de gerar um arquivo de spool intermediário, como um arquivo EMF, antes que o documento seja spoolado. Com tamanhos menores de arquivos de spool, o caminho de impressão XPS pode reduzir o tráfego de rede e melhorar o desempenho da impressão.
O EMF é um formato fechado que representa a saída do aplicativo como uma série de chamadas para GDI para serviços de renderização. Ao contrário do EMF, o formato de spool XPS representa o documento real sem exigir uma interpretação adicional quando é enviada para um driver de impressora baseado em XPS (XPSDrv). Os drivers podem operar diretamente nos dados neste formato. Essa funcionalidade elimina as conversões de espaço de cores e dados necessárias ao usar arquivos EMF e drivers de impressão baseados em GDI.
Tamanhos de arquivos de spool geralmente são reduzidos quando você usa documentos XPS que têm como alvo um driver de impressora XPS (XPSDrv) em comparação com seus equivalentes EMF; no entanto, há exceções:
Um gráfico vetorial muito complexo, de várias camadas ou ineficiente pode ser maior do que uma versão em bitmap do mesmo gráfico.
Para fins de exibição de tela, os arquivos XPS inserem fontes de dispositivo, bem como fontes baseadas em computador; enquanto os arquivos de spool GDI não inserem fontes de dispositivo. Mas ambas as categorias de fontes são subsetadas (veja abaixo) e os drivers de impressora podem remover as fontes do dispositivo antes de transmitir o arquivo para a impressora.
A redução do tamanho do spool é executada por meio de vários mecanismos:
Subconjunto de fontes. Somente os caracteres usados no documento real são armazenados no arquivo XPS.
Suporte Avançado a Gráficos. O suporte nativo para os primitivos de transparência e gradiente evita a rasterização do conteúdo no Documento XPS.
Identificação de recursos comuns. Os recursos 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.
compressão ZIP. Todos os documentos XPS usam compactação ZIP.
Consulte também
.NET Desktop feedback