Partilhar via


Guia de design da API do aplicativo de suporte de impressão v4

A API do Print Support App v4 suporta uma arquitetura de impressora virtual para facilitar a implementação de impressoras virtuais sem drivers herdados de terceiros. Através dessa arquitetura, um ISV (Independent Software Vendor) é capaz de implementar uma impressora virtual como um aplicativo que implementa os recursos atualmente suportados por drivers V3/V4 herdados de terceiros. O artigo descreve como um aplicativo pode se registrar como uma impressora virtual e como implementar a conversão PDL e os elementos da interface do usuário necessários para a implementação.

O Print Support App (PSA) é a arquitetura que foi introduzida para ajudar os IHVs a adicionar personalização a impressoras IPP sem o uso de drivers de terceiros herdados. Para facilitar a transição para a nova Impressora Virtual, todas as APIs fazem parte do namespace da API do Aplicativo de Suporte de Impressão* e reutilizam alguns dos contratos PSA aplicáveis à arquitetura da Impressora Virtual.

Para obter mais informações, consulte os seguintes artigos:

Tópico Descrição
Guia de design do aplicativo de suporte de impressão Fornece orientações e exemplos para OEMs e IHVs de impressoras que estão implementando um aplicativo de suporte de impressão (PSA) para seus dispositivos.
Guia de design da API Print Support App v3 Fornece orientações e exemplos para OEMs e IHVs de impressoras que estão implementando um aplicativo de suporte de impressão (PSA) v3 para seus dispositivos.
Especificação do Manifesto MSIX para Impressora Virtual de Suporte a Impressão Fornece orientação de manifesto MSIX e exemplos para OEMs e IHVs de impressoras que estão a implementar suporte de impressão em impressora virtual.
Associação de aplicativos de suporte de impressão Fornece orientações e exemplos para associar uma aplicação de suporte de impressão (PSA) a uma impressora.

Este artigo mostra como as APIs PSA são estendidas para oferecer suporte ao Software Endpoint e a alguns outros cenários PSA exigidos por IHVs.

Terminologia

Prazo Definição
PSA Aplicação de Suporte de Impressão. Aplicativo UWP que usa a API neste documento.
MXDC Conversor de documentos Microsoft XPS
MPD Caixa de diálogo de impressão moderna. Essa caixa de diálogo é mostrada ao usuário quando um aplicativo está imprimindo usando a API Windows.Graphics.Printing.
DPC Caixa de diálogo de impressão comum. Essa caixa de diálogo é mostrada ao usuário quando o aplicativo está imprimindo usando a API do Win32.
IPP Protocolo de impressão pela Internet. Usado a partir de um dispositivo cliente para interagir com a impressora para recuperar e definir preferências de impressão e enviar o documento a ser impresso.
Impressora associada ao suporte de impressão Impressora IPP física vinculada à PSA.
Impressora IPP Impressora que suporta o protocolo IPP.
MSDW Gravador de Documentos da Microsoft
Preferências da interface da impressora Caixa de diálogo onde o usuário pode alterar as preferências relacionadas a uma impressora que seriam aplicadas no momento da impressão. Os exemplos incluem orientação, tamanho do papel, cor, impressão em ambos os lados e assim por diante.
PDL Linguagem de descrição da página. O formato em que um documento é enviado para a impressora.
Impressora associada PSA Cada PSA está associado a uma impressora IPP física.
PDC Formato de documento XML PrintDeviceCapabilities para definir os recursos da impressora.
SoftwareAppMon DLL do monitor de porta para nova fila de impressão virtual
PrintSupportExtension A tarefa em segundo plano do PSA é responsável por fornecer capacidades de extensão de restrições da impressora.
  • Virtual Printer como IppPrintDevice - IppPrintDevice é uma classe Winrt introduzida como parte das APIs PSA. A impressora virtual é adicionada como um dispositivo de impressora IPP e IppPrinterDevice::IsIppPrinter retorna true para a impressora virtual recém-adicionada. Isso é feito para que a passagem PDL funcione perfeitamente para impressoras virtuais e impressoras IPP e para reutilizar grande parte da superfície da API PSA que já está presente. As funções da classe IppPrintDevice (GetPrinterAttributesAsBuffer, GetPrinterAttributes, SetPrinterAttributesFromBuffere SetPrinterAttributes) são alteradas em conformidade com a Impressora Virtual. GetPrinterAttributesAsBuffer e GetPrinterAttributes sempre retornam sem suporte para qualquer atributo IPP passado e SetPrinterAttributesFromBuffer e SetPrinterAttributes sempre retornam resultado de erro com o erro definido como acesso negado para impressoras virtuais. Isso ocorre porque as impressoras virtuais especificam apenas PDC no manifesto appx e não suportam nenhum atributo de impressora IPP.

  • reutilização do contrato Windows.printSupportSettingsUI para Impressora Virtual - Windows.printSupportSettingsUI é um contrato de interface de utilizador introduzido como parte do PSA para apresentar ao utilizador as preferências de impressão personalizadas para a impressora IPP através do PSA. Os exemplos de API do aplicativo de suporte de impressão v4 neste artigo reutilizam o mesmo contrato para oferecer suporte a preferências de impressão personalizadas para a interface do usuário da impressora virtual sem alterações.

  • reutilização do contrato windows.printSupportJobUI para Impressora Virtual - Windows.printSupportJobUI é um contrato de interface do utilizador introduzido como parte do PSA para mostrar a interface no caso de o PSA requerer a entrada do utilizador ou mostrar a pré-visualização de impressão. Este contrato é reutilizado para que a Impressora Virtual mostre a interface ao utilizador para entradas ou para pré-visualização. Para obter mais informações, consulte o de exemplo da interface do usuário do Software Endpoint para as alterações feitas nas APIs no contrato de Windows.printSupportJobUI.

  • reutilização do contrato Windows.printSupportExtension para Impressora Virtual - Windows.printSupportExtension é um contrato em segundo plano introduzido como parte do PSA que pode ser usado pelo PSA se este pretender validação personalizada do Ticket de Impressão e outros recursos. As impressoras virtuais também podem reutilizar este contrato se a aplicação desejar realizar a validação personalizada do bilhete de impressão ou a regeneração PDC.

O diagrama a seguir descreve o fluxo de trabalho de impressão para uma impressora virtual.

uma imagem mostrando o fluxo de trabalho de impressão de uma impressora virtual.

Esta seção descreve como as impressoras virtuais são instaladas usando entradas de manifesto appx e como uma impressora virtual é invocada em vários cenários.

windows.PrintSupportVirtualPrinter contrato de fluxo de trabalho

Para que um aplicativo se registre como uma impressora virtual, ele precisa ter um manifesto XML que faz parte do pacote appx UWP ou instalador MSIX.

O exemplo a seguir é um manifesto Appx para uma impressora virtual e a descrição do que cada campo se refere.

<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>

Este é um contrato usado para instalar a fila de impressoras virtuais e também pode atuar como um ponto de extremidade em segundo plano para a impressora virtual instalada. Um único manifesto appx pode instalar várias filas de impressão, que estão associadas à mesma aplicação instalada. Quando um usuário imprime na nova fila de impressora virtual, o aplicativo de impressora virtual é iniciado em segundo plano e gera eventos com a classe de tempo de execução PrintWorkflowVirtualPrinterDataAvailableEventArgs como Event Args. A classe runtime tem APIs para ler os dados PDL, Launch UI para o aplicativo, se necessário, e assim por diante.

  • PrintSupportVirtualPrinter - Cada entrada especifica uma fila de impressão de ponto final de software a ser instalada junto com o aplicativo.

  • PreferredInputFormat - Este campo indica o formato PDL de entrada preferencial para a impressora virtual. O Sistema de Impressão do Windows gera este formato antes de fornecer dados PDL à Impressora Virtual para todos os caminhos de impressão. O campo só pode ser os seguintes valores: application/oxps ou application/postscript. A instalação falhará se outros formatos forem especificados neste campo. Se o campo não for especificado, application/oxps será definido como o formato PDL de entrada preferencial para a impressora virtual instalada.

  • OutputFileTypes - Quando este campo é especificado no manifesto appx, o Sistema de Impressão do Windows cria uma fila de impressão marcada como uma impressora de arquivos e a caixa de diálogo Salvar como é mostrada ao usuário quando um aplicativo começa a imprimir na Impressora Virtual. Os valores deste campo devem conter extensões de arquivo de destino, como pdf / pwgr / ps etc. Esses valores são armazenados nos dados do driver e são adicionados à caixa de diálogo Salvar como as extensões permitidas. O Sistema de Impressão do Windows cria uma classe StorageFile para o arquivo selecionado pelo usuário e é fornecida ao Aplicativo de Impressora Virtual como parte da API de Args de Eventos. Se uma Impressora Virtual não quiser um comportamento de impressão de ficheiros (isto inclui Impressoras Virtuais que armazenam dados de impressão na nuvem ou impressoras que enviam dados para uma aplicação como o OneNote), este campo não deve ser adicionado ao manifesto.

uma imagem mostrando a saída de impressão salva como caixa de diálogo.

  • Formatos suportados - A impressora virtual pode usar este campo para especificar todos os formatos PDL que pode processar. Isso é usado para aplicativos de impressão de passagem, como o Microsoft Edge, para identificar o formato suportado, como PDF, e passar diretamente um fluxo de PDF para a impressora virtual, sem que nenhuma alteração seja feita pelo sistema de impressão do Windows. Este campo tem SupportedFormat como o campo filho. SupportedFormat tem o campo Type para especificar o tipo MIME suportado e o campo MaxVersion especifica a versão máxima desse formato PDL que a Impressora Virtual pode receber. O valor MaxVersion deve estar no formato MajorVersion.MinorVersion. O sistema de impressão do Windows falhará na instalação da impressora se estiver em qualquer outro formato. MajorVersion e MinorVersion só serão números. Se houver quaisquer caracteres presentes, o campo de versão é invalidado e ignorado.

  • PdcFile - Este campo deve apontar para um arquivo de recurso dentro do pacote do aplicativo. O arquivo deve conter conteúdo no formato xml Print Device Capabilities, que é usado para definir os recursos da impressora e deve ser usado para definir quaisquer recursos, opções ou parâmetros personalizados. Este é um campo obrigatório e a instalação da impressora falhará se o valor não estiver presente ou se o conteúdo do ficheiro não estiver no formato PDC válido.

  • PdrFile - Se fornecido, este campo deve apontar para um arquivo de recurso dentro do pacote do aplicativo. O arquivo deve conter recursos de dispositivo de impressão em um formato xml. Este campo deve ser fornecido se o aplicativo quiser localizar preferências de impressão personalizadas. Este campo é opcional e a localização de recursos para preferências de impressão é feita pelo sistema de impressão se este campo não estiver presente.

  • DisplayName - Especifica o nome da fila de impressora virtual que está instalada. As restrições desta cadeia de caracteres são as mesmas que tem para um nome de impressora do Windows.

  • PrinterUri - Especifica um URI exclusivo que pode ser usado por aplicativos PSA para identificar a impressora. Uma única aplicação de impressora virtual pode especificar vários pontos de extremidade de software, o que resulta na instalação de várias impressoras. O campo PrinterUri pode ser usado para diferenciar entre essas impressoras. Isso é dado como saída de IppPrintDevice::PrinterUri API. Se o URI não for especificado, o Windows atribuirá um URI exclusivo arbitrário à impressora.

Exemplo simples de interface de software para impressoras PDF e XPS

Este exemplo mostra uma tarefa em segundo plano de um aplicativo de ponto final de software que registrou dois pontos de extremidade: Imprimir em PDF e Imprimir em XPS. O exemplo regista o evento VirtualPrinterDataAvailable na sessão e chama start. Quando o evento é gerado, Event Args contém fluxo PDL, arquivo de destino, iniciador de interface do usuário e conversor PDL. O aplicativo converte o formato PDL de entrada em PDF ou XPS com base na impressora e grava o conteúdo resultante no fluxo de saída do arquivo de destino.

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();
        }
    }
}

Iniciando a interface do usuário a partir de uma tarefa em segundo plano do Software Endpoint

A API do Aplicativo de Suporte de Impressão v4 fornece recursos para a tarefa em segundo plano do Ponto Final de Software para mostrar a interface do usuário ao usuário, se necessário. Isso usa a API PSA existente PrintWorkflowUILauncher Class. Quando a tarefa em segundo plano chama a função LaunchAndCompleteUIAsync, a aplicação é iniciada no contexto da UI usando o contrato PSA existente Windows.printSupportJobUI. Para mais informações, consulte o exemploda interface do utilizador de Software Endpoint.

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));
}

Exemplo de interface do usuário do ponto de extremidade de software

Este exemplo mostra o contrato da interface do usuário PSA modificado para dar suporte à inicialização da interface do usuário a partir da tarefa em segundo plano do Software Endpoint. A classe PrintWorkflowJobUISession é modificada para ter um novo evento VirtualPrinterUIDataAvailable. Quando a interface do utilizador (UI) é iniciada a partir da tarefa em segundo plano do Software Endpoint, o novo evento é invocado. O aplicativo pode mostrar uma visualização para o usuário usando o contexto de origem PDL fornecido pelo Event Args.

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
        }
    }
}

Software Endpoint atualizando a configuração da impressora

Os endpoints de software podem querer alterar a configuração da impressora quando o utilizador altera as definições. Para facilitar isso, a função RefreshPrintDeviceCapabilities é adicionada na classe IppPrintDevice WinRT. Quando essa função é chamada, ela invoca o PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged Event, onde o aplicativo pode atualizar os recursos atuais do dispositivo de impressão.

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

Obter e alterar o bilhete de impressão padrão do(a) usuário(a)

Os IHVs podem ter interesse em mostrar e modificar as preferências de impressão padrão quando um aplicativo PSA é iniciado a partir do menu Iniciar. Por esse motivo, a propriedade UserDefaultPrintTicket é adicionada à classe IppPrintDevice WinRT. Qualquer aplicação pode obter e definir o bilhete de impressão padrão do utilizador com esta propriedade.

// 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;
}

Facilitando o trabalho com características de função

Pode ser difícil criar os atributos de trabalho completos necessários para criar um trabalho na impressora nos casos em que um IHV pode querer remover determinados atributos antes de enviar a solicitação de trabalho criada para a impressora. Uma função ConvertPrintTicketToJobAttributes é adicionada à classe Winrt PrintWorkflowPrintJob para obter os atributos IPP de um tíquete de impressora. O exemplo a seguir mostra como um PSA pode obter atributos IPP do Ticket de Impressão e remover o atributo de tamanho de mídia, que é enviado como parte do conteúdo PDL enviado para a impressora.

 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;
}

Configurando a qualidade de imagem do MXDC com base na qualidade de saída da página

Os atuais drivers de impressão V4 legados de terceiros podem especificar a qualidade da imagem produzida pelo MXDC de acordo com a qualidade da página. Para obter mais informações, consulte V4 Driver Manifest.

Avançando para a descontinuação dos drivers de terceiros herdados V3/V4, existe a necessidade de fornecer paridade para esse recurso usando APIs PSA. Por esse motivo, a API PSA v4 fornece uma classe WinRT para obter e definir a configuração de qualidade de imagem.

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;
}

Implementando o contrato PrintSupportSettingUI no aplicativo WinAppSdk

A API do aplicativo de suporte de impressão v4 introduz uma propriedade em classe PrintSupportSettingsActivatedEventArgs Winrt chamada OwnerWindowId. A aplicação Windows App SDK é responsável por criar a sua janela como modal para a OwnerWindowId janela dada.

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);
    }
}

Comentários

Os exemplos neste artigo são criados sobre os exemplos das APIs PSA v1, PSA v2 e PSA v3 com a suposição de que o desenvolvedor está familiarizado com o fluxo de trabalho da API PSA.

Este artigo contém as extensões para a API de aplicativo de suporte de impressão pública existente descrita no guia de design do aplicativo de suporte de impressão e Windows.Graphics.Printing.PrintSupport Namespace. A API PSA permite que os fabricantes de impressoras desenvolvam aplicativos UWP que podem aprimorar uma experiência de impressão dos usuários do Windows ao usar o Microsoft IPP Class Driver da caixa de entrada, sem a necessidade de desenvolver um driver personalizado.

Os componentes de impressão estão a comunicar-se com a aplicação PSA por meio de um processo de agente PSA.

ConvertPrintTicketToJobAttributes

Fim do plano de manutenção para drivers de impressora de terceiros no Windows

ObterAtributosDaImpressoraComoBuffer

ObterAtributosDaImpressora

IppPrintDevice

IppPrinterDevice::IsIppPrinter

IppPrintDevice::PrinterUri

LaunchAndCompleteUIAsync

OwnerWindowId

PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged

PrintSupportSettingsActivatedEventArgs

PrintWorkflowJobUISession

PrintWorkflowPrintJob

PrintWorkflowUILauncher

AtualizarCapacidadesDoDispositivoDeImpressão

DefinirAtributosDaImpressora

DefinirAtributosDaImpressoraDoBuffer

Exemplo de interface do usuário do software Endpoint

ArquivoDeArmazenamento

UserDefaultPrintTicket

DadosDeImpressoraVirtualDisponíveis

VirtualPrinterUIDataAvailable

Windows.Graphics.Printing.PrintSupport