Condividi tramite


Guida alla progettazione dell'API della Print Support App v4

L'app di supporto alla stampa v4 API supporta un'architettura per stampanti virtuali per facilitare l'implementazione di stampanti virtuali senza driver obsoleti di terze parti. Tramite questa architettura, un fornitore di software indipendente (ISV) è in grado di implementare una stampante virtuale come applicazione che implementa le funzionalità attualmente supportate dai driver V3/V4 legacy. L'articolo descrive come un'applicazione può registrarsi come stampante virtuale e come implementare la conversione PDL e gli elementi dell'interfaccia utente necessari per l'implementazione.

Print Support App (PSA) è l'architettura introdotta per consentire agli IHV di aggiungere personalizzazione alle stampanti IPP senza l'uso di driver di terze parti legacy. Per facilitare la transizione alla nuova stampante virtuale, tutte le API fanno parte dello spazio dei nomi dell'API Print Support App* e riutilizza alcuni dei contratti PSA applicabili all'architettura della stampante virtuale.

Per altre informazioni, vedere gli articoli seguenti:

Argomento Descrizione
guida alla progettazione dell'app di supporto per la stampa Fornisce indicazioni ed esempi per gli OEM e gli IHV delle stampanti che implementano un'app di supporto per la stampa (PSA) per il loro dispositivo.
Guida alla progettazione dell'API di supporto di stampa v3 Fornisce indicazioni ed esempi per gli OEM e gli IHV della stampante che implementano un'applicazione di supporto per la stampa v3 (PSA) per i loro dispositivi.
Specificazione del Manifesto MSIX per la Stampante Virtuale di Supporto per la Stampa Fornisce indicazioni sul manifesto MSIX ed esempi per OEM e IHV di stampanti che implementano una stampante virtuale di supporto alla stampa.
associazione app di supporto stampa Fornisce indicazioni ed esempi per l'associazione di un'app di supporto di stampa (PSA) a una stampante.

Questo articolo illustra come le API PSA vengono estese per supportare l'endpoint software e alcuni altri scenari PSA richiesti dai fornitori indipendenti di hardware (IHV).

Terminologia

Termine Definizione
PSA Applicazione di supporto per la stampa. Applicazione UWP che utilizza l'API in questo documento.
MXDC Convertitore di documenti Di Microsoft XPS
MPD Finestra di dialogo Stampa moderna. Questa finestra di dialogo viene visualizzata all'utente quando un'app sta stampando tramite l'API Windows.Graphics.Printing.
Sviluppo Professionale Continuo Finestra di dialogo stampa comune. Questa finestra di dialogo viene visualizzata all'utente quando l'app sta stampando usando l'API Win32.
IPP Protocollo di stampa Internet. Utilizzato da un dispositivo client per interagire con la stampante per recuperare e impostare le preferenze di stampa e inviare il documento da stampare.
Stampa supporto stampante associato Stampante IPP fisica collegata a PSA.
Stampante IPP Stampante che supporta il protocollo IPP.
MSDW Microsoft Document Writer
Interfaccia utente preferenze stampante Finestra di dialogo in cui l'utente può modificare le impostazioni relative a una stampante che verranno applicate al momento della stampa. Gli esempi includono orientamento, formato carta, colore, stampa su entrambi i lati e così via.
PDL Linguaggio di descrizione della pagina. Formato in cui un documento viene inviato alla stampante.
Stampante PSA associata Ogni PSA è associato a una stampante IPP fisica.
PDC Formato documento XML PrintDeviceCapabilities per la definizione delle funzionalità della stampante.
SoftwareAppMon DLL di monitoraggio delle porte per la nuova coda di stampanti virtuali
PrintSupportExtension L'attività in background PSA è responsabile della fornitura di funzionalità di estensione dei vincoli della stampante.
  • Stampante virtuale come IppPrintDevice - IppPrintDevice è una classe Winrt introdotta come parte delle API PSA. La Stampante Virtuale viene aggiunta come dispositivo di stampa IPP e IppPrinterDevice::IsIppPrinter restituisce vero per la nuova Stampante Virtuale appena aggiunta. Questa operazione viene eseguita in modo che il pass-through PDL funzioni perfettamente sia per le stampanti virtuali che per le stampanti IPP e per riutilizzare gran parte della superficie API PSA già presente. Le funzioni della classe IppPrintDevice (GetPrinterAttributesAsBuffer, GetPrinterAttributes, SetPrinterAttributesFromBuffere SetPrinterAttributes) sono modificate di conseguenza per la stampante virtuale. GetPrinterAttributesAsBuffer e GetPrinterAttributes restituiscono sempre "non supportato" per qualsiasi attributo IPP passato e SetPrinterAttributesFromBuffer e SetPrinterAttributes restituiscono sempre un risultato di errore con errore impostato su accesso negato per le Stampanti Virtuali. Ciò è dovuto al fatto che le stampanti virtuali specificano solo PDC nel manifesto appx e non supportano gli attributi della stampante IPP.

  • il riutilizzo del contratto windows.printSupportSettingsUI per la Stampante Virtuale - Windows.printSupportSettingsUI è un contratto dell'interfaccia utente introdotto come parte di PSA per mostrare l'interfaccia utente delle preferenze di stampa personalizzate all'utente per la stampante IPP utilizzando PSA. Gli esempi dell'API Print Support App v4 in questo articolo riutilizzano lo stesso contratto per supportare le preferenze di stampa personalizzate per l'interfaccia utente per la stampante virtuale senza modifiche.

  • il riutilizzo del contratto windows.printSupportJobUI per la stampante virtuale - Windows.printSupportJobUI è un contratto dell'interfaccia utente introdotto come parte di PSA per mostrare l'interfaccia all'utente nel caso in cui PSA richieda l'input dell'utente o voglia mostrare l'anteprima di stampa all'utente. Questo contratto viene riutilizzato dalla Stampante Virtuale per mostrare all'utente l'interfaccia per inserire dati o visualizzare l'anteprima. Per ulteriori informazioni, consultare l'esempio di interfaccia utente dell'endpoint software per le modifiche apportate alle API nel contratto Windows.printSupportJobUI .

  • il riutilizzo del contratto windows.printSupportExtension per la stampante virtuale - Windows.printSupportExtension è un contratto in background introdotto come parte di PSA che può essere usato da PSA se desiderano una convalida dei ticket di stampa personalizzata e altre funzionalità. Le stampanti virtuali possono anche riutilizzare questo contratto se l'app vuole eseguire la convalida personalizzata del ticket di stampa o della rigenerazione PDC.

Il diagramma seguente descrive il flusso di lavoro di stampa per una stampante virtuale.

un'immagine che mostra il flusso di lavoro di stampa per una stampante virtuale.

Questa sezione descrive come vengono installate le stampanti virtuali usando le voci del manifesto appx e il modo in cui viene richiamata una stampante virtuale in vari scenari.

Windows. Contratto PrintSupportVirtualPrinterWorkflow

Affinché un'app si registri come stampante virtuale, deve avere un manifesto XML che fa parte del pacchetto appx UWP o programma di installazione MSIX.

L'esempio seguente è un manifesto Appx per una stampante virtuale e la descrizione di ogni campo a cui fa riferimento.

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

Si tratta di un contratto usato per l'installazione della coda stampanti virtuali e può fungere anche da endpoint in background per la stampante virtuale installata. Un singolo manifesto appx può installare più code di stampa, associate alla stessa applicazione installata. Quando un utente stampa nella nuova coda di stampanti virtuali, l'applicazione Virtual Printer viene avviata in background e genera eventi con PrintWorkflowVirtualPrinterDataAvailableEventArgs come Argomenti di evento. La classe di runtime include API per leggere i dati PDL, avviare l'interfaccia utente per l'applicazione, se necessario, e così via.

  • PrintSupportVirtualPrinter: ogni voce specifica una coda di stampa dell'endpoint software da installare insieme all'applicazione.

  • PreferredInputFormat : questo campo indica il formato PDL di input preferito per la stampante virtuale. Windows Print System genera questo formato prima di fornire dati PDL alla stampante virtuale per tutti i percorsi di stampa. Il campo può essere solo i valori seguenti: application/oxps o application/postscript. L'installazione ha esito negativo se in questo campo vengono specificati altri formati. Se il campo non è specificato, application/oxps viene impostato come formato PDL di input preferito per la stampante virtuale installata.

  • OutputFileTypes: quando questo campo viene specificato nel manifesto appx, il sistema di stampa di Windows crea una coda di stampanti contrassegnata come stampante file e la finestra di dialogo Salva con nome viene visualizzata all'utente quando un'applicazione inizia a stampare sulla stampante virtuale. I valori di questo campo devono contenere estensioni di file di destinazione, ad esempio pdf/pwgr/ps e così via. Questi valori vengono archiviati nei dati del driver e vengono aggiunti a Salva come finestra di dialogo come estensioni consentite. Windows Print System crea una classe StorageFile per il file selezionato dall'utente e viene assegnata all'app stampante virtuale come parte dell'API Argomenti evento. Se una stampante virtuale non richiede il comportamento di stampa dei file (incluse le stampanti virtuali che archiviano i dati di stampa nel cloud o inviano i dati a un'applicazione come OneNote), questo campo non dovrebbe essere aggiunto al file manifest.

un'immagine che mostra la finestra di dialogo Salva come output di stampa.

  • Formati Supportati - La stampante virtuale può usare questo campo per specificare tutti i formati PDL che può elaborare. Viene utilizzato per le applicazioni di stampa passthrough, tra cui Microsoft Edge, per identificare il formato supportato, come PDF, e trasferire direttamente un flusso PDF alla stampante virtuale senza che il sistema di stampa di Windows apporti alcuna modifica. Questo campo ha SupportedFormat come campo figlio. SupportedFormat include il campo Type per specificare il tipo MIME supportato e il campo MaxVersion specifica la versione massima del formato PDL che la stampante virtuale può ricevere. Il valore MaxVersion deve essere nel formato MajorVersion.MinorVersion. Il sistema di stampa Windows fallisce nell'installazione della stampante se il formato è diverso. MajorVersion e MinorVersion devono essere numeri; se sono presenti caratteri, il campo della versione viene invalidato e ignorato.

  • PdcFile: questo campo deve puntare a un file di risorse all'interno del pacchetto dell'applicazione. Il file deve contenere contenuti in formato xml Print Device Capabilities, che viene usato per definire le funzionalità della stampante e deve essere usato per definire eventuali funzionalità, opzioni o parametri personalizzati. Si tratta di un campo obbligatorio e l'installazione della stampante ha esito negativo se il valore non è presente o se il contenuto del file non è in formato PDC valido.

  • PdrFile - Se fornito, questo campo deve puntare a un file di risorse all'interno del pacchetto dell'applicazione. Il file deve contenere le risorse del dispositivo di stampa in un formato xml. Questo campo deve essere fornito se l'app vuole localizzare le preferenze di stampa personalizzate. Questo campo è facoltativo e la localizzazione delle risorse per le preferenze di stampa viene eseguita dal sistema di stampa se questo campo non è presente.

  • DisplayName - Specifica il nome della coda della stampante virtuale installata. Le restrizioni di questa stringa sono le stesse delle restrizioni che si hanno per un nome di stampante Windows.

  • PrinterUri: specifica un URI univoco che può essere usato dalle applicazioni PSA per identificare la stampante. Una singola app per stampante virtuale può specificare più endpoint software che comportano l'installazione di più stampanti. Il campo PrinterUri può essere utilizzato per distinguere tra queste stampanti. Questo viene fornito come output dall'API IppPrintDevice::PrinterUri. Se l'URI non è specificato, Windows assegna un URI univoco arbitrario alla stampante.

Esempio di endpoint software semplice per stampanti PDF e XPS

Questo esempio mostra un'attività in background di un'app di endpoint software che ha registrato due endpoint: Stampa su PDF e Stampa su XPS. L'esempio si registra per l'evento VirtualPrinterDataAvailable nella sessione e avvia. Quando viene generato l'evento, gli argomenti evento contengono flusso PDL, file di destinazione, utilità di avvio dell'interfaccia utente e convertitore PDL. L'applicazione converte il formato PDL di input in PDF o XPS a seconda della stampante e scrive il contenuto risultante nel flusso di output del file di destinazione.

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

Avvio dell'interfaccia utente da un'attività in background dell'endpoint software

L'API Print Support App v4 fornisce la capacità per il compito in background dell'Endpoint software di mostrare all'utente l'interfaccia utente, se necessario. In questo modo viene utilizzata l'API PSA esistente PrintWorkflowUILauncher Class. Quando l'attività in background chiama la funzione LaunchAndCompleteUIAsync, l'app viene avviata nel contesto dell'UI utilizzando il contratto PSA esistente Windows.printSupportJobUI. Per ulteriori informazioni, consultare l'esempio di interfaccia utente dell'endpoint 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));
}

Esempio di interfaccia utente dell'endpoint software

Questo esempio mostra il contratto dell'interfaccia utente PSA modificato per supportare l'avvio dell'interfaccia utente dall'attività in background dell'endpoint software. La classe PrintWorkflowJobUISession è stata modificata per includere un nuovo evento VirtualPrinterUIDataAvailable. Quando l'interfaccia utente viene lanciata dall'attività in background dell'endpoint software, viene invocato un nuovo evento. L'applicazione può visualizzare un'anteprima all'utente utilizzando il contesto PDL di origine fornito dai dati dell'evento.

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 per l'aggiornamento della configurazione della stampante

Gli endpoint software potrebbero voler modificare la configurazione della stampante quando l'utente modifica le impostazioni. Per semplificare questa operazione, la funzione RefreshPrintDeviceCapabilities viene aggiunta nella classe IppPrintDevice WinRT. Quando questa funzione viene chiamata, richiama l'evento PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged, in cui l'app può aggiornare le funzionalità correnti del dispositivo di stampa.

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

Ottenere e modificare il ticket di stampa dell'utente predefinito

Gli IHV potrebbero voler mostrare e modificare le preferenze di stampa predefinite quando viene avviata un'app PSA dal menu Start. Per questo motivo, la proprietà UserDefaultPrintTicket viene aggiunta alla classe IppPrintDevice WinRT. Qualsiasi applicazione può ottenere e impostare il ticket di stampa predefinito dell'utente con questa proprietà.

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

Semplificare l'uso degli attributi del lavoro

Può essere difficile creare gli attributi di processo completi necessari per creare un processo sulla stampante nei casi in cui un IHV potrebbe voler rimuovere determinati attributi prima di inviare la richiesta di processo creata alla stampante. Un ConvertPrintTicketToJobAttributes viene aggiunto alla classe WinRT PrintWorkflowPrintJob per ottenere gli attributi IPP per un ticket della stampante. L'esempio seguente mostra come un PSA può ottenere gli attributi IPP dal ticket di stampa e rimuovere l'attributo "media-size", che viene quindi inviato come parte dei contenuti PDL inviati alla stampante.

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

Configurazione della qualità dell'immagine di MXDC in base alla qualità dell'output della pagina

I driver di stampa V4 legacy obsoleti possono specificare la qualità dell'immagine prodotta da MXDC in base alla qualità della pagina. Per altre informazioni, vedere Manifesto driver V4.

Passando all'eliminazione dei driver legacy V3/V4 di terze parti, è necessario garantire l'equivalenza di questa funzionalità usando le API PSA. Per questo motivo, l'API PSA v4 fornisce una classe WinRT per ottenere e impostare la configurazione della qualità dell'immagine.

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

Implementazione del contratto PrintSupportSettingUI in App WinAppSdk

L'API Print Support App v4 introduce una proprietà in PrintSupportSettingsActivatedEventArgs classe Winrt denominata OwnerWindowId. L'applicazione Windows App SDK è responsabile della creazione della finestra come modale alla finestra di OwnerWindowId specificata.

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

Osservazioni

Gli esempi in questo articolo sono basati sugli esempi delle API PSA v1, PSA v2 e PSA v3 con il presupposto che lo sviluppatore abbia familiarità con il flusso di lavoro dell'API PSA.

Questo articolo contiene le estensioni per l'API di supporto di stampa pubblica esistente descritta nella Guida alla progettazione dell'app di supporto di stampa e spazio dei nomi Windows.Graphics.Printing.PrintSupport. L'API PSA consente ai produttori di stampanti di sviluppare app UWP in grado di migliorare l'esperienza di stampa degli utenti di Windows durante l'uso del driver di classe Microsoft IPP, senza la necessità di sviluppare un driver personalizzato.

I componenti per la stampa comunicano con l'app PSA tramite un processo broker di PSA.

ConvertiBigliettoDiStampaInAttributiDiLavoro

Fine del supporto per i driver delle stampanti di parte terza in Windows

GetPrinterAttributesAsBuffer

GetPrinterAttributes

IppPrintDevice

IppPrinterDevice::IsIppPrinter

IppPrintDevice::PrinterUri

LaunchAndCompleteUIAsync

OwnerWindowId

PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged

PrintSupportSettingsActivatedEventArgs

PrintWorkflowJobUISession

ProcessoDiStampaLavoroDiStampa

PrintWorkflowUILauncher

RefreshPrintDeviceCapabilities

SetPrinterAttributes

ImpostaAttributiStampanteDaBuffer

Interfaccia utente di esempio dell'endpoint software

File di archiviazione

UserDefaultPrintTicket

DatiStampanteVirtualeDisponibili

VirtualPrinterUIDataAvailable

Windows.Graphics.Printing.PrintSupport