다음을 통해 공유


인쇄 지원 앱 v4 API 디자인 가이드

Print Support App v4 API는 레거시 타사 드라이버 없이 가상 프린터를 쉽게 구현할 수 있도록 가상 프린터 아키텍처를 지원합니다. 이 아키텍처를 통해 ISV(Independent Software Vendor)는 레거시 타사 V3/V4 드라이버에서 현재 지원되는 기능을 구현하는 애플리케이션으로 가상 프린터를 구현할 수 있습니다. 이 문서에서는 애플리케이션이 가상 프린터로 등록하는 방법과 구현에 필요한 PDL 변환 및 UI 요소를 구현하는 방법을 설명합니다.

PSA(인쇄 지원 앱)는 레거시 타사 드라이버를 사용하지 않고 IHV가 IPP 프린터에 사용자 지정을 추가할 수 있도록 하기 위해 도입된 아키텍처입니다. 새 Virtual Printer로 쉽게 전환할 수 있도록 모든 API는 인쇄 지원 앱* API 네임스페이스의 일부이며 가상 프린터 아키텍처에 적용할 수 있는 PSA 계약 중 일부를 다시 사용합니다.

자세한 내용은 다음 문서를 참조하세요.

주제 묘사
인쇄 지원 앱 디자인 가이드 디바이스에 대한 PSA(인쇄 지원 앱)를 구현하는 프린터 OEM 및 IHV에 대한 지침과 예제를 제공합니다.
인쇄 지원 앱 v3 API 디자인 가이드 디바이스에 대한 v3 PSA(인쇄 지원 앱)를 구현하는 프린터 OEM 및 IHV에 대한 지침과 예제를 제공합니다.
인쇄 지원용 가상 프린터에 대한 MSIX 매니페스트 명세서 인쇄 지원 가상 프린터를 구현하는 프린터 OEM 및 IHV에 대한 MSIX 매니페스트 지침 및 예제를 제공합니다.
인쇄 지원 앱 연결 PSA(인쇄 지원 앱)를 프린터와 연결하기 위한 지침과 예제를 제공합니다.

이 문서에서는 소프트웨어 엔드포인트 및 IHV에 필요한 몇 가지 다른 PSA 시나리오를 지원하도록 PSA API를 확장하는 방법을 보여 줍니다.

용어

학기 정의
PSA (미국) 지원 애플리케이션을 인쇄합니다. 이 문서의 API를 사용하는 UWP 앱입니다.
MXDC Microsoft XPS 문서 변환기
MPD 현대적인 인쇄 대화 상자. 이 대화 상자는 앱이 Windows.Graphics.Printing API를 사용하여 인쇄할 때 사용자에게 표시됩니다.
지속적 전문 개발 (Continuous Professional Development) 일반 인쇄 대화 상자. 이 대화 상자는 앱이 Win32 API를 사용하여 인쇄할 때 사용자에게 표시됩니다.
IPP 인터넷 인쇄 프로토콜입니다. 클라이언트 장치에서 프린터와 상호 작용하여 인쇄 기본 설정을 검색하고 설정하고 인쇄할 문서를 보내는 데 사용됩니다.
인쇄 지원 관련 프린터 PSA에 연결된 물리적 IPP 프린터입니다.
IPP 프린터 IPP 프로토콜을 지원하는 프린터입니다.
MSDW Microsoft 문서 작성기
프린터 기본 설정 UI 사용자가 인쇄 시 적용할 프린터와 관련된 기본 설정을 변경할 수 있는 대화 상자입니다. 예를 들어 방향, 용지 크기, 색, 양쪽 인쇄 등이 있습니다.
PDL 페이지 설명 언어입니다. 문서를 프린터로 보내는 형식입니다.
연결된 PSA 프린터 모든 PSA는 실제 IPP 프린터와 연결됩니다.
PDC 프린터 기능을 정의하기 위한 PrintDeviceCapabilities XML 문서 형식입니다.
SoftwareAppMon 새 가상 프린터 큐에 대한 포트 모니터 DLL
PrintSupportExtension PSA 백그라운드 작업은 프린터 제약 조건 확장 기능을 제공합니다.
  • IppPrintDeviceIppPrintDevice Virtual Printer는 PSA API의 일부로 도입된 WinRT 클래스입니다. 가상 프린터는 IPP 프린터 장치로 추가되며, 새로 추가된 가상 프린터에 대해 IppPrinterDevice::IsIppPrinter 는 true를 반환합니다. 이 작업은 PDL 통과가 가상 프린터 및 IPP 프린터 모두에서 원활하게 작동하고 이미 있는 PSA API 표면의 대부분을 다시 사용할 수 있도록 수행됩니다. IppPrintDevice 클래스 함수(GetPrinterAttributesAsBuffer, GetPrinterAttributes, SetPrinterAttributesFromBufferSetPrinterAttributes)는 가상 프린터에 따라 변경됩니다. GetPrinterAttributesAsBufferGetPrinterAttributes는 전달된 IPP 특성에 대해 항상 지원되지 않음을 반환하고, SetPrinterAttributesFromBufferSetPrinterAttributes는 항상 가상 프린터에 대해 액세스 거부 오류로 설정된 오류 결과를 반환합니다. Virtual Printers는 appx 매니페스트에서만 PDC를 지정하고 IPP 프린터 특성을 지원하지 않기 때문입니다.

  • 가상 프린터에 대한 Windows.printSupportSettingsUI 계약을 - 재사용하는 것은 PSA를 통해 IPP 프린터 사용자에게 사용자 지정 인쇄 기본 설정 UI를 표시하기 위해 도입된 UI 계약의 일부입니다. 이 문서의 인쇄 지원 앱 v4 API 샘플은 동일한 계약을 다시 사용하여 변경 없이 가상 프린터용 UI에 대한 사용자 지정 인쇄 기본 설정을 지원합니다.

  • windows.printSupportJobUI 계약 재활용은 가상 프린터 - Windows.printSupportJobUI에서 PSA가 사용자 입력을 원하거나 사용자가 인쇄 미리 보기를 볼 수 있도록 사용자 인터페이스를 보여주는 PSA의 일부로 도입된 UI 계약입니다. 이 계약은 가상 프린터가 입력을 위해 사용자에게 UI를 표시하거나 미리 보기를 표시하기 위해 다시 사용합니다. 자세한 내용은 Windows.printSupportJobUI 계약의 API 변경 내용에 대한 소프트웨어 엔드포인트 UI 샘플 참조하세요.

  • windows.printSupportExtension 가상 프린터 - Windows.printSupportExtension 재사용은 PSA의 일부로 도입된 백그라운드 계약입니다. 이 계약은 PSA가 사용자 지정 인쇄 티켓 검증 및 기타 기능을 사용하고자 할 때 활용할 수 있습니다. 또한 앱이 인쇄 티켓 또는 PDC 다시 생성에 대한 사용자 지정 유효성 검사를 수행하려는 경우 가상 프린터에서 이 계약을 다시 사용할 수 있습니다.

다음 다이어그램에서는 Virtual Printer의 인쇄 워크플로를 설명합니다.

가상 프린터의 인쇄 워크플로를 보여 주는 이미지 .

이 섹션에서는 appx 매니페스트 항목을 사용하여 Virtual Printer를 설치하는 방법과 다양한 시나리오에서 가상 프린터를 호출하는 방법을 설명합니다.

windows. PrintSupportVirtualPrinterWorkflow 계약

앱이 가상 프린터로 등록하려면 UWP appx 패키지 또는 MSIX 설치 관리자포함된 XML 매니페스트가 있어야 합니다.

다음 샘플은 Virtual Printer에 대한 Appx 매니페스트 및 각 필드가 참조하는 항목에 대한 설명입니다.

<Extensions>
    <printsupport2:Extension Category="windows.printSupportVirtualPrinterWorkflow" EntryPoint="Tasks.PrintSupportWorkflowBackgroundTask">
        <printsupport2:PrintSupportVirtualPrinter DisplayName="ms-resource://PRINTER_NAME1" PrinterUri="contoso-psa:printer1" PreferredInputFormat="application/postscript" OutputFileTypes="ps;pdf" PdcFile="Config\PRINTER_PDC1.xml" PdrFile="Config\PRINTER_PDR1.xml">
            <printsupport2:SupportedFormats>
                <printsupport2:SupportedFormat Type="application/postscript" />
                <printsupport2:SupportedFormat Type="application/pdf" MaxVersion="1.7" />
            </printsupport2:SupportedFormats>
        </printsupport2:PrintSupportVirtualPrinter>
    </printsupport2:Extension>
    <printsupport2:Extension Category="windows.printSupportVirtualPrinterWorkflow" EntryPoint="Tasks.PrintSupportWorkflowBackgroundTask">
        <printsupport2:PrintSupportVirtualPrinter DisplayName="ms-resource://PRINTER_NAME2" PrinterUri ="contoso-psa:printer2" PreferredInputFormat="application/oxps" OutputFileTypes="pwgr;pdf" PdcFile=" Config\PRINTER_PDC2.xml" PdrFile=" Config\PRINTER_PDR2.xml">
            <printsupport2:SupportedFormats>
                <printsupport2:SupportedFormat Type="application/pdf" MaxVersion="1.7" />
            </printsupport2:SupportedFormats>
        </printsupport2:PrintSupportVirtualPrinter>
    </printsupport2:Extension>
    <printsupport:Extension Category="windows.printSupportExtension" EntryPoint="Tasks.PrintSupportExtensionBackGroundTask"/>
    <printsupport:Extension Category="windows.printSupportSettingsUI" EntryPoint="PrintSupportApp.App"/>
    <printsupport:Extension Category="windows.printSupportJobUI" EntryPoint="PrintSupportApp.App"/>
</Extensions>

가상 프린터 큐를 설치하는 데 사용되는 계약이며 설치된 Virtual Printer의 백그라운드 엔드포인트 역할을 할 수도 있습니다. 단일 appx 매니페스트는 동일한 설치된 애플리케이션과 연결된 여러 인쇄 큐를 설치할 수 있습니다. 사용자가 새 가상 프린터 큐에 인쇄하면 가상 프린터 애플리케이션이 백그라운드에서 시작되고 PrintWorkflowVirtualPrinterDataAvailableEventArgs 런타임 클래스를 이벤트 인수로 사용하여 이벤트를 발생시킵니다. 런타임 클래스에는 PDL 데이터를 읽는 API, 필요한 경우 애플리케이션에 대한 UI 시작 등이 있습니다.

  • PrintSupportVirtualPrinter - 각 항목은 애플리케이션과 함께 설치할 하나의 소프트웨어 엔드포인트 인쇄 큐를 지정합니다.

  • PreferredInputFormat - 이 필드는 가상 프린터에 대한 기본 설정 입력 PDL 형식을 나타냅니다. Windows 인쇄 시스템은 모든 인쇄 경로에 대한 PDL 데이터를 Virtual Printer에 제공하기 전에 이 형식을 생성합니다. 필드는 application/oxps 또는 application/postscript 값만 사용할 수 있습니다. 이 필드에 다른 형식을 지정하면 설치가 실패합니다. 필드를 지정하지 않으면 application/oxps가 설치된 Virtual Printer의 기본 입력 PDL 형식으로 설정됩니다.

  • OutputFileTypes - 이 필드를 appx 매니페스트에 지정하면 Windows 인쇄 시스템은 파일 프린터로 지정된 프린터 큐를 만들고, 응용 프로그램이 Virtual Printer로 인쇄 작업을 시작할 때 사용자는 '다른 이름으로 저장하기' 대화 상자를 보게 됩니다. 이 필드의 값은 pdf/pwgr/ps 등과 같은 대상 파일 확장자를 포함해야 합니다. 이러한 값은 드라이버 데이터에 저장되며, 저장 대화 상자에 허용되는 확장자로 추가됩니다. Windows 인쇄 시스템은 사용자가 선택한 파일에 대해 StorageFile 클래스를 생성하고, 이벤트 인수 API의 일부로서 가상 프린터 앱에 제공됩니다. 가상 프린터에서 파일 인쇄 동작을 원하지 않는 경우(클라우드에 인쇄 데이터를 저장하는 Virtual Printer 또는 OneNote와 같은 응용 프로그램에 데이터를 보내는 프린터 포함) 이 필드를 매니페스트에 추가하면 안 됩니다.

인쇄 출력 저장을 대화 상자로 표시하는 이미지를 .

  • 지원되는 형식 - Virtual Printer는 이 필드를 사용하여 처리할 수 있는 모든 PDL 형식을 지정할 수 있습니다. Microsoft Edge와 같은 통과 인쇄 애플리케이션에 사용되어 PDF와 같은 지원되는 형식을 식별하고 Windows 인쇄 시스템에서 변경 없이 PDF 스트림을 가상 프린터에 직접 전달합니다. 이 필드에는 SupportedFormat이 자식 필드로 있습니다. SupportedFormat에는 지원되는 MIME 형식을 지정하는 필드 형식이 있으며 MaxVersion 필드에는 Virtual Printer에서 받을 수 있는 PDL 형식의 최대 버전이 지정됩니다. MaxVersion 값은 MajorVersion.MinorVersion 형식이어야 합니다. 다른 형식인 경우 Windows 인쇄 시스템이 프린터 설치에 실패합니다. MajorVersion 및 MinorVersion은 숫자여야 하며, 문자가 포함되면 해당 버전 필드는 무효화되고 무시됩니다.

  • PdcFile - 이 필드는 애플리케이션 패키지 내의 리소스 파일을 가리킵니다. 파일에는 프린터 기능을 정의하는 데 사용되며 사용자 지정 기능, 옵션 또는 매개 변수를 정의하는 데 사용해야 하는 인쇄 장치 기능 xml 형식의 내용이 포함되어야 합니다. 이 필드는 필수 필드이며, 값이 없거나 파일 내용이 유효한 PDC 형식이 아닌 경우 프린터 설치가 실패합니다.

  • PdrFile - 제공된 경우 이 필드는 애플리케이션 패키지 내의 리소스 파일을 가리킵니다. 파일에는 Xml 형식의 인쇄 디바이스 리소스가 포함되어야 합니다. 앱에서 사용자 지정 인쇄 기본 설정을 지역화하려는 경우 이 필드를 제공해야 합니다. 이 필드는 선택 사항이며 인쇄 기본 설정에 대한 리소스 지역화는 이 필드가 없는 경우 인쇄 시스템에서 수행합니다.

  • displayName - 설치된 가상 프린터 큐의 이름을 지정합니다. 이 문자열의 제한 사항은 Windows 프린터 이름에 대한 제한 사항과 동일합니다.

  • PrinterUri - PSA 애플리케이션에서 프린터를 식별하는 데 사용할 수 있는 고유한 URI를 지정합니다. 단일 Virtual Printer 앱은 여러 소프트웨어 엔드포인트를 지정하여 여러 프린터를 설치할 수 있습니다. PrinterUri 필드를 사용하여 이러한 프린터를 구분할 수 있습니다. 이는 IppPrintDevice::P rinterUri API의 출력으로 제공됩니다. URI를 지정하지 않으면 Windows에서 프린터에 임의의 고유 URI를 할당합니다.

PDF 및 XPS 프린터용 간단한 소프트웨어 엔드포인트 샘플

이 샘플에서는 PDF로 인쇄 및 XPS에 인쇄라는 두 개의 엔드포인트를 등록한 소프트웨어 엔드포인트 앱의 백그라운드 작업을 보여 줍니다. 샘플은 세션에서 VirtualPrinterDataAvailable 이벤트에 등록한 후 호출을 시작합니다. 이벤트가 발생하면 이벤트 매개변수에는 PDL 스트림, 대상 파일, UI 실행 도구, 그리고 PDL 변환기가 포함됩니다. 앱은 입력 PDL 형식을 프린터에 따라 PDF 또는 XPS로 변환하고 결과 콘텐츠를 대상 파일 출력 스트림에 씁니다.

public class VirtualPrinterBackgroundTask
{    
    private BackgroundTaskDeferral taskDeferral;
    private IppPrintDevice printDevice;

    public void Run(IBackgroundTaskInstance taskInstance)
    {
        var virtualPrinterDetails = taskInstance.TriggerDetails as PrintWorkflowVirtualPrinterTriggerDetails;
        taskDeferral = taskInstance.GetDeferral();

        PrintWorkflowVirtualPrinterSession session = virtualPrinterDetails.VirtualPrinterSession;
        session.VirtualPrinterDataAvailable += VirtualPrinterDataAvailable;
        // Get print device for the session
        printDevice = session.Printer;

        // Make sure to register all the event handlers before PrintWorkflowVirtualPrinterSession.Start is called.
        session.Start();
    }

    private async void VirtualPrinterDataAvailable(PrintWorkflowVirtualPrinterSession sender, PrintWorkflowVirtualPrinterDataAvailableEventArgs args)
    {
        PrintWorkflowSubmittedStatus jobStatus = PrintWorkflowSubmittedStatus.Failed;
        try
        {
            PrintWorkflowPdlSourceContent sourceContent = args.SourceContent;
            // This Software Print Support App always expect input as OXPS and to have target file to be present.
            if (sourceContent.ContentType != "application/oxps")
            {
                throw new InvalidDataException();
            }

                
            if (this.printDevice.PrinterUri.AbsolutePath == "print-to-pdf")
            {
                // For print-to-pdf endpoint converts OXPS to PDF and write the pdf contents to target file.

                // Get target file output stream.
                StorageFile targetFile = await args.GetTargetFileAsync();
                IRandomAccessStream outputStream = await targetFile.OpenAsync(FileAccessMode.ReadWrite);
                // Get XPS to PDF PDL converter.
                PrintWorkflowPdlConverter converter = args.GetPdlConverter(PrintWorkflowPdlConversionType.XpsToPdf);
                // Convert XPS to PDF and write contents to outputStream.
                await converter.ConvertPdlAsync(args.GetJobPrintTicket(), sourceContent.GetInputStream(), outputStream.GetOutputStreamAt(0));
                // Complete Endpoint print job.
                jobStatus = PrintWorkflowSubmittedStatus.Succeeded;
            }
            else if (this.printDevice.PrinterUri.AbsolutePath == "print-to-xps")
            {
                // For print-to-xps endpoint directly write input XPS file contents to target file.

                // Get target file output stream.
                StorageFile targetFile = await args.GetTargetFileAsync();
                IRandomAccessStream outputStream = await targetFile.OpenAsync(FileAccessMode.ReadWrite);
                // Copy XPS input stream to target file output stream.
                await RandomAccessStream.CopyAndCloseAsync(sourceContent.GetInputStream(), outputStream.GetOutputStreamAt(0));
                // Complete Endpoint print job.
                jobStatus = PrintWorkflowSubmittedStatus.Succeeded;

            }
            else
            {
                // This Print Support App only has print-to-pdf and print-to-xps printers, 
                throw new InvalidDataException();
            }
        }
        finally
        {
            args.CompleteJob(jobStatus);
            taskDeferral.Complete();
        }
    }
}

소프트웨어 엔드포인트 백그라운드 작업에서 UI 시작

인쇄 지원 앱 v4 API는 소프트웨어 엔드포인트 백그라운드 작업이 필요한 경우 사용자에게 UI를 표시하는 기능을 제공합니다. 기존 PSA API PrintWorkflowUILauncher 클래스를 사용합니다. 백그라운드 작업이 LaunchAndCompleteUIAsync 함수를 호출하면, 앱이 Windows.printSupportJobUI기존 PSA 계약을 사용하여 UI 컨텍스트에서 시작됩니다. 자세한 내용은 소프트웨어 엔드포인트 UI 샘플참조하세요.

private async void Session_VirtualPrinterDataAvailable(PrintWorkflowVirtualPrinterSession sender, PrintWorkflowVirtualPrinterDataAvailableEventArgs args)
{
    PrintWorkflowSubmittedStatus jobStatus = PrintWorkflowSubmittedStatus.Failed;

    try
    {
        WorkflowPrintTicket printTicket = args.GetJobPrintTicket();

        bool uiRequired = this.IsUIRequired(printTicket);

        if (!uiRequired)
        {
            // Process content directly if UI is not required
            await this.ProcessContent(args);
           jobStatus = PrintWorkflowSubmittedStatus.Succeeded;
        }
        else if (args.UILauncher.IsUILaunchEnabled())
        {
            // LaunchAndCompleteUIAsync will launch the UI and wait for it to complete before returning 
            PrintWorkflowUICompletionStatus status = await args.UILauncher.LaunchAndCompleteUIAsync();

            if (status == PrintWorkflowUICompletionStatus.Completed)
            {
                await this.ProcessContent(args);
              jobStatus = PrintWorkflowSubmittedStatus.Succeeded;
            }
            else if (status == PrintWorkflowUICompletionStatus.UserCanceled)
            {
                // Log user cancellation and cleanup here.
              jobStatus = PrintWorkflowSubmittedStatus. Canceled;
            }
        }
    }
    finally
    {
        args.CompleteJob(jobStatus);
        taskDeferral.Complete();
    }
}

bool IsUIRequired(WorkflowPrintTicket printDevice)
{
    bool isUIRequired = false;
    // Determine UI needs to be shown to the user for this printer
    // Ex: Show UI to get credentials from the user for storing data onto the cloud
    return isUIRequired;
}

async Task ProcessContent(PrintWorkflowVirtualPrinterDataAvailableEventArgs args)
{
    // Process and write pdl contents to target file
    PrintWorkflowPdlSourceContent sourceContent = args.SourceContent;
    StorageFile targetFile = await args.GetTargetFileAsync();
    IRandomAccessStream outputStream = await targetFile.OpenAsync(FileAccessMode.ReadWrite);
    // Copy XPS input stream to target file output stream.
    await RandomAccessStream.CopyAndCloseAsync(sourceContent.GetInputStream(), outputStream.GetOutputStreamAt(0));
}

소프트웨어 엔드포인트 UI 샘플

이 샘플에서는 소프트웨어 엔드포인트 백그라운드 작업에서 UI 시작을 지원하도록 수정된 PSA UI 계약을 보여줍니다. PrintWorkflowJobUISession 클래스가 새 이벤트 VirtualPrinterUIDataAvailable을(를) 갖도록 수정되었습니다. 소프트웨어 엔드포인트 백그라운드 작업에서 UI가 시작되면 새 이벤트가 호출됩니다. 애플리케이션은 이벤트 인수에서 제공하는 PDL 원본 컨텍스트를 사용하여 사용자에게 미리 보기를 표시할 수 있습니다.

namespace PsaSampleAppV4
{
    sealed partial class App : Application
    {
        protected override void OnActivated(IActivatedEventArgs args)
        {
            if (args.Kind == ActivationKind.PrintSupportJobUI)
            {
                var rootFrame = new Frame();

                rootFrame.Navigate(typeof(JobUIPage));
                Window.Current.Content = rootFrame;
        
                var jobUI = rootFrame.Content as JobUIPage;

                // Get the activation arguments
                var workflowJobUIEventArgs = args as PrintWorkflowJobActivatedEventArgs;

                PrintWorkflowJobUISession session = workflowJobUIEventArgs.Session;
               session.PdlDataAvailable += jobUI.OnPdlDataAvailable;
               session.JobNotification += jobUI.OnJobNotification;
               session.VirtualPrinterUIDataAvailable += jobUI.VirtualPrinterUIDataAvailable;
                // Start firing events
                session.Start(); 
            }
        }
    }
}

namespace PsaSampleAppV4
{
    public sealed partial class JobUIPage : Page
    {
        public JobUIPage()
        {
            this.InitializeComponent();
        }

        public void VirtualPrinterUIDataAvailable (PrintWorkflowJobUISession session, PrintWorkflowVirtualPrinterUIEventArgs args)
        {
            using (args.GetDeferral())
            {
                string jobTitle = args.Configuration.JobTitle;
                string sourceApplicationName = args.Configuration.SourceAppDisplayName;            
                string printerName = args.Printer.PrinterName;

                // Get pdl stream and content type
                IInputStream pdlContent = args.SourceContent.GetInputStream();
                string contentType = args.SourceContent.ContentType;
                this.ShowPrintPreview(jobTitle, pdlContent, contentType);
            }
        }

        private void ShowPrintPreview(string jobTitle, IInputStream pdlContent, string contentType)
        {
             // Show preview to the user
        }
    }
}

프린터 구성을 업데이트하는 소프트웨어 엔드포인트

소프트웨어 엔드포인트는 사용자가 설정을 변경할 때 프린터 구성을 변경할 수 있습니다. 이를 용이하게 하기 위해 RefreshPrintDeviceCapabilities 함수가 IppPrintDevice WinRT 클래스에 추가됩니다. 이 함수를 호출하면 앱이 현재 인쇄 장치 기능을 업데이트할 수 있는 PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged 이벤트를 호출합니다.

private void UpdatePrintDeviceCapabilites(string printerName)
{
    IppPrintDevice printer = IppPrintDevice.FromPrinterName(printerName);
    // Call RefreshPrintDeviceCapabilities results in Print Device Capabilites Changed event to be raised
    printer.RefreshPrintDeviceCapabilities();
}

기본 사용자 인쇄 티켓 가져오기 및 변경

PSA 앱이 시작 메뉴에서 실행될 때, IHV(하드웨어 벤더)가 기본 인쇄 설정을 표시하고 수정하고 싶을 수 있습니다. 이러한 이유로 UserDefaultPrintTicket 속성이 IppPrintDevice WinRT 클래스에 추가됩니다. 모든 애플리케이션에서 이 속성을 사용하여 사용자 기본 인쇄 티켓을 가져오고 설정할 수 있습니다.

// Returns false if the application is not allowed to modify the print ticket
private bool TryModifyDefaultPrintTicket(string printerName)
{
    IppPrintDevice printer = IppPrintDevice.FromPrinterName(printerName);
    WorkflowPrintTicket printTicket =  printer.UserDefaultPrintTicket;

    if (printer.CanModifyUserDefaultPrintTicket)
    {
        printer.UserDefaultPrintTicket = this.ShowPrintTicketOptions(printTicket);
        return true;
    }
    return false;
}

private WorkflowPrintTicket ShowPrintTicketOptions(WorkflowPrintTicket printTicket)
{
    // Show Print Tickets options to the user for modification

    // return Modified print ticket
    return printTicket;
}

작업 속성을 다루기 쉽게 만들기

생성된 작업 요청을 프린터로 보내기 전에 IHV가 특정 특성을 제거하려는 경우 프린터에서 작업을 만드는 데 필요한 전체 작업 특성을 만들기 어려울 수 있습니다. ConvertPrintTicketToJobAttributes이 프린터 티켓에 대한 IPP 특성을 얻기 위해 Winrt 클래스 PrintWorkflowPrintJob에 추가됩니다. 다음 샘플에서는 PSA가 인쇄 티켓에서 IPP 속성을 가져오고, '미디어 크기' 속성을 제거하는 방법을 보여줍니다. 그런 다음, 해당 속성은 PDL 콘텐츠의 일부로 프린터에 전송됩니다.

 private async void OnPdlModificationRequested(PrintWorkflowJobBackgroundSession sender, PrintWorkflowPdlModificationRequestedEventArgs args)
 {
     //....
     PrintWorkflowPrinterJob printjob = args.PrinterJob;
     string pdlFormat = this.GetPdlFormat(printjob.Printer);

     IDictionary<string, IppAttributeValue> attributes = printjob.ConvertPrintTicketToJobAttributes(printjob.GetJobPrintTicket(), pdlFormat);
     var operationalAttributes = new Dictionary<string, IppAttributeValue>();

     PrintWorkflowPdlTargetStream targetStream = args.CreateJobOnPrinterWithAttributes(this.RemoveMediaSize(attributes), pdlFormat,
         operationalAttributes, PrintWorkflowAttributesMergePolicy.DoNotMergeWithPrintTicket,
         PrintWorkflowAttributesMergePolicy.MergePreferPrintTicketOnConflict);

     //.....
 }

 // Remove Media size from attributes as media size will sent to the printer as part of the PDL header
 private IDictionary<string, IppAttributeValue> RemoveMediaSize(IDictionary<string, IppAttributeValue> attributes)
{
    IppAttributeValue mediaCol = null;

    if (attributes.TryGetValue("media-col", out mediaCol))
    {
        var newMediaCol = new Dictionary<string, IppAttributeValue>(mediaCol.GetCollectionArray()[0]);
        newMediaCol.Remove("media-size");
        attributes["media-col"] = IppAttributeValue.CreateCollection(newMediaCol);
    }

    return attributes;
}

 private string GetPdlFormat(IppPrintDevice printer)
 {
     string pdlFormat = "application/pdf";
     // Get preferred PDL format from printer
     return pdlFormat;
}

페이지 출력 품질에 따라 MXDC의 이미지 품질 구성

현재 레거시 타사 V4 인쇄 드라이버는 페이지 품질에 따라 MXDC에서 생성된 이미지 품질을 지정할 수 있습니다. 자세한 내용은 V4 드라이버 매니페스트을 참조하세요.

레거시 타사 V3/V4 드라이버의 사용을 중단하기 위해 앞으로 PSA API를 사용하여 이 기능에 대한 패리티를 제공해야 합니다. 이러한 이유로 PSA v4 API는 이미지 품질 구성을 가져오고 설정하기 위한 WinRT 클래스를 제공합니다.

private void PrintDeviceCapabilitiesChanged(PrintSupportExtensionSession sender, PrintSupportPrintDeviceCapabilitiesChangedEventArgs args)
{
    //....
    this.SetImageQualityForPrinter(this.printDevice, args.MxdcImageQualityConfiguration);
    //....
}

private void SetImageQualityForPrinter(IppPrintDevice printDevice, PrintSupportMxdcImageQualityConfiguration mxdcImageQualityConfiguration)
{
    //....
    // Set image quality for large scale printer
    mxdcImageQualityConfiguration.TextOutputQuality = XpsImageQuality.JpegHighCompression;
    mxdcImageQualityConfiguration.DraftOutputQuality = XpsImageQuality.JpegMediumCompression;
    mxdcImageQualityConfiguration.NormalOutputQuality = XpsImageQuality.JpegLowCompression;
    mxdcImageQualityConfiguration.HighOutputQuality = XpsImageQuality.Png;
    mxdcImageQualityConfiguration.PhotographicOutputQuality = XpsImageQuality.Png;
    mxdcImageQualityConfiguration.AutomaticOutputQuality = XpsImageQuality.JpegMediumCompression;
    mxdcImageQualityConfiguration.FaxOutputQuality = XpsImageQuality.JpegMediumCompression;
}

앱 WinAppSdk에서 PrintSupportSettingUI 계약 구현

Print Support App v4 API는 PrintSupportSettingsActivatedEventArgs Winrt 클래스에 OwnerWindowId속성을 도입합니다. Windows 앱 SDK 애플리케이션은 해당 창을 지정된 OwnerWindowId 창에 모달로 만드는 작업을 담당합니다.

protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs a)
{
    AppActivationArguments args = Microsoft.Windows.AppLifecycle.AppInstance.GetCurrent().GetActivatedEventArgs();

    if (args.kind == ExtendedActivationKind.PrintSupportSettingsUI)
    {
        var settingsArgs = args.Data as PrintSupportSettingsActivatedEventArgs;
        Microsoft.UI.WindowId ownerWindowId;
        ownerWindowId.Value = settingsArgs.OwnerWindowId.Value;
        var ownerHwnd = Microsoft.UI.Win32Interop.GetWindowFromWindowId(ownerWindowId);
        this.CreateAppWindowAsModel(ownerHwnd);
    }
}

비고

이 문서의 샘플은 개발자가 PSA API 워크플로에 익숙하다는 가정 하에 PSA v1, PSA v2 API 및 PSA v3 API의 샘플을 기반으로 빌드됩니다.

이 문서에는 인쇄 지원 앱 디자인 가이드 및 windows.Graphics.Printing.PrintSupport 네임스페이스에 설명된 기존 공용 인쇄 지원 애플리케이션 API에 대한 확장이 포함되어 있습니다. PSA API를 사용하면 프린터 제조업체가 사용자 지정 드라이버를 개발할 필요 없이 기본 Microsoft IPP 클래스 드라이버를 사용하는 동안 Windows 사용자의 인쇄 환경을 개선할 수 있는 UWP 앱을 개발할 수 있습니다.

인쇄 구성 요소는 PSA 브로커 프로세스를 통해 PSA 앱과 통신합니다.

인쇄티켓을 작업속성으로 변환

윈도우에서 타사 프린터 드라이버 서비스 중단 계획

getPrinterAttributesAsBuffer

getPrinterAttributes

IppPrintDevice

IppPrinterDevice::IsIppPrinter

IppPrintDevice::PrinterUri

LaunchAndCompleteUIAsync

OwnerWindowId

PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged

PrintSupportSettingsActivatedEventArgs

printWorkflowJobUISession

printWorkflowPrintJob

인쇄 워크플로우 UI 실행기

RefreshPrintDeviceCapabilities

SetPrinterAttributes

SetPrinterAttributesFromBuffer

소프트웨어 엔드포인트 UI 샘플

StorageFile

UserDefaultPrintTicket

가상 프린터 데이터 사용 가능

VirtualPrinterUIDataAvailable

windows.Graphics.Printing.PrintSupport