Como imprimir um arquivo XPS (WPF .NET)
Às vezes, você desejará 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 PrintQueue.AddJob métodos para fazer isso. Veja aqui como fazer isso.
No exemplo a seguir, usamos o AddJob(String, String, Boolean) método, uma das várias sobrecargas de AddJob
, para:
- Adicione um novo trabalho de impressão para um documento XPS (XML Paper Specification) na fila de impressão padrão.
- Nomeie o novo trabalho.
- Especifique se o documento XPS deve ser validado (usando o
fastCopy
parâmetro).
Ao usar o AddJob(String, String, Boolean)
método, o valor do fastCopy
parâmetro é uma consideração importante:
- Se você definir o
fastCopy
parâmetro comotrue
, a validação XPS será ignorada e o trabalho de impressão será colocado rapidamente em spool sem comentários de progresso página por página. - Se você definir o
fastCopy
parâmetro comofalse
, o thread que chama oAddJob
método deverá ter um estado de apartamento de thread único, caso contrário, uma exceção será lançada. Para obter mais informações, consulte a seção Comentários do 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 irá:
- Use Task.Run para evitar o bloqueio do thread da interface do usuário, já que não há uma versão assíncrona do
AddJob
. - Se o valor do
fastCopy
parâmetro forfalse
, execute AddJob(String, String, Boolean) em um thread com estado de apartamento de thread único. - Obtenha uma referência ao padrão PrintQueue do LocalPrintServer.
- Chame
AddJob(String, String, Boolean)
a referência da fila de impressão, passando um nome de trabalho, um caminho de documento XPS e ofastCopy
parâmetro.
Se a fila não estiver pausada e a impressora estiver funcionando, um trabalho de impressão começará a ser impresso automaticamente quando atingir o topo 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, certifique-se de que sua impressora padrão não seja o Microsoft XPS Document Writer, o Microsoft Print to PDF ou 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:
- PrintDialog.PrintDocument ou PrintDialog.PrintVisual métodos.
- XpsDocumentWriter.Write e XpsDocumentWriter.WriteAsync métodos.
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.
Confira também
.NET Desktop feedback