다음을 통해 공유


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 문서를 기본 큐에 추가합니다. 코드는 다음을 수행합니다.

  1. AddJob의 비동기 버전이 없으므로 UI 스레드 차단을 방지하는 데 Task.Run을 사용합니다.
  2. fastCopy 매개 변수 값이 false이면 단일 스레드 아파트 상태의 스레드에서 AddJob(String, String, Boolean)을 실행합니다.
  3. LocalPrintServer의 기본 PrintQueue에 대한 참조를 가져옵니다.
  4. 인쇄 큐 참조에서 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 파일을 인쇄할 수도 있습니다.

자세한 내용은 인쇄 대화 상자를 표시하는 방법문서 인쇄 개요를 참조하세요.

참고 항목