Como imprimir um arquivo XPS (WPF .NET)
Às vezes, você deseja adicionar um novo trabalho de impressão à fila de impressão sem abrir uma caixa de diálogo de impressão. Você pode usar um dos métodos PrintQueue.AddJob para fazer isso. Veja como.
No exemplo a seguir, usamos o método AddJob(String, String, Boolean), uma das várias sobrecargas do AddJob
, para:
- Adicione um novo trabalho de impressão para um documento XPS (Especificação de Papel XML) na fila de impressão padrão.
- Nomeie o novo trabalho.
- Especifique se o documento XPS deve ser validado (usando o parâmetro
fastCopy
).
Ao usar o método AddJob(String, String, Boolean)
, o valor do parâmetro fastCopy
é uma consideração fundamental:
- Se você definir o parâmetro
fastCopy
comotrue
, a validação XPS será ignorada e o trabalho de impressão será processado rapidamente sem feedback de progresso página a página. - Se você definir o parâmetro
fastCopy
comofalse
, o thread que chama o métodoAddJob
deverá ter um de estado de apartamento de thread único, caso contrário, uma exceção será gerada. Para obter mais informações, consulte a seção Comentários para AddJob(String, String, Boolean).
Adicionar novos trabalhos de impressão à fila
Este exemplo adiciona um ou mais documentos XPS à fila padrão. O código será:
- Use Task.Run para evitar bloquear o thread da interface do usuário, pois não há nenhuma versão assíncrona do
AddJob
. - Se o valor do parâmetro
fastCopy
forfalse
, execute AddJob(String, String, Boolean) em uma thread com estado de apartamento de thread único . - Obtenha uma referência ao PrintQueue padrão do LocalPrintServer.
- Chame
AddJob(String, String, Boolean)
na referência da fila de impressão, passando um nome de trabalho, um caminho de documento XPS e o parâmetrofastCopy
.
Se a fila não estiver pausada e a impressora estiver funcionando, um trabalho de impressão começará a ser impresso automaticamente quando chegar à parte superior da fila de impressão.
Dica
Para evitar a caixa de diálogo Salvar Arquivo de Saída como ao adicionar um trabalho de impressão à fila padrão, verifique se a impressora padrão não está como Microsoft Gravador de Documentos do XPS, Microsoft Print to PDFou outras opções de impressão em arquivo.
/// <summary>
/// Asyncronously, add a batch of XPS documents to the print queue using a PrintQueue.AddJob method.
/// Handle the thread apartment state required by the PrintQueue.AddJob method.
/// </summary>
/// <param name="xpsFilePaths">A collection of XPS documents.</param>
/// <param name="fastCopy">Whether to validate the XPS documents.</param>
/// <returns>Whether all documents were added to the print queue.</returns>
public static async Task<bool> BatchAddToPrintQueueAsync(IEnumerable<string> xpsFilePaths, bool fastCopy = false)
{
bool allAdded = true;
// Queue some work to run on the ThreadPool.
// Wait for completion without blocking the calling thread.
await Task.Run(() =>
{
if (fastCopy)
allAdded = BatchAddToPrintQueue(xpsFilePaths, fastCopy);
else
{
// Create a thread to call the PrintQueue.AddJob method.
Thread newThread = new(() =>
{
allAdded = BatchAddToPrintQueue(xpsFilePaths, fastCopy);
});
// Set the thread to single-threaded apartment state.
newThread.SetApartmentState(ApartmentState.STA);
// Start the thread.
newThread.Start();
// Wait for thread completion. Blocks the calling thread,
// which is a ThreadPool thread.
newThread.Join();
}
});
return allAdded;
}
/// <summary>
/// Add a batch of XPS documents to the print queue using a PrintQueue.AddJob method.
/// </summary>
/// <param name="xpsFilePaths">A collection of XPS documents.</param>
/// <param name="fastCopy">Whether to validate the XPS documents.</param>
/// <returns>Whether all documents were added to the print queue.</returns>
public static bool BatchAddToPrintQueue(IEnumerable<string> xpsFilePaths, bool fastCopy)
{
bool allAdded = true;
// To print without getting the "Save Output File As" dialog, ensure
// that your default printer is not the Microsoft XPS Document Writer,
// Microsoft Print to PDF, or other print-to-file option.
// Get a reference to the default print queue.
PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue();
// Iterate through the document collection.
foreach (string xpsFilePath in xpsFilePaths)
{
// Get document name.
string xpsFileName = Path.GetFileName(xpsFilePath);
try
{
// The AddJob method adds a new print job for an XPS
// document into the print queue, and assigns a job name.
// Use fastCopy to skip XPS validation and progress notifications.
// If fastCopy is false, the thread that calls PrintQueue.AddJob
// must have a single-threaded apartment state.
PrintSystemJobInfo xpsPrintJob =
defaultPrintQueue.AddJob(jobName: xpsFileName, documentPath: xpsFilePath, fastCopy);
// If the queue is not paused and the printer is working, then jobs will automatically begin printing.
Debug.WriteLine($"Added {xpsFileName} to the print queue.");
}
catch (PrintJobException e)
{
allAdded = false;
Debug.WriteLine($"Failed to add {xpsFileName} to the print queue: {e.Message}\r\n{e.InnerException}");
}
}
return allAdded;
}
''' <summary>
''' Asyncronously, add a batch of XPS documents to the print queue using a PrintQueue.AddJob method.
''' Handle the thread apartment state required by the PrintQueue.AddJob method.
''' </summary>
''' <param name="xpsFilePaths">A collection of XPS documents.</param>
''' <param name="fastCopy">Whether to validate the XPS documents.</param>
''' <returns>Whether all documents were added to the print queue.</returns>
Public Shared Async Function BatchAddToPrintQueueAsync(xpsFilePaths As IEnumerable(Of String), Optional fastCopy As Boolean = False) As Task(Of Boolean)
Dim isAllPrinted As Boolean = True
' Queue some work to run on the ThreadPool.
' Wait for completion without blocking the calling thread.
Await Task.Run(
Sub()
If fastCopy Then
isAllPrinted = BatchAddToPrintQueue(xpsFilePaths, fastCopy)
Else
' Create a thread to call the PrintQueue.AddJob method.
Dim newThread As New Thread(
Sub()
isAllPrinted = BatchAddToPrintQueue(xpsFilePaths, fastCopy)
End Sub
)
' Set the thread to single-threaded apartment state.
newThread.SetApartmentState(ApartmentState.STA)
' Start the thread.
newThread.Start()
' Wait for thread completion. Blocks the calling thread,
' which is a ThreadPool thread.
newThread.Join()
End If
End Sub
)
Return isAllPrinted
End Function
''' <summary>
''' Add a batch of XPS documents to the print queue using a PrintQueue.AddJob method.
''' </summary>
''' <param name="xpsFilePaths">A collection of XPS documents.</param>
''' <param name="fastCopy">Whether to validate the XPS documents.</param>
''' <returns>Whether all documents were added to the print queue.</returns>
Public Shared Function BatchAddToPrintQueue(xpsFilePaths As IEnumerable(Of String), fastCopy As Boolean) As Boolean
Dim isAllPrinted As Boolean = True
' To print without getting the "Save Output File As" dialog, ensure
' that your default printer is not the Microsoft XPS Document Writer,
' Microsoft Print to PDF, or other print-to-file option.
' Get a reference to the default print queue.
Dim defaultPrintQueue As PrintQueue = LocalPrintServer.GetDefaultPrintQueue()
' Iterate through the document collection.
For Each xpsFilePath As String In xpsFilePaths
' Get document name.
Dim xpsFileName As String = Path.GetFileName(xpsFilePath)
Try
' The AddJob method adds a new print job for an XPS
' document into the print queue, and assigns a job name.
' Use fastCopy to skip XPS validation and progress notifications.
' If fastCopy is false, the thread that calls PrintQueue.AddJob
' must have a single-threaded apartment state.
Dim xpsPrintJob As PrintSystemJobInfo = defaultPrintQueue.AddJob(jobName:=xpsFileName, documentPath:=xpsFilePath, fastCopy)
' If the queue is not paused and the printer is working, then jobs will automatically begin printing.
Debug.WriteLine($"Added {xpsFileName} to the print queue.")
Catch e As PrintJobException
isAllPrinted = False
Debug.WriteLine($"Failed to add {xpsFileName} to the print queue: {e.Message}\r\n{e.InnerException}")
End Try
Next
Return isAllPrinted
End Function
Dica
Você também pode imprimir arquivos XPS usando:
- métodos PrintDialog.PrintDocument ou PrintDialog.PrintVisual.
- métodos XpsDocumentWriter.Write e XpsDocumentWriter.WriteAsync.
Para obter mais informações, consulte Como exibir uma caixa de diálogo de impressão e Visão geral da impressão de documentos.
Consulte também
- PrintQueue.AddJob
- documentos no WPF
- Como exibir uma caixa de diálogo de impressão
- Visão geral dos documentos de impressão
.NET Desktop feedback