Jak wydrukować plik XPS (WPF .NET)
Czasami należy dodać nowe zadanie drukowania do kolejki wydruku bez otwierania okna dialogowego drukowania. W tym celu można użyć jednej z metod PrintQueue.AddJob. Oto jak to zrobić.
W poniższym przykładzie użyjemy metody AddJob(String, String, Boolean), jednej z kilku przeciążeń AddJob
, aby:
- Dodaj nowe zadanie drukowania dokumentu specyfikacji papieru XML (XPS) do domyślnej kolejki wydruku.
- Nadaj nazwę nowemu zadaniu.
- Określ, czy dokument XPS ma zostać zweryfikowany (przy użyciu parametru
fastCopy
).
W przypadku korzystania z metody AddJob(String, String, Boolean)
wartość parametru fastCopy
jest kluczową kwestią:
- Jeśli ustawisz parametr
fastCopy
natrue
, walidacja XPS zostanie całkowicie pominięta, a zadanie drukowania będzie szybko buforowane, bez informacji zwrotnej dotyczącej postępu strony po stronie. - Jeśli ustawisz parametr
fastCopy
nafalse
, wątek wywołujący metodęAddJob
musi mieć stanu mieszkania jednowątkowego, w przeciwnym razie zostanie zgłoszony wyjątek. Aby uzyskać więcej informacji, zobacz sekcję Uwagi dla AddJob(String, String, Boolean).
Dodawanie nowych zadań drukowania do kolejki
W tym przykładzie do kolejki domyślnej zostanie dodany co najmniej jeden dokument XPS. Kod będzie:
- Użyj Task.Run, aby uniknąć blokowania wątku interfejsu użytkownika — ponieważ brak asynchronicznej wersji
AddJob
. - Jeśli wartość parametru
fastCopy
jestfalse
, uruchom AddJob(String, String, Boolean) w wątku z jednowątkowy stan mieszkania. - Uzyskaj odwołanie do domyślnego PrintQueue w LocalPrintServer.
- Wywołaj referencję kolejki wydruku
AddJob(String, String, Boolean)
, przekazując do niej nazwę zadania, ścieżkę do dokumentu XPS i parametrfastCopy
.
Jeśli kolejka nie jest wstrzymana i drukarka działa, zadanie drukowania rozpocznie się automatycznie po osiągnięciu górnej części kolejki wydruku.
Napiwek
pl-PL: Aby uniknąć okna dialogowego Zapisz plik wyjściowy jako podczas dodawania zadania drukowania do kolejki domyślnej, upewnij się, że drukarka domyślna nie jest Microsoft XPS Document Writer, Microsoft Print to PDF, lub inną opcją drukowania do pliku.
/// <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
Napiwek
Możesz również drukować pliki XPS przy użyciu:
- PrintDialog.PrintDocument lub metody PrintDialog.PrintVisual.
- metody XpsDocumentWriter.Write i XpsDocumentWriter.WriteAsync.
Aby uzyskać więcej informacji, zobacz Jak wyświetlić okno dialogowe drukowania oraz Omówienie drukowania dokumentów.
Zobacz też
.NET Desktop feedback