Delen via


"Print Support App v4 API ontwerphandleiding"

Print Support App v4 API ondersteunt een virtuele printerarchitectuur om de implementatie van virtuele printers zonder verouderde stuurprogramma's van derden te vergemakkelijken. Via deze architectuur kan een onafhankelijke softwareleverancier (ISV) een virtuele printer implementeren als een toepassing die de functies implementeert die momenteel worden ondersteund door verouderde V3/V4-stuurprogramma's van derden. In het artikel wordt beschreven hoe een toepassing zichzelf kan registreren als een virtuele printer en hoe u PDL-conversie en UI-elementen implementeert die nodig zijn voor implementatie.

Print Support App (PSA) is de architectuur die is geïntroduceerd om IHD's te helpen bij het toevoegen van aanpassingen aan IPP-printers zonder het gebruik van verouderde stuurprogramma's van derden. Om het gemak van de overgang naar de nieuwe virtuele printer te vergemakkelijken, maken alle API's deel uit van de API-naamruimte Print Support App* en worden enkele PSA-contracten hergebruikt die van toepassing zijn op de architectuur van de virtuele printer.

Zie de volgende artikelen voor meer informatie:

Onderwerp Beschrijving
Ontwerphandleiding voor Print Support App Biedt richtlijnen en voorbeelden voor printer-OEM's en IHD's die een print support-app (PSA) implementeren voor hun apparaat.
ontwerphandleiding voor Print Support App v3 API Biedt richtlijnen en voorbeelden voor printer-OEM's en IHD's die een v3 Print Support App (PSA) implementeren voor hun apparaat.
MSIX-manifestspecificatie voor afdrukondersteuning van virtuele printers Biedt richtlijnen en voorbeelden voor MSIX-manifesten voor printer-OEM's en onafhankelijke hardwareleveranciers (IHVs) die een virtuele printer voor printondersteuning implementeren.
Ondersteunings-app-koppeling afdrukken Bevat richtlijnen en voorbeelden voor het koppelen van een print support-app (PSA) aan een printer.

In dit artikel wordt beschreven hoe PSA-API's worden uitgebreid ter ondersteuning van software-eindpunten en enkele andere PSA-scenario's die zijn vereist voor IHD's.

Terminologie

Term Definitie
PSA Toepassing voor printondersteuning. UWP-app die gebruikmaakt van de API in dit document.
MXDC Microsoft XPS-documentconversieprogramma
MPD Modern afdrukdialoogvenster. Dit dialoogvenster wordt weergegeven aan de gebruiker wanneer een app afdrukt met behulp van de Windows.Graphics.Printing-API.
Voortdurende professionele ontwikkeling Het algemene dialoogvenster Afdrukken. Dit dialoogvenster wordt weergegeven aan de gebruiker wanneer de app afdrukt met behulp van de Win32-API.
IPP Internet Printing Protocol. Wordt gebruikt vanaf een clientapparaat om te communiceren met de printer om afdrukvoorkeuren op te halen en in te stellen en het document te verzenden dat moet worden afgedrukt.
Afdrukondersteuning gekoppelde printer Fysieke IPP-printer die is gekoppeld aan PSA.
IPP-printer Printer die het IPP-protocol ondersteunt.
MSDW Microsoft Document Writer
De gebruikersinterface voor printervoorkeuren Dialoogvenster waarin de gebruiker de voorkeuren kan wijzigen die betrekking hebben op een printer, die op het moment van afdrukken worden toegepast. Voorbeelden zijn afdrukstand, papierformaat, kleur, afdrukken aan beide zijden, enzovoort.
PDL Taal voor paginabeschrijving. De indeling waarin een document naar de printer wordt verzonden.
Gekoppelde PSA-printer Elke PSA is gekoppeld aan een fysieke IPP-printer.
PDC Xml-documentindeling PrintDeviceCapabilities voor het definiëren van printermogelijkheden.
SoftwareAppMon Poortmonitor-DLL voor nieuwe wachtrij voor virtuele printer
PrintSupportExtension PSA-achtergrondtaak is verantwoordelijk voor het bieden van mogelijkheden voor printerbeperkingsuitbreidingen.
  • Virtuele printer als IppPrintDevice - IppPrintDevice is een Winrt-klasse die is geïntroduceerd als onderdeel van de PSA-API's. De virtuele printer wordt toegevoegd als een IPP-printerapparaat en IppPrinterDevice::IsIppPrinter geeft true terug voor de nieuw toegevoegde virtuele printer. Dit wordt gedaan zodat PDL-passthrough naadloos werkt voor zowel virtuele printers als IPP-printers en om veel psa API-oppervlak dat al aanwezig is, opnieuw te gebruiken. De klassefuncties IppPrintDevice (GetPrinterAttributesAsBuffer, GetPrinterAttributes, SetPrinterAttributesFromBufferen SetPrinterAttributes) worden dienovereenkomstig gewijzigd voor Virtual Printer. GetPrinterAttributesAsBuffer en GetPrinterAttributes retourneren altijd 'niet ondersteund' voor elk doorgegeven IPP-kenmerk, en SetPrinterAttributesFromBuffer en SetPrinterAttributes retourneren altijd een foutresultaat met de fout ingesteld op 'toegang geweigerd' voor virtuele printers. Dit komt doordat virtuele printers alleen PDC opgeven in het appx-manifest en geen IPP-printerkenmerken ondersteunen.

  • windows.printSupportSettingsUI-contracthergebruik voor virtuele printer - Windows.printSupportSettingsUI is een UI-contract dat is geïntroduceerd als onderdeel van PSA om een aangepaste afdrukvoorkeuren-UI voor de gebruiker van de IPP-printer met PSA weer te geven. De voorbeelden van de Print Support App v4-API in dit artikel gebruiken hetzelfde contract om aangepaste afdrukvoorkeuren voor de gebruikersinterface voor virtuele printer te ondersteunen zonder wijzigingen.

  • windows.printSupportJobUI-contract opnieuw gebruiken voor Virtual Printer - Windows.printSupportJobUI is een UI-contract dat is geïntroduceerd als onderdeel van PSA om de gebruikersinterface voor de gebruiker weer te geven in het geval PSA gebruikersinvoer wil of het afdrukvoorbeeld aan de gebruiker wil weergeven. Dit contract wordt opnieuw gebruikt voor virtuele printer om de gebruikersinterface weer te geven aan de gebruiker voor invoer of om preview weer te geven. Zie het gebruikersinterfacevoorbeeld van Software-eindpunt voor de wijzigingen aan de API's in het contract Windows.printSupportJobUI.

  • windows.printSupportExtension-contract hergebruik voor Virtual Printer - Windows.printSupportExtension is een achtergrondcontract dat is geïntroduceerd als onderdeel van PSA, dat kan worden gebruikt door PSA als ze aangepaste printticketvalidatie en andere functies willen. Virtuele printers kunnen dit contract ook opnieuw gebruiken als de app aangepaste validatie van het afdrukticket of PDC-regeneratie wil uitvoeren.

In het volgende diagram wordt de afdrukwerkstroom voor een virtuele printer beschreven.

een afbeelding met de afdrukwerkstroom voor een virtuele printer.

In deze sectie wordt beschreven hoe virtuele printers worden geïnstalleerd met behulp van appx-manifestvermeldingen en hoe een virtuele printer wordt aangeroepen in verschillende scenario's.

Windows.PrintSupportVirtualPrinterWorkflow-contract

Om zichzelf te registreren als een Virtuele Printer, moet een app een XML-manifest hebben dat deel uitmaakt van het UWP-appx-pakket of MSIX-installatieprogramma.

Het volgende voorbeeld is een Appx-manifest voor een virtuele printer en de beschrijving van wat elk veld verwijst.

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

Dit is een contract dat wordt gebruikt voor het installeren van de wachtrij voor virtuele printers en kan ook fungeren als een achtergrondeindpunt voor de geïnstalleerde virtuele printer. Eén appx-manifest kan meerdere afdrukwachtrijen installeren, die aan dezelfde geïnstalleerde toepassing zijn gekoppeld. Wanneer een gebruiker naar de nieuwe Virtuele Printerwachtrij afdrukt, wordt de Virtuele Printer-toepassing op de achtergrond gestart en worden er gebeurtenissen gegenereerd met de runtime-klasse PrintWorkflowVirtualPrinterDataAvailableEventArgs als Event Args. De runtimeklasse bevat API's voor het lezen van de PDL-gegevens, het starten van de gebruikersinterface voor de toepassing, indien nodig, enzovoort.

  • PrintSupportVirtualPrinter - Elke vermelding geeft één afdrukwachtrij voor software-eindpunten op die samen met de toepassing moet worden geïnstalleerd.

  • PreferredInputFormat - Dit veld geeft de voorkeurs-PDL-indeling voor invoer van de virtuele printer aan. Windows Print System genereert deze indeling voordat PDL-gegevens aan de virtuele printer worden gegeven voor alle afdrukpaden. Het veld kan alleen de volgende waarden zijn: application/oxps of application/postscript. De installatie mislukt als er andere indelingen zijn opgegeven in dit veld. Als het veld niet is opgegeven, wordt toepassing/oxps ingesteld als de voorkeursinvoer PDL-indeling voor de geïnstalleerde virtuele printer.

  • OutputFileTypes: wanneer dit veld is opgegeven in het appx-manifest, maakt het Windows Print System een printerwachtrij die is gemarkeerd als een bestandsprinter en wordt het dialoogvenster Opslaan als weergegeven aan de gebruiker wanneer een toepassing begint met afdrukken naar de virtuele printer. De waarden van dit veld moeten doelbestandsextensies bevatten, zoals pdf/pwgr/ps etc. Deze waarden worden opgeslagen in stuurprogrammagegevens en worden toegevoegd aan Opslaan als dialoogvenster als de toegestane extensies. Windows Print System maakt een StorageFile-klasse voor het door de gebruiker geselecteerde bestand en wordt aan de virtuele printer-app gegeven als onderdeel van de Event Args-API. Als een virtuele printer geen afdrukgedrag voor bestanden wil (inclusief virtuele printers waarin afdrukgegevens worden opgeslagen in de cloud of printers die gegevens verzenden naar een toepassing zoals OneNote), moet dit veld niet worden toegevoegd aan het manifest.

een afbeelding van het dialoogvenster 'opslaan als afdrukuitvoer'.

  • Ondersteunde indelingen - Virtual Printer kan dit veld gebruiken om alle PDL-indelingen op te geven die kunnen worden verwerkt. Dit wordt gebruikt voor doorsluisafdruktoepassingen zoals Microsoft Edge om de ondersteunde indeling, zoals PDF, te identificeren en rechtstreeks een PDF-datastroom door te geven aan de virtuele printer zonder dat het Windows Print-systeem wijzigingen aanbrengt. Dit veld heeft SupportedFormat als subveld. SupportedFormat heeft het veld Type om het ondersteunde MIME-type op te geven en het veld MaxVersion specificeert de maximale versie van die PDL-indeling die de virtuele printer kan ontvangen. De waarde MaxVersion moet de indeling MajorVersion.MinorVersion hebben. De installatie van het Windows-afdruksysteem mislukt als de printer in een ander formaat is. MajorVersion en MinorVersion mogen alleen nummers bevatten; als er tekens aanwezig zijn, wordt het versieveld ongeldig gemaakt en genegeerd.

  • PdcFile-: dit veld moet verwijzen naar een resourcebestand in het toepassingspakket. Het bestand moet inhoud bevatten in de XML-indeling voor afdrukapparaatmogelijkheden, die wordt gebruikt om printermogelijkheden te definiëren en moet ook worden gebruikt om aangepaste functies, opties of parameters te definiëren. Dit is een verplicht veld en de printerinstallatie mislukt als de waarde niet aanwezig is of als de bestandsinhoud niet in geldige PDC-indeling is.

  • PdrFile-: als dit veld is opgegeven, moet dit veld verwijzen naar een resourcebestand in het toepassingspakket. Het bestand moet afdrukapparaatbronnen in een XML-indeling bevatten. Dit veld moet worden opgegeven als de app aangepaste afdrukvoorkeuren wil lokaliseren. Dit veld is optioneel en resourcelokalisatie voor afdrukvoorkeuren wordt uitgevoerd door het afdruksysteem als dit veld niet aanwezig is.

  • DisplayName - Hiermee geeft u de naam op van de virtuele printerwachtrij die is geïnstalleerd. De beperkingen van deze tekenreeks zijn hetzelfde als de beperkingen die u hebt voor de naam van een Windows-printer.

  • PrinterUri- - Hiermee geeft u een unieke URI op die door PSA-toepassingen kan worden gebruikt om de printer te identificeren. Eén virtual printer-app kan meerdere software-eindpunten opgeven, waardoor meerdere printers moeten worden geïnstalleerd. Het veld PrinterUri kan worden gebruikt om onderscheid te maken tussen deze printers. Dit is de uitvoer van IppPrintDevice::PrinterUri API. Als de URI niet is opgegeven, wijst Windows een willekeurige unieke URI toe aan de printer.

Voorbeeld van eenvoudig software-eindpunt voor PDF- en XPS-printers

In dit voorbeeld ziet u een achtergrondtaak van een software-eindpunt-app die twee eindpunten heeft geregistreerd: Afdrukken naar PDF en Afdrukken naar XPS. Het voorbeeld registreert zich voor VirtualPrinterDataAvailable gebeurtenis in de sessie en oproepen worden gestart. Wanneer de event wordt gegenereerd, bevat Event Args de PDL-stream, het doelbestand, de UI launcher en de PDL-converter. De app converteert de PDL-invoerindeling naar PDF of XPS op basis van de printer en schrijft de resulterende inhoud naar de uitvoerstroom van het doelbestand.

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

De UI starten vanuit een achtergrondtaak van een software-eindpunt

De Print Support App v4-API biedt de mogelijkheid voor de achtergrondtaak van een software-eindpunt om indien nodig een gebruikersinterface aan de gebruiker te tonen. Hierbij wordt gebruikgemaakt van de bestaande PSA-API PrintWorkflowUILauncher Klasse. Wanneer de achtergrondtaak de functie LaunchAndCompleteUIAsync aanroept, wordt de app gestart in de UI-context met behulp van een bestaand PSA-contract Windows.printSupportJobUI. Voor meer informatie, zie het gebruikersinterfacevoorbeeld van het software-eindpunt.

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

Voorbeeld van gebruikersinterface van software-eindpunt

In dit voorbeeld ziet u het PSA UI-contract dat is gewijzigd ter ondersteuning van het starten van de gebruikersinterface vanuit de achtergrondtaak software-eindpunt. PrintWorkflowJobUISession klasse wordt aangepast om een nieuw evenement VirtualPrinterUIDataAvailablete bevatten. Wanneer de gebruikersinterface wordt gestart vanuit de achtergrondtaak van het software-eindpunt, wordt de nieuwe gebeurtenis aangeroepen. De toepassing kan een voorbeeld voor de gebruiker weergeven met behulp van de PDL-broncontext die wordt geleverd door event args.

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

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

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

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

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

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

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

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

Software-eindpunt bijwerken van de printerconfiguratie

Software-eindpunten willen mogelijk de printerconfiguratie wijzigen wanneer de gebruiker de instellingen wijzigt. Om dit mogelijk te maken, wordt de functie RefreshPrintDeviceCapabilities toegevoegd in de klasse IppPrintDevice WinRT. Wanneer deze functie wordt aangeroepen, wordt de PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged Event aangeroepen, waar de app de huidige mogelijkheden van het afdrukapparaat kan bijwerken.

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

Standaard printticket van gebruiker ophalen en aanpassen

IHV's willen mogelijk de standaard afdrukvoorkeuren weergeven en wijzigen wanneer een PSA-app wordt geopend vanuit het startmenu. Daarom wordt de eigenschap UserDefaultPrintTicket toegevoegd aan de klasse IppPrintDevice WinRT. Elke toepassing kan met deze eigenschap het standaardafdrukticket van de gebruiker ophalen en instellen.

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

Eenvoudiger werken met taakkenmerken

Het kan lastig zijn om de volledige taakkenmerken te maken die nodig zijn om een taak op de printer te maken in gevallen waarin een IHV bepaalde kenmerken kan verwijderen voordat de gemaakte taakaanvraag naar de printer wordt verzonden. Er wordt een ConvertPrintTicketToJobAttributes- toegevoegd aan de WinRT-klasse PrintWorkflowPrintJob om de IPP-kenmerken voor een printerticket te verkrijgen. In het volgende voorbeeld ziet u hoe een PSA IPP-kenmerken kan ophalen uit het afdrukticket en het kenmerk Mediagrootte kan verwijderen, dat vervolgens wordt verzonden als onderdeel van de PDL-inhoud die naar de printer wordt verzonden.

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

Afbeeldingskwaliteit van MXDC configureren op basis van de kwaliteit van de pagina-uitvoer

Huidige verouderde V4-afdrukstuurprogramma's van derden kunnen de afbeeldingskwaliteit opgeven die door MXDC wordt geproduceerd op basis van de paginakwaliteit. Voor meer informatie, zie V4-stuurprogrammamanifest.

Als u verdergaat met het afschaven van verouderde V3/V4-stuurprogramma's van derden, moet u pariteit bieden voor deze functie met behulp van PSA-API's. Daarom biedt de PSA v4-API een WinRT-klasse voor het ophalen en instellen van de configuratie van de beeldkwaliteit.

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

PrintSupportSettingUI-contract implementeren in App WinAppSdk

De Print Support App v4 API introduceert een eigenschap in PrintSupportSettingsActivatedEventArgs Winrt-klasse met de naam OwnerWindowId. De Windows App SDK-toepassing is verantwoordelijk voor het maken van het venster als een modaal venster voor het opgegeven OwnerWindowId venster.

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

Opmerkingen

Voorbeelden in dit artikel zijn gebouwd op basis van de voorbeelden van de PSA v1-, PSA v2-API en PSA v3-API's met de veronderstelling dat de ontwikkelaar bekend is met de PSA API-werkstroom.

Dit artikel bevat de extensies voor de bestaande openbare Print Support Application-API die wordt beschreven in de ontwerphandleiding voor printondersteunings-apps en Windows.Graphics.Printing.PrintSupport naamruimte. Met de PSA-API kunnen printerfabrikanten UWP-apps ontwikkelen die de afdrukervaring van Windows-gebruikers kunnen verbeteren tijdens het gebruik van de ingebouwde Microsoft IPP Class Driver, zonder dat hiervoor een aangepast stuurprogramma hoeft te worden ontwikkeld.

Afdrukonderdelen communiceren met de PSA-app via een PSA-brokerproces.

ConvertPrintTicketToJobAttributes

einde van het onderhoudsplan voor printerstuurprogramma's van derden in Windows

GetPrinterAttributesAsBuffer

GetPrinterAttributes

IppPrintDevice

IppPrinterDevice::IsIppPrinter

IppPrintDevice::PrinterUri

LaunchAndCompleteUIAsync

OwnerWindowId

PrintapparaatmogelijkhedenGewijzigd

nl-NL: PrintSupportSettingsActivatedEventArgs

PrintWorkflowJobUISession

PrintWorkflowPrintJob

PrintWorkflowUILauncher

VernieuwPrintapparaatmogelijkheden

StelPrinterEigenschappenIn

StelPrinterAttributenVanBufferIn

voorbeeld van gebruikersinterface voor software-eindpunten

StorageFile

UserDefaultPrintTicket

VirtualPrinterDataAvailable

VirtualPrinterUIDataAvailable

Windows.Graphics.Printing.PrintSupport