Dela via


Designguide för Print Support App v4 API

Print Support App v4 API stöder en virtuell skrivararkitektur för att underlätta implementeringen av virtuella skrivare utan äldre drivrutiner från tredje part. Genom den här arkitekturen kan en oberoende programvaruleverantör (ISV) implementera en virtuell skrivare som ett program som implementerar de funktioner som för närvarande stöds av äldre V3/V4-drivrutiner från tredje part. Artikeln beskriver hur ett program kan registrera sig som en virtuell skrivare och hur du implementerar PDL-konverterings- och gränssnittselement som krävs för implementering.

Psa (Print Support App) är den arkitektur som introducerades för att hjälpa IHV:er att lägga till anpassning till IPP-skrivare utan att använda äldre drivrutiner från tredje part. För att underlätta övergången till den nya virtuella skrivaren är alla API:er en del av api-namnområdet Utskriftssupportapp* och återanvänder några av de PSA-kontrakt som gäller för arkitekturen för virtuell skrivare.

Mer information finns i följande artiklar:

Ämne Beskrivning
Designguide för utskriftssupportapp Innehåller vägledning och exempel för skrivar-OEM:er och IHV:er som implementerar en utskriftsstödsapp (PSA) för sina enheter.
designguide för Print Support App v3 API Innehåller vägledning och exempel för OEM-tillverkare och IHV:er som implementerar en v3 Print Support App (PSA) för sina enheter.
MSIX-manifestspecifikation för virtuell skrivare med utskriftsstöd Innehåller MSIX-manifestvägledning och exempel för skrivar-OEM:er och IHV:er som implementerar en virtuell skrivare för utskriftsstöd.
Stöd för appassociation för utskrift Innehåller vägledning och exempel för att associera en psa (print support app) med en skrivare.

Den här artikeln visar hur PSA-API:er utökas för att stödja programvaruslutpunkter och några andra PSA-scenarier som krävs av IHV:er.

Terminologi

Termin Definition
PSA Utskriftsstödprogram. UWP-app som använder API:et i det här dokumentet.
MXDC Microsoft XPS-dokumentkonverterare
MPD Modern utskriftsdialog. Den här dialogrutan visas för användaren när en app skriver ut med hjälp av API:et Windows.Graphics.Printing.
CPD Gemensam utskriftsdialogruta. Den här dialogrutan visas för användaren när appen skriver ut med Win32 API.
IPP Internet Printing Protocol. Används från en klientenhet för att interagera med skrivaren för att hämta och ange utskriftsinställningar och skicka dokumentet som ska skrivas ut.
Utskriftsstöd associerade skrivare Fysisk IPP-skrivare som är länkad till PSA.
IPP-skrivare Skrivare som stöder IPP-protokoll.
MSDW Microsoft Document Writer
Användargränssnitt för skrivarinställningar Dialogruta där användaren kan ändra de inställningar som är relaterade till en skrivare som skulle tillämpas vid utskrift. Exempel är orientering, pappersstorlek, färg, utskrift på båda sidor och så vidare.
PDL Språk för sidbeskrivning. Formatet där ett dokument skickas till skrivaren.
Associerad PSA-skrivare Varje PSA är associerat med en fysisk IPP-skrivare.
PDC PrintDeviceCapabilities XML-dokumentformat för att definiera skrivarfunktioner.
SoftwareAppMon Portövervakar-DLL för en ny virtuell skrivarkö
PrintSupportExtension PSA-bakgrundsaktiviteten ansvarar för att ge utökade möjligheter för skrivarbegränsning.
  • Virtual Printer som IppPrintDevice - IppPrintDevice är en Winrt-klass som introduceras som en del av PSA-API:erna. Den virtuella skrivaren läggs till som en IPP-skrivarenhet och IppPrinterDevice::IsIppPrinter returnerar true för den nyligen tillagda virtuella skrivaren. Detta görs så att PDL-genomströmning fungerar sömlöst för både virtuella skrivare och IPP-skrivare, och för att återanvända mycket av PSA API-ytan som redan finns. Klassfunktionerna IppPrintDevice (GetPrinterAttributesAsBuffer, GetPrinterAttributes, SetPrinterAttributesFromBufferoch SetPrinterAttributes) ändras i enlighet med detta för Virtuell skrivare. GetPrinterAttributesAsBuffer och GetPrinterAttributes returnerar alltid inte stöd för något IPP-attribut som skickas in och SetPrinterAttributesFromBuffer och SetPrinterAttributes returnerar alltid felresultat med felmeddelande inställt på åtkomst nekad för virtuella skrivare. Det beror på att virtuella skrivare endast anger PDC i Appx-manifestet och inte stöder några IPP-skrivarattribut.

  • Återanvändning av windows.printSupportSettingsUI-kontrakt för virtuell skrivare - Windows.printSupportSettingsUI är ett användargränssnittskontrakt som introducerades som en del av PSA för att visa ett anpassat gränssnitt för utskriftsinställningar för användaren för IPP-skrivaren med PSA. Api-exemplen för utskriftssupportapp v4 i den här artikeln återanvänder samma kontrakt för att stödja anpassade utskriftsinställningar för användargränssnittet för virtuell skrivare utan några ändringar.

  • windows.printSupportJobUI contract reuse for Virtual Printer - Windows.printSupportJobUI är ett användargränssnittskontrakt som introducerades som en del av PSA för att visa användargränssnittet för användaren om PSA vill ha användarindata eller visa förhandsgranskningen för användaren. Det här kontraktet återanvänds för virtuell skrivare för att visa användargränssnittet för användaren för indata eller för att visa förhandsversionen. Mer information finns i exempel på slutpunktsgränssnitt för programvara för de ändringar som gjorts i API:erna i Windows.printSupportJobUI- kontrakt.

  • windows.printSupportExtension contract reuse for Virtual Printer - Windows.printSupportExtension är ett bakgrundskontrakt som introducerades som en del av PSA och kan användas av PSA om de vill ha anpassad validering av Print Ticket och andra funktioner. Virtuella skrivare kan också återanvända det här kontraktet om appen vill utföra anpassad validering av utskriftsbiljetten eller PDC-förnyelsen.

I följande diagram beskrivs arbetsflödet för utskrift för en virtuell skrivare.

en bild som visar utskriftsarbetsflödet för en virtuell skrivare.

I det här avsnittet beskrivs hur virtuella skrivare installeras med hjälp av appx-manifestposter och hur en virtuell skrivare anropas i olika scenarier.

Windows. PrintSupportVirtualPrinterWorkflow-kontrakt

För att en app ska kunna registrera sig som en virtuell skrivare måste den ha XML-manifest som är en del av UWP-appx-paketet eller MSIX-installationsprogrammet.

Följande exempel är ett Appx-manifest för en virtuell skrivare och beskrivningen av vad varje fält refererar till.

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

Det här är ett kontrakt som används för att installera kön för virtuella skrivare och kan även fungera som en bakgrundsendpunkt för den installerade virtuella skrivaren. Ett enda Appx-manifest kan installera flera utskriftsköer, vilket är associerat med samma installerade program. När en användare skriver ut på den nya virtuella skrivarkön startas programmet Virtuell skrivare i bakgrunden och genererar händelser med PrintWorkflowVirtualPrinterDataAvailableEventArgs-körningsklassen som Event Args. Körningsklassen har API:er för att läsa PDL-data, Starta användargränssnittet för programmet om det behövs och så vidare.

  • PrintSupportVirtualPrinter – Varje post anger en programvaruslutpunkts utskriftskö som ska installeras tillsammans med applikationen.

  • PreferredInputFormat – Det här fältet anger PDL-format för önskad indata för den virtuella skrivaren. Windows Print System genererar det här formatet innan PDL-data ges till den virtuella skrivaren för alla utskriftssökvägar. Fältet kan bara vara följande värden: application/oxps eller application/postscript. Installationen misslyckas om andra format anges i det här fältet. Om fältet inte anges anges program/oxps som önskat PDL-format för den installerade virtuella skrivaren.

  • OutputFileTypes – När detta fält specificeras i appx-manifestet skapar Windows-utskriftssystemet en skrivarkö markerad som en filskrivare, och dialogrutan "Spara som" visas för användaren när ett program börjar skriva ut till den virtuella skrivaren. Värdena för det här fältet ska innehålla målfiltillägg som pdf/pwgr/ps osv. Dessa värden lagras i drivrutinsdata och läggs till i Spara som dialogruta som de tillåtna tilläggen. Windows Print System skapar en StorageFile-klass för den valda filen och ges till den virtuella skrivarappen som en del av Event Args-API:et. Om en virtuell skrivare inte vill ha filutskriftsbeteende (detta inkluderar virtuella skrivare som lagrar utskriftsdata i molnet eller skrivare som skickar data till ett program som OneNote), bör det här fältet inte läggas till i manifestet.

en bild som visar utskriftsutdata som sparas som dialogruta.

  • Format som stöds – Virtuell skrivare kan använda det här fältet för att ange alla PDL-format som den kan bearbeta. Detta används för genomströmningsutskriftsprogram som Microsoft Edge för att identifiera det format som stöds som PDF och direkt skicka en PDF-ström till den virtuella skrivaren utan att några ändringar görs mellan av Windows Print-systemet. Det här fältet har SupportedFormat som underordnat fält. SupportedFormat har fälttyp för att ange vilken MIME-typ som stöds och fältet MaxVersion anger den maximala versionen av det PDL-format som virtuell skrivare kan ta emot. MaxVersion-värdet måste ha formatet MajorVersion.MinorVersion. Utskriftssystemet i Windows misslyckas med skrivarinstallationen om det är i något annat format. MajorVersion och MinorVersion får endast innehålla siffror; om några bokstäver är närvarande ogiltigförklaras och ignoreras versionsfältet.

  • PdcFile – Det här fältet måste peka på en resursfil i programpaketet. Filen ska innehålla innehåll i XML-format för utskriftsfunktioner, som används för att definiera skrivarfunktioner och bör användas för att definiera anpassade funktioner, alternativ eller parametrar. Detta är ett obligatoriskt fält och skrivarinstallationen misslyckas om värdet inte finns eller om filinnehållet inte är i giltigt PDC-format.

  • PdrFile – Om det här fältet anges måste det peka på en resursfil i programpaketet. Filen ska innehålla resurser för utskriftsenhet i XML-format. Det här fältet ska anges om appen vill lokalisera anpassade utskriftsinställningar. Det här fältet är valfritt och resurslokalisering för utskriftsinställningar görs av utskriftssystemet om det här fältet inte finns.

  • DisplayName – Anger namnet på den virtuella skrivarkön som är installerad. Begränsningarna för den här strängen är desamma som de begränsningar du har för ett Windows-skrivarnamn.

  • PrinterUri – Anger en unik URI som kan användas av PSA-program för att identifiera skrivaren. En enda virtuell skrivarapp kan ange flera programslutpunkter som resulterar i att flera skrivare installeras. PrinterUri-fältet kan användas för att skilja mellan dessa skrivare. Detta anges som utdata från IppPrintDevice::PrinterUri API. Om URI inte har angetts tilldelar Windows skrivaren en godtycklig unik URI.

Exempel på enkel programvaruslutpunkt för PDF- och XPS-skrivare

Det här exemplet visar en bakgrundsaktivitet för en programslutpunktsapp som har registrerat två slutpunkter: Skriv ut till PDF och Skriv ut till XPS. Exemplet registrerar för VirtualPrinterDataAvailable händelse i sessionen och anrop startar. När händelsen utlöses innehåller händelseargumenten PDL-strömmen, målfilen, UI-starten och PDL-konverteraren. Appen konverterar PDL-indataformatet till PDF eller XPS baserat på skrivaren och skriver det resulterande innehållet till målfilens utdataström.

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

Starta användargränssnittet från en bakgrundsuppgift för en programvaruslutpunkt

API:et för Utskriftssupportappen v4 tillhandahåller möjligheter för bakgrundsuppgiften för mjukvaruslutpunkten att visa användaren användargränssnittet om det behövs. Detta använder det befintliga PSA-API:et PrintWorkflowUILauncher-klass. När bakgrundsaktiviteten anropar Funktionen LaunchAndCompleteUIAsync startas appen i användargränssnittskontext med hjälp av ett befintligt PSA-kontrakt Windows.printSupportJobUI. Mer information finns i exempel på programvaruslutpunktsgränssnittet.

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

Exempel på programvaruslutpunktsgränssnitt

Det här exemplet visar PSA-användargränssnittskontraktet som har ändrats för att stödja användargränssnittets start från bakgrundsaktiviteten Software Endpoint. Klassen PrintWorkflowJobUISession har modifierats för att inkludera en ny händelse VirtualPrinterUIDataAvailable. När användargränssnittet startas från bakgrundsaktiviteten för programslutpunkten anropas den nya händelsen. Programmet kan visa en förhandsversion för användaren med hjälp av PDL-källkontexten som tillhandahålls av 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
        }
    }
}

Programvaruslutpunkt som uppdaterar skrivarkonfigurationen

Programvaruslutpunkter kanske vill ändra skrivarkonfigurationen när användaren ändrar inställningarna. För att underlätta detta läggs funktionen RefreshPrintDeviceCapabilities till i klassen IppPrintDevice WinRT. När den här funktionen anropas anropas PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged Event, där appen kan uppdatera de aktuella funktionerna för utskriftsenheter.

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

Hämta och ändra standardbegäran för användarutskrift

IHV:er kanske vill visa och ändra standardinställningarna för utskrift när en PSA-app startas från Start-menyn. Därför läggs egenskapen UserDefaultPrintTicket till i klassen IppPrintDevice WinRT. Alla program kan hämta och ange användarens standardutskriftsbiljett med den här egenskapen.

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

Gör det enklare att arbeta med jobbattribut

Det kan vara svårt att skapa de fullständiga jobbattribut som krävs för att skapa ett jobb på skrivaren i de fall där en IHV kanske vill ta bort vissa attribut innan den skapade jobbbegäran skickas till skrivaren. En ConvertPrintTicketToJobAttributes läggs till i Winrt-klassen PrintWorkflowPrintJob för att hämta IPP-attributen för en utskriftsbiljett. Följande exempel visar hur en PSA kan hämta IPP-attribut från utskriftsbiljetten och ta bort mediastorleksattributet, som sedan skickas som en del av PDL-innehållet som skickas till skrivaren.

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

Konfigurera bildkvalitet för MXDC baserat på utskriftskvalitet

Aktuella äldre V4-utskriftsdrivrutiner från tredje part kan ange bildkvalitet som produceras av MXDC baserat på sidkvaliteten. Mer information finns i V4-drivrutinsmanifestet.

Om du går vidare till att ta bort äldre V3/V4-drivrutiner från tredje part, finns det ett behov av att tillhandahålla paritet för den här funktionen med hjälp av PSA-API:er. Därför tillhandahåller PSA v4-API:et en WinRT-klass för att hämta och ange konfiguration av bildkvalitet.

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

Implementera kontraktet PrintSupportSettingUI i appen WinAppSdk

Api:et för utskriftssupportapp v4 introducerar en egenskap i PrintSupportSettingsActivatedEventArgs Winrt-klass med namnet OwnerWindowId. Windows App SDK-programmet ansvarar för att skapa sitt fönster som ett modal-fönster till det angivna OwnerWindowId-fönstret.

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

Anmärkningar

Exempel i den här artikeln bygger på exemplen på PSA v1, PSA v2 API och PSA v3 API:er med antagandet att utvecklaren är bekant med PSA API-arbetsflödet.

Den här artikeln innehåller tilläggen för det befintliga offentliga API:et för utskriftsstödapplikationen som beskrivs i designguiden för utskriftssupportappen och Windows.Graphics.Printing.PrintSupport Namnrymd. PSA-API:et gör det möjligt för skrivartillverkare att utveckla UWP-appar som kan förbättra en utskriftsupplevelse för Windows-användare när de använder Inkorgens Microsoft IPP-klassdrivrutin, utan att behöva utveckla en anpassad drivrutin.

Utskriftskomponenter kommunicerar med PSA-appen via en PSA-koordinatorprocess.

ConvertPrintTicketToJobAttributes

Serviceplan upphör för skrivardrivrutiner från tredje part i Windows

GetPrinterAttributesAsBuffer

GetPrinterAttributes

IppPrintDevice

IppPrinterDevice::IsIppPrinter

IppPrintDevice::PrinterUri

LaunchAndCompleteUIAsync

OwnerWindowId

PrintSupportExtensionSession.SkrivarenhetensKapabiliteterÄndrade

PrintSupportSettingsActivatedEventArgs

PrintWorkflowJobUISession

PrintWorkflowPrintJob

PrintWorkflowUILauncher

RefreshPrintDeviceCapabilities

StällInSkrivarattribut

AngeSkrivarattributFrånBuffert

användargränssnittsexempel för mjukvaruslutpunkt

StorageFile

AnvändarStandardUtskriftsbiljett

VirtualPrinterDataAvailable

VirtualPrinterUIDataAvailable

Windows.Graphics.Printing.PrintSupport