XPS 파일을 인쇄하는 방법(WPF .NET)
인쇄 대화 상자를 열지 않고 인쇄 큐에 새 인쇄 작업을 추가하려는 경우가 있습니다. 이러한 작업을 수행하는 PrintQueue.AddJob 메서드 중 하나를 사용할 수 있습니다. 방법은 다음과 같습니다.
다음 예제에서는 AddJob
의 여러 오버로드 중 하나인 AddJob(String, String, Boolean) 메서드를 사용하여 다음을 수행합니다.
- XPS(XML Paper Specification) 문서에 대한 새 인쇄 작업을 기본 인쇄 큐에 추가합니다.
- 새 작업의 이름을 지정합니다.
fastCopy
매개 변수를 사용하여 XPS 문서의 유효성을 검사할지 여부를 지정합니다.
AddJob(String, String, Boolean)
메서드를 사용하는 경우 fastCopy
매개 변수의 값은 다음과 같은 주요 고려 사항입니다.
fastCopy
매개 변수를true
로 설정하는 경우 XPS 유효성 검사를 건너뛰고 페이지별 진행률 피드백 없이 인쇄 작업이 빠르게 스풀됩니다.fastCopy
매개 변수를false
로 설정하면AddJob
메서드를 호출하는 스레드에 단일 스레드 아파트 상태가 있어야 합니다. 그렇지 않으면 예외가 throw됩니다. 자세한 내용은 AddJob(String, String, Boolean)에 대한 설명 섹션을 참조하세요.
큐에 새 인쇄 작업 추가
이 예제에서는 하나 이상의 XPS 문서를 기본 큐에 추가합니다. 코드는 다음을 수행합니다.
AddJob
의 비동기 버전이 없으므로 UI 스레드 차단을 방지하는 데 Task.Run을 사용합니다.fastCopy
매개 변수 값이false
이면 단일 스레드 아파트 상태의 스레드에서 AddJob(String, String, Boolean)을 실행합니다.- LocalPrintServer의 기본 PrintQueue에 대한 참조를 가져옵니다.
- 인쇄 큐 참조에서
AddJob(String, String, Boolean)
을 호출하여 작업 이름, XPS 문서 경로 및fastCopy
매개 변수를 전달합니다.
큐가 일시 중지되지 않고 프린터가 작동 중인 경우 인쇄 작업이 인쇄 큐의 맨 위에 도달하면 인쇄를 자동으로 시작합니다.
팁
인쇄 작업을 기본 큐에 추가할 때 출력 파일을 다른 이름으로 저장 대화 상자가 표시되지 않도록 하려면 기본 프린터가 Microsoft XPS 문서 작성기, Microsoft PDF로 인쇄 또는 기타 파일로 인쇄 옵션이 아닌지 확인합니다.
/// <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
팁
다음을 사용하여 XPS 파일을 인쇄할 수도 있습니다.
- PrintDialog.PrintDocument 또는 PrintDialog.PrintVisual 메서드.
- XpsDocumentWriter.Write 및 XpsDocumentWriter.WriteAsync 메서드.
자세한 내용은 인쇄 대화 상자를 표시하는 방법 및 문서 인쇄 개요를 참조하세요.
참고 항목
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET Desktop feedback