Jak vytisknout soubor XPS (WPF .NET)
Někdy budete chtít do tiskové fronty přidat novou tiskovou úlohu bez otevření dialogového okna tisku. K tomu můžete použít jednu z PrintQueue.AddJob metod. Tady je postup.
V následujícím příkladu používáme metodu AddJob(String, String, Boolean), jedno z několika přetížení AddJob
, k:
- Do výchozí tiskové fronty přidejte novou úlohu tisku dokumentu XPS (XML Paper Specification).
- Pojmenujte novou úlohu.
- Určete, zda má být dokument XPS ověřen (pomocí parametru
fastCopy
).
Při použití metody AddJob(String, String, Boolean)
je hodnota parametru fastCopy
klíčovým aspektem:
- Pokud nastavíte parametr
fastCopy
natrue
, přeskočí se ověření XPS a úloha tisku se rychle zpracuje bez zpětné vazby o průběhu úlohy stránek. - Pokud nastavíte parametr
fastCopy
nafalse
, vlákno, které volá metoduAddJob
, musí být v jednovláknovém stavu apartmánu , jinak bude vyvolána výjimka. Pro více informací se podívejte do oddílu Poznámky pro AddJob(String, String, Boolean).
Přidání nových tiskových úloh do fronty
Tento příklad přidá jeden nebo více dokumentů XPS do výchozí fronty. Kód bude:
- Pomocí Task.Run se vyhněte blokování vlákna uživatelského rozhraní, protože neexistuje žádná asynchronní verze
AddJob
. - Pokud je hodnota parametru
fastCopy
false
, spusťte AddJob(String, String, Boolean) ve vlákně se stavem apartmánu pro jedno vlákno . - Získejte odkaz na výchozí PrintQueue z LocalPrintServer.
- Zavolejte
AddJob(String, String, Boolean)
na odkaz tiskové fronty, předejte název úlohy, cestu k dokumentu XPS a parametrfastCopy
.
Pokud fronta není pozastavená a tiskárna funguje, tisková úloha se automaticky spustí, jakmile dosáhne horní části tiskové fronty.
Spropitné
Chcete-li se vyhnout dialogu Uložit výstupní soubor jako při přidávání tiskové úlohy do výchozí fronty, ujistěte se, že výchozí tiskárna není Microsoft XPS Document Writer, Microsoft Print to PDFnebo jiné možnosti tisku do souboru.
/// <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
Spropitné
Soubory XPS můžete vytisknout také pomocí:
- PrintDialog.PrintDocument nebo metody PrintDialog.PrintVisual.
- Metody XpsDocumentWriter.Write a XpsDocumentWriter.WriteAsync.
Další informace naleznete v tématu Jak zobrazit dialogové okno tisku a Přehled tisku dokumentů.
Viz také
- PrintQueue.AddJob
- dokumenty ve WPF
- Zobrazení dialogového okna tisku
- Přehled tisku dokumentů
.NET Desktop feedback