Compartilhar via


Guia de design da API do Aplicativo de Suporte de Impressão v4

A API do Aplicativo de Suporte à Impressão v4 dá suporte a uma Arquitetura de Impressora Virtual para facilitar a implementação de Impressoras Virtuais sem drivers de terceiros herdados. Por meio dessa arquitetura, um ISV (Fornecedor Independente de Software) é capaz de implementar uma Impressora Virtual como um aplicativo que implementa os recursos atualmente compatíveis com drivers V3/V4 legados de terceiros. O artigo descreve como um aplicativo pode se registrar como uma Impressora Virtual e como implementar a conversão de PDL e os elementos de interface do usuário necessários para implementação.

O PSA (Aplicativo de Suporte à Impressão) é a arquitetura que foi introduzida para ajudar os IHVs a adicionar personalização às 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 App de Suporte à Impressão* e reutilizam alguns dos contratos PSA aplicáveis à arquitetura de Impressora Virtual.

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

Tópico Descrição
Guia de Design do Aplicativo de Assistência à Impressão Fornece diretrizes e exemplos para OEMs de impressora e IHVs que estão implementando um PSA (aplicativo de suporte à impressão) para seu dispositivo.
Guia de design dos aplicativos API v3 de suporte à impressão Fornece diretrizes e exemplos para OEMs de impressora e IHVs que estão implementando um PSA (Aplicativo de Suporte à Impressão) v3 para seu dispositivo.
Especificação de manifesto MSIX para impressora virtual com suporte de impressão Fornece orientação e exemplos de manifesto MSIX para OEMs e IHVs de impressora que estão implementando um aplicativo de suporte à impressão.
Associação de aplicativos de suporte à impressão Fornece diretrizes e exemplos para associar um PSA (aplicativo de suporte à impressão) a uma impressora.

Este artigo mostra como as APIs PSA são estendidas para dar suporte ao Ponto de Extremidade de Software e a alguns outros cenários da PSA exigidos por IHVs.

Terminologia

Prazo Definição
PSA Aplicativo de Suporte de Impressão. Aplicativo UWP que usa a API neste documento.
MXDC Conversor de Documentos do 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.
CPD 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 Win32.
IPP Protocolo de Impressão da Internet. Usado de um dispositivo cliente para interagir com a impressora para recuperar e definir preferências de impressão e enviar o documento para ser impresso.
Impressora associada ao suporte de impressão Impressora IPP física vinculada ao PSA.
Impressora IPP Impressora que dá suporte ao protocolo IPP.
MSDW Gravador de Documentos da Microsoft
Interface do usuário de preferências da impressora Caixa de diálogo em que o usuário pode alterar as preferências relacionadas a uma impressora que seria aplicada 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 no qual um documento é enviado para a impressora.
Impressora PSA associada Cada PSA é associado a uma impressora IPP física.
PDC Formato de documento XML PrintDeviceCapabilities para definir recursos de impressora.
SoftwareAppMon DLL de monitoramento de porta para nova fila da Impressora Virtual
PrintSupportExtension A tarefa em segundo plano do PSA é responsável por fornecer recursos de extensão de restrição de impressora.
  • Impressora Virtual 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 como true para a nova Impressora Virtual adicionada. Isso é feito para que a passagem PDL funcione perfeitamente tanto para impressoras virtuais quanto para impressoras IPP, e para reutilizar grande parte da interface da API PSA que já está presente. As funções da classe IppPrintDevice (GetPrinterAttributesAsBuffer, GetPrinterAttributes, SetPrinterAttributesFromBuffere SetPrinterAttributes) são ajustadas para a impressora virtual. GetPrinterAttributesAsBuffer e GetPrinterAttributes sempre retorna sem suporte para qualquer atributo IPP passado e SetPrinterAttributesFromBuffer e SetPrinterAttributes sempre retornam o resultado do erro com o erro definido para acesso negado para Impressoras Virtuais. Isso ocorre porque as Impressoras Virtuais especificam apenas o PDC no manifesto appx e não dão suporte a nenhum atributo de impressora IPP.

  • Reutilização do contrato windows.printSupportSettingsUI para Impressora Virtual - Windows.printSupportSettingsUI é um contrato de interface de usuário introduzido como parte do PSA para exibir uma interface de preferências de impressão personalizada para o usuário da impressora IPP usando o PSA. Os exemplos de API do Aplicativo de Suporte à Impressão v4 neste artigo reutilizam o mesmo contrato para dar suporte a preferências de impressão personalizadas para a interface do usuário para Impressora Virtual sem alterações.

  • Reutilização de contrato windows.printSupportJobUI para Impressora Virtual - Windows.printSupportJobUI é um contrato de interface do usuário introduzido como parte do PSA para apresentar a interface para o usuário nos casos em que o PSA deseja obter entrada do usuário ou mostrar a visualização de impressão ao usuário. Esse contrato é reutilizado para a "Impressora Virtual" mostrar a interface do usuário para entrada ou para mostrar a prévia. Para obter mais informações, consulte o exemplo do ponto de extremidade de software da interface do usuário para ver as alterações feitas nas APIs no contrato 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 pela PSA se eles quiserem a validação personalizada do Tíquete de Impressão e outros recursos. As Impressoras Virtuais também podem reutilizar esse contrato se o aplicativo desejar realizar a validação personalizada do tíquete de impressão ou a regeneração de PDC.

O diagrama a seguir descreve o fluxo de trabalho de impressão de 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.

Contrato windows.PrintSupportVirtualPrinterWorkflow

Para que um aplicativo se registre como uma Impressora Virtual, ele precisa ter um manifesto XML que faça 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 utilizado para a instalação da Fila de Impressão Virtual e também pode funcionar como um ponto de extremidade de plano de fundo 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 Impressão Virtual, o aplicativo de Impressora Virtual é iniciado em segundo plano e gera eventos com a classe de runtime PrintWorkflowVirtualPrinterDataAvailableEventArgs como Argumentos do Event. A classe de runtime tem APIs para ler os dados do PDL, iniciar a interface do usuário do aplicativo, se necessário, e assim por diante.

  • PrintSupportVirtualPrinter – Cada entrada especifica uma fila de impressão de ponto de extremidade do software que será instalada junto com o aplicativo.

  • PreferredInputFormat – esse campo indica o formato PDL de entrada preferencial para a Impressora Virtual. O Sistema de Impressão do Windows gera esse 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 esse campo é especificado no manifesto appx, o Sistema de Impressão do Windows cria uma fila de impressão marcada como uma impressora de arquivo e a caixa de diálogo Salvar como é mostrada ao usuário quando um aplicativo começa a imprimir na Impressora Virtual. Os valores desse campo devem conter extensões de arquivo de destino, como pdf/pwgr/ps etc. Esses valores são armazenados como dados do driver e são adicionados como extensões permitidas na caixa de diálogo Salvar como. O Sistema de Impressão do Windows cria uma classe StorageFile para o arquivo selecionado pelo usuário e é fornecido ao Aplicativo de Impressora Virtual como parte da API de Args de Eventos. Se uma Impressora Virtual não quiser comportamento de impressão de arquivo (isso inclui Impressoras Virtuais que armazenam dados de impressão na nuvem ou impressoras que enviam dados para um aplicativo como o OneNote), esse campo não deve ser adicionado ao manifesto.

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

  • formatos com suporte – a Impressora Virtual pode usar esse campo para especificar todos os formatos PDL que ele pode processar. Isso é usado para aplicativos de impressão de passagem, como o Microsoft Edge, para identificar o formato com suporte, como PDF, e passar diretamente um fluxo de PDF para a Impressora Virtual sem que nenhuma alteração seja feita no meio pelo sistema de impressão do Windows. Esse campo contém "SupportedFormat" como campo filho. SupportedFormat tem tipo de campo para especificar o tipo MIME com suporte 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 devem ser apenas números; se houver qualquer caractere presente, o campo de versão será invalidado e ignorado.

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

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

  • DisplayName – especifica o nome da Fila de Impressora Virtual instalada. As restrições dessa cadeia de caracteres são as mesmas que você tem para um nome de impressora do Windows.

  • PrinterUri – Especifica um URI exclusivo que pode ser usado por aplicativos PSA para identificar a impressora. Um único aplicativo de Impressora Virtual pode especificar vários pontos de extremidade de software, o que resulta em várias impressoras a serem instaladas. O campo PrinterUri pode ser usado para diferenciar essas impressoras. Isso é fornecido como saída de IppPrintDevice::PrinterUri API. Se o URI não for especificado, o Windows atribuirá um URI exclusivo arbitrário à impressora.

Exemplo de endpoint de software simples para impressoras PDF e XPS

Este exemplo mostra uma tarefa em segundo plano de um Aplicativo de Ponto de Extremidade de Software que registrou dois pontos de extremidade: Imprimir em PDF e Imprimir no XPS. O exemplo registra o evento VirtualPrinterDataAvailable na sessão e as chamadas são iniciadas. Quando o evento é acionado, o Event Args contém o fluxo PDL, o arquivo de destino, o inicializador de UI e o conversor de 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();
        }
    }
}

Iniciar a interface do usuário a partir de uma tarefa em segundo plano do ponto de extremidade de software

A API do Aplicativo v4 de Suporte à Impressão fornece funcionalidade para o processo em segundo plano do Ponto de Extremidade de Software mostrar a interface para o usuário, se necessário. Isso usa a classe de API do PSA PrintWorkflowUILauncher existente. Quando a tarefa em segundo plano chama a função LaunchAndCompleteUIAsync, o aplicativo é iniciado no contexto da interface do usuário usando o contrato PSA Windows.printSupportJobUI existente. Para obter mais informações, consulte o exemplo da interface do usuário do ponto de extremidade do software .

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 de software ponto de extremidade

Este exemplo mostra o contrato da interface de usuário do PSA modificado para dar suporte ao lançamento da interface de usuário a partir da tarefa em segundo plano do Ponto de Extremidade de Software. A classe PrintWorkflowJobUISession foi modificada para incluir um novo evento VirtualPrinterUIDataAvailable. Quando a interface do usuário é iniciada pela tarefa em segundo plano do Ponto de Extremidade de Software, 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
        }
    }
}

Ponto de Extremidade de Software atualizando a configuração da impressora

Os endpoints de software podem querer alterar a configuração da impressora quando o usuário altera as configurações. Para facilitar isso, a função RefreshPrintDeviceCapabilities é adicionada na classe IppPrintDevice WinRT. Quando essa função é chamada, ela invoca o evento PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged, em que 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 tíquete de impressão padrão do usuário

Os IHVs podem querer mostrar e modificar as preferências de impressão padrão quando um aplicativo PSA é iniciado no Menu Iniciar. Por esse motivo, a propriedade UserDefaultPrintTicket é adicionada à classe IppPrintDevice WinRT. Qualquer aplicativo pode obter e definir o ticket de impressão padrão do usuário com essa 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;
}

Mais facilidade ao usar atributos de trabalho

Pode ser difícil criar os atributos de trabalho completos necessários para criar um trabalho na impressora em casos em que um IHV pode querer remover determinados atributos antes de enviar a solicitação de trabalho criada para a impressora. Um ConvertPrintTicketToJobAttributes é adicionado à classe Winrt PrintWorkflowPrintJob para obter os atributos de IPP para o tíquete de impressão. O exemplo a seguir mostra como um PSA pode obter atributos IPP do Tíquete de Impressão e remover o atributo de tamanho de mídia, que posteriormente é enviado como parte do conteúdo PDL 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 da imagem do MXDC com base na qualidade da saída da página

Os drivers de impressão V4 de terceiros herdados atuais podem especificar a qualidade da imagem produzida pelo MXDC com base na qualidade da página. Para obter mais informações, consulte Manifesto do Driver v4.

Avançando para a descontinuação de drivers V3/V4 herdados de terceiros, é necessário garantir a equivalência desse recurso usando APIs de PSA. Por esse motivo, a API psa v4 fornece uma classe WinRT para obter e definir a configuração de qualidade da 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 à Impressão v4 apresenta uma propriedade na classe Winrt PrintSupportSettingsActivatedEventArgs chamada OwnerWindowId. O aplicativo SDK do Windows é responsável por criar sua janela como modal para a janela OwnerWindowId fornecida.

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

Observações

Os exemplos neste artigo são baseados nos 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 da API de Aplicativo de Suporte à Impressão pública existente descrita no guia de design do Aplicativo de Suporte à Impressão e Windows.Graphics.Printing.PrintSupport Namespace. A API PSA permite que os fabricantes de impressoras desenvolvam aplicativos UWP que possam aprimorar a experiência de impressão dos usuários do Windows ao utilizar o driver de classe IPP padrão da Microsoft, sem a necessidade de desenvolver um driver personalizado.

Os componentes de impressão se comunicam com o app PSA por meio de um processo intermediário do PSA.

ConvertPrintTicketToJobAttributes

Encerramento do plano de suporte para drivers de impressora de terceiros no Windows

GetPrinterAttributesAsBuffer

ObterAtributosDaImpressora

IppPrintDevice

IppPrinterDevice::IsIppPrinter

IppPrintDevice::PrinterUri

LaunchAndCompleteUIAsync

OwnerWindowId

PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged

PrintSupportSettingsActivatedEventArgs

PrintWorkflowJobUISession

PrintWorkflowPrintJob

PrintWorkflowUILauncher

AtualizarCapacidadesDoDispositivoDeImpressão

DefinirAtributosDaImpressora

SetPrinterAttributesFromBuffer

Exemplo de Interface de Usuário de Endpoint de Software

StorageFile

UserDefaultPrintTicket

VirtualPrinterDataAvailable

VirtualPrinterUIDataAvailable

Windows.Graphics.Printing.PrintSupport