Sdílet prostřednictvím


Průvodce návrhem rozhraní API pro podporu tisku v4

Rozhraní API pro podporu tisku v4 podporuje architekturu virtuální tiskárny, která usnadňuje implementaci virtuálních tiskáren bez starších ovladačů třetích stran. Díky této architektuře může nezávislý dodavatel softwaru (ISV) implementovat virtuální tiskárnu jako aplikaci, která implementuje funkce aktuálně podporované staršími ovladači V3/V4 třetích stran. Tento článek popisuje, jak se aplikace může zaregistrovat jako virtuální tiskárna a jak implementovat převod PDL a prvky uživatelského rozhraní vyžadované k implementaci.

Print Support App (PSA) je architektura, která byla zavedena, která pomáhá výrobcům IHV přidávat přizpůsobení tiskáren IPP bez použití starších ovladačů třetích stran. Pro usnadnění přechodu na novou virtuální tiskárnu jsou všechna rozhraní API součástí oboru názvů API aplikace pro podporu tisku a znovu používají některé kontrakty PSA, které platí pro architekturu virtuální tiskárny.

Další informace najdete v následujících článcích:

Námět Popis
Průvodce návrhem aplikace podpory tisku Poskytuje pokyny a příklady pro tiskárny OEM a IHV, které implementují aplikaci podpory tisku (PSA) pro své zařízení.
průvodce návrhem rozhraní API pro podporu tisku v3 Poskytuje pokyny a příklady pro tiskárny OEM a IHV, které implementují aplikaci podpory tisku v3 (PSA) pro své zařízení.
Specifikace manifestu MSIX pro virtuální tiskárnu podporující tisk Poskytuje pokyny a příklady manifestu MSIX pro tiskárny OEM a IHV, které implementují virtuální tiskárnu s podporou tisku.
Podpora přidružení aplikace pro tisk Obsahuje pokyny a příklady pro přidružení aplikace podpory tisku (PSA) k tiskárně.

Tento článek ukazuje, jak jsou rozhraní API PSA rozšířena tak, aby podporovala koncový bod softwaru a několik dalších scénářů PSA vyžadovaných IHD.

Terminologie

Termín Definice
PSA Aplikace podpory tisku. Aplikace pro UWP, která používá API v tomto dokumentu
MXDC Převaděč dokumentů microsoft XPS
MPD Moderní dialog pro tisk Toto dialogové okno se uživateli zobrazí, když aplikace tiská pomocí rozhraní API pro Windows.Graphics.Printing.
CPD Dialog pro běžný tisk Toto dialogové okno se uživateli zobrazí při tisku aplikace pomocí rozhraní API Win32.
IPP Protokol pro tisk přes internet. Používá se z klientského zařízení k interakci s tiskárnou k načtení a nastavení předvoleb tisku a odeslání dokumentu k tisku.
Podpora tisku přidružená tiskárna Fyzická tiskárna IPP, která je propojená s PSA.
Tiskárna IPP Tiskárna, která podporuje protokol IPP.
MSDW Microsoft Document Writer
Uživatelské rozhraní Předvoleb tiskárny Dialogové okno, kde uživatel může změnit předvolby související s tiskárnou, která by byla použita při tisku. Mezi příklady patří orientace, velikost papíru, barva, tisk na obě strany atd.
PDL Jazyk popisu stránky. Formát, ve kterém je dokument odeslán do tiskárny.
Přidružená tiskárna PSA Každý PSA je přidružený k fyzické tiskárně IPP.
Primární řadič domény Formát dokumentu PrintDeviceCapabilities XML pro definování možností tiskárny
SoftwareAppMon DLL pro monitor portů pro novou frontu virtuální tiskárny
PrintSupportExtension Úloha PSA na pozadí zodpovídá za poskytování funkce rozšíření omezení tiskárny.
  • virtuální tiskárna jako IppPrintDevice - IppPrintDevice je třída WinRT představená jako součást PSA API. Virtuální tiskárna je přidána jako IPP tiskárnové zařízení a IppPrinterDevice::IsIppPrinter vrací pravdivou hodnotu pro nově přidanou virtuální tiskárnu. To se provádí tak, aby průchod datového toku PDL bezproblémově fungoval pro virtuální tiskárny i tiskárny IPP a využíval většinu části rozhraní PSA API, která již existuje. Funkce třídy IppPrintDevice (GetPrinterAttributesAsBuffer, GetPrinterAttributes, SetPrinterAttributesFromBuffera SetPrinterAttributes) se odpovídajícím způsobem změní pro virtuální tiskárnu. GetPrinterAttributesAsBuffer a GetPrinterAttributes vždy vrací stav nepodporováno pro jakýkoli atribut IPP, který je předán, a SetPrinterAttributesFromBuffer a SetPrinterAttributes vždy vrací výsledek chyby s chybou nastavenou na odepřený přístup pro virtuální tiskárny. Důvodem je, že virtuální tiskárny určují pouze PDC v manifestu appx a nepodporují žádné atributy tiskárny IPP.

  • windows.printSupportSettingsUI smlouva pro opakované použití u virtuální tiskárny - Windows.printSupportSettingsUI je smlouva uživatelského rozhraní zavedená jako součást PSA, která zobrazuje uživatelské rozhraní vlastních předvoleb tisku pro uživatele tiskárny IPP pomocí PSA. Ukázky rozhraní API pro podporu tisku v4 v tomto článku znovu používají stejnou smlouvu, aby podporovala vlastní předvolby tisku pro uživatelské rozhraní pro virtuální tiskárnu bez jakýchkoli změn.

  • windows.printSupportJobUI contract reuse for Virtual Printer - Windows.printSupportJobUI je kontrakt uživatelského rozhraní zavedený jako součást PSA k zobrazení uživatelského rozhraní pro uživatele v případě, že PSA chce uživatelský vstup nebo zobrazit náhled tisku uživateli. Tento kontrakt se znovu používá pro virtuální tiskárnu, aby uživateli zobrazoval uživatelské rozhraní pro vstupy nebo zobrazení náhledu. Další informace najdete v ukázce uživatelského rozhraní koncového bodu softwaru pro změny rozhraní API v kontraktu Windows.printSupportJobUI.

  • windows.printSupportExtension contract reuse for Virtual Printer - Windows.printSupportExtension je kontrakt na pozadí zavedený jako součást PSA, který může používat PSA, pokud chce přizpůsobit validaci tiskové úlohy a další funkce. Virtuální tiskárny můžou tento kontrakt znovu použít, pokud aplikace chce provést vlastní ověření lístku tisku nebo regenerace primárního řadiče domény.

Následující diagram popisuje pracovní postup tisku pro virtuální tiskárnu.

obrázek znázorňující pracovní postup tisku pro virtuální tiskárnu.

Tato část popisuje, jak se instalují virtuální tiskárny pomocí položek manifestu appx a jak se virtuální tiskárna vyvolá v různých scénářích.

windows. PrintSupportVirtualPrinterWorkflow – kontrakt

Aby se aplikace zaregistrovala jako virtuální tiskárna, musí mít manifest XML, který je součástí balíčku appx pro UPW nebo instalačního programu MSIX.

Následující ukázka je manifest Appx pro virtuální tiskárnu a popis toho, k čemu každé pole odkazuje.

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

Jedná se o kontrakt používaný k instalaci fronty virtuálních tiskáren a může také fungovat jako koncový bod pozadí nainstalované virtuální tiskárny. Jeden manifest appx může nainstalovat více tiskových front, které jsou přidružené ke stejné nainstalované aplikaci. Když uživatel tiskne na novou frontu virtuální tiskárny, aplikace Virtuální tiskárna se spustí na pozadí a vyvolá události s runtime třídou PrintWorkflowVirtualPrinterDataAvailableEventArgs jako argumenty události. Třída modulu runtime má rozhraní API ke čtení dat PDL, spuštění uživatelského rozhraní pro aplikaci v případě potřeby atd.

  • PrintSupportVirtualPrinter – Každá položka určuje tiskovou frontu pro koncový bod softwaru, která se nainstaluje spolu s aplikací.

  • PreferredInputFormat – toto pole označuje upřednostňovaný vstupní formát PDL pro virtuální tiskárnu. Systém Tisku systému Windows vygeneruje tento formát před předáním dat PDL virtuální tiskárně pro všechny tiskové cesty. Pole může být pouze následující hodnoty: application/oxps nebo application/postscript. Instalace selže, pokud jsou v tomto poli zadány jiné formáty. Pokud není pole specifikováno, nastaví se application/oxps jako upřednostňovaný formát PDL pro nainstalovanou virtuální tiskárnu.

  • OutputFileTypes – pokud je toto pole zadáno v manifestu appx, vytvoří tiskový systém Windows frontu tiskárny, která je označená jako souborová tiskárna, a dialogové okno Uložit jako se uživateli zobrazí, když aplikace začne tisknout na virtuální tiskárnu. Hodnoty tohoto pole by měly obsahovat cílové přípony souborů, jako jsou pdf/pwgr/ps atd. Tyto hodnoty se ukládají v datech ovladačů a přidají se do dialogu Uložit jako jako povolená rozšíření. Systém tisku Windows vytvoří třídu StorageFile pro uživatelem vybraný soubor a předá ji jako součást API událostních argumentů aplikaci virtuální tiskárny. Pokud virtuální tiskárna nechce chování při tisku souborů (to zahrnuje virtuální tiskárny, které ukládají data tisku do cloudu nebo tiskáren, které odesílají data do aplikace, jako je OneNote), nemělo by se toto pole přidat do manifestu.

obrázek s dialogovým oknem Uložit výstup tisku.

  • Podporované formáty – Virtuální tiskárna může toto pole použít k určení všech formátů PDL, které může zpracovat. Používá se pro průchozí tiskové aplikace, jako je Microsoft Edge, k identifikaci podporovaného formátu, jako je PDF, a přímé předání datového proudu PDF virtuální tiskárně bez jakýchkoli změn provedených mezi systémem Windows Print. Toto pole má jako podřízené pole SupportedFormat. SupportedFormat má pole Typ pole pro určení podporovaného typu MIME a pole MaxVersion určuje maximální verzi formátu PDL, který může virtuální tiskárna přijímat. Hodnota MaxVersion musí být ve formátu MajorVersion.MinorVersion. Tiskový systém Windows selže s instalací tiskárny, pokud je v jiném formátu. MajorVersion a MinorVersion mohou být čísla pouze tehdy, pokud se vyskytují jakékoli znaky, pole verze je neplatné a ignorováno.

  • PdcFile – toto pole musí odkazovat na soubor prostředků v balíčku aplikace. Soubor by měl obsahovat obsah ve formátu XML Funkce tiskového zařízení, který slouží k definování možností tiskárny a měl by se použít k definování vlastních funkcí, možností nebo parametrů. Toto je povinné pole a instalace tiskárny selže, pokud hodnota není k dispozici nebo pokud obsah souboru není v platném formátu primárního řadiče domény.

  • PdrFile – Pokud je toto pole zadané, musí odkazovat na soubor prostředků v balíčku aplikace. Soubor by měl obsahovat prostředky tiskového zařízení ve formátu XML. Toto pole by se mělo poskytnout, pokud aplikace chce lokalizovat vlastní předvolby tisku. Toto pole je volitelné a lokalizace prostředků pro předvolby tisku provádí systém tisku, pokud toto pole není k dispozici.

  • DisplayName – Určuje název fronty virtuální tiskárny, která je nainstalována. Omezení tohoto řetězce jsou stejná jako omezení, která platí pro název tiskárny ve Windows.

  • PrinterUri – Určuje jedinečný identifikátor URI, který mohou aplikace PSA použít k identifikaci tiskárny. Jedna aplikace virtuální tiskárny může zadat několik koncových bodů softwaru, které mají za následek instalaci více tiskáren. Pole PrinterUri lze použít k rozlišení mezi těmito tiskárnami. To je poskytováno jako výstup z rozhraní API IppPrintDevice::PrinterUri. Pokud není zadaný identifikátor URI, systém Windows přiřadí tiskárně libovolný jedinečný identifikátor URI.

Ukázka jednoduchého koncového bodu softwaru pro tiskárny PDF a XPS

Tato ukázka ukazuje úlohu na pozadí softwarové aplikace pro koncový bod, která zaregistrovala dva koncové body: Tisk do PDF a Tisk do XPS. Ukázka zaregistruje událost VirtualPrinterDataAvailable v relaci a volání se spustí. Při vyvolání události obsahují argumenty události stream PDL, cílový soubor, spouštěč uživatelského rozhraní a převaděč PDL. Aplikace převede vstupní formát PDL na PDF nebo XPS na základě tiskárny a zapíše výsledný obsah do výstupního datového proudu cílového souboru.

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

Spuštění uživatelského rozhraní z úlohy na pozadí softwarového koncového bodu

Rozhraní API pro podporu tisku v4 poskytuje možnost pro úlohu na pozadí koncového bodu softwaru k zobrazení uživatelského rozhraní uživateli, pokud je to potřeba. To používá existující rozhraní PSA API PrintWorkflowUILauncher třída. Když úloha na pozadí volá funkci LaunchAndCompleteUIAsync, aplikace se spustí v kontextu uživatelského rozhraní pomocí existující smlouvy PSA Windows.printSupportJobUI. Další informace najdete v ukázce uživatelského rozhraní koncového bodu softwaru .

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

Ukázka uživatelského rozhraní koncového bodu softwaru

Tato ukázka ukazuje kontrakt uživatelského rozhraní PSA upravený tak, aby podporoval spouštění uživatelského rozhraní z úlohy na pozadí koncového bodu softwaru. PrintWorkflowJobUISession Třída byla upravena, aby měla novou událost VirtualPrinterUIDataAvailable. Při spuštění uživatelského rozhraní z úlohy na pozadí koncového bodu softwaru se vyvolá nová událost. Aplikace může uživateli zobrazit náhled pomocí zdrojového kontextu PDL poskytnutých argumentů události.

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

Aktualizace konfigurace tiskárny koncovým bodem softwaru

Koncové body softwaru můžou chtít změnit konfiguraci tiskárny, když uživatel změní nastavení. Pro usnadnění je funkce RefreshPrintDeviceCapabilities přidána do třídy IppPrintDevice WinRT. Když se tato funkce volá, vyvolá PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged událost, kde může aplikace aktualizovat aktuální schopnosti tiskového zařízení.

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

Získání a změna výchozí tiskové úlohy uživatele

IHV může chtít zobrazit a upravit výchozí předvolby tisku při spuštění aplikace PSA z nabídky Start. Z tohoto důvodu je vlastnost UserDefaultPrintTicket přidána do třídy IppPrintDevice WinRT. Pomocí této vlastnosti může libovolná aplikace získat a nastavit výchozí lístek tisku uživatele.

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

Usnadnění práce s atributy úloh

Může být obtížné vytvořit úplné atributy úlohy potřebné k vytvoření úlohy na tiskárně v případech, kdy IHV může před odesláním vytvořené žádosti o úlohu na tiskárně odebrat určité atributy. ConvertPrintTicketToJobAttributes se přidá do třídy Winrt PrintWorkflowPrintJob pro získání atributů IPP lístku tiskárny. Následující ukázka demonstruje, jak může PSA získat atributy IPP z tiskové úlohy a odstranit atribut velikosti média, který je pak odeslán jako součást obsahu PDL odeslaného na tiskárnu.

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

Konfigurace kvality obrázku MXDC na základě kvality výstupu stránky

Aktuální starší verze ovladačů tisku třetích stran V4 může na základě kvality stránky určit kvalitu obrazu vytvořenou službou MXDC. Další informace naleznete v V4 Driver Manifest.

Přechodem k vyřazení starších ovladačů třetích stran V3/V4 je potřeba zajistit paritu této funkce pomocí rozhraní PSA API. Z tohoto důvodu rozhraní API PSA v4 poskytuje třídu WinRT pro získání a nastavení konfigurace kvality image.

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

Implementace kontraktu PrintSupportSettingUI v aplikaci WinAppSdk

Rozhraní API pro podporu tisku v4 zavádí vlastnost v PrintSupportSettingsActivatedEventArgs Winrt třídy s názvem OwnerWindowId. Aplikace Windows App SDK je zodpovědná za vytvoření svého okna jako modálního k danému oknu OwnerWindowId.

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

Poznámky

Ukázky v tomto článku jsou založené na ukázkách rozhraní PSA v1, PSA v2 API a rozhraní API PSA v3 s předpokladem, že vývojář je obeznámen s pracovním postupem rozhraní PSA API.

Tento článek obsahuje rozšíření pro existující veřejné rozhraní API pro podporu tisku, popsané v průvodci návrhem aplikace pro podporu tisku a v oboru názvů Windows.Graphics.Printing.PrintSupport. Rozhraní PSA API umožňuje výrobcům tiskáren vyvíjet aplikace pro UWP, které můžou vylepšit tiskovou zkušenost uživatelů systému Windows při používání vestavěného ovladače Microsoft IPP Class Driver, bez nutnosti vývoje vlastního ovladače.

Tiskové komponenty komunikují s aplikací PSA prostřednictvím procesu zprostředkovatele PSA.

ConvertPrintTicketToJobAttributes

Ukončení plánu údržby pro ovladače tiskáren třetích stran ve Windows

GetPrinterAttributesAsBuffer

GetPrinterAttributes

IppPrintDevice

IppPrinterDevice::IsIppPrinter

IppPrintDevice::PrinterUri

LaunchAndCompleteUIAsync

OwnerWindowId

PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged

PrintSupportSettingsActivatedEventArgs

PrintWorkflowJobUISession

PrintWorkflowPrintJob

PrintWorkflowUILauncher

RefreshPrintDeviceCapabilities

NastavitVlastnostiTiskárny

SetPrinterAttributesFromBuffer

Ukázka uživatelského rozhraní koncového bodu softwaru

StorageFile

UserDefaultPrintTicket

VirtuálníTiskárnaDataDostupná

VirtualPrinterUIDataAvailable

Windows.Graphics.Printing.PrintSupport