Designhandbuch zur API der Druckunterstützungs-App v4
Die Print Support App v4-API unterstützt eine virtuelle Druckerarchitektur, um die Implementierung virtueller Drucker ohne ältere Treiber von Drittanbietern zu vereinfachen. Durch diese Architektur kann ein unabhängiger Softwareanbieter (ISV) einen virtuellen Drucker als Anwendung implementieren, die die derzeit von älteren V3/V4-Treibern unterstützten Features implementiert. In diesem Artikel wird beschrieben, wie sich eine Anwendung als virtueller Drucker registrieren und PDL-Konvertierungs- und UI-Elemente implementieren kann, die für die Implementierung erforderlich sind.
Print Support App (PSA) ist die Architektur, die IHVs dabei hilft, IPP-Druckern Anpassungen hinzuzufügen, ohne ältere Treiber von Drittanbietern zu verwenden. Um den einfachen Übergang zum neuen virtuellen Drucker zu erleichtern, sind alle APIs Teil des Api-Namespace "Print Support App*" und verwenden einige der PSA-Verträge, die für die Virtuelle Druckerarchitektur gelten.
Weitere Informationen finden Sie in den folgenden Artikeln:
Thema | Beschreibung |
---|---|
Anleitung zum Entwurf der Druckunterstützungs-App | Enthält Anleitungen und Beispiele für Drucker-OEMs und IHVs, die eine Druckunterstützungs-App (PSA) für ihr Gerät implementieren. |
Anleitung zum Entwurf von Druckunterstützungs-App v3-API | Enthält Anleitungen und Beispiele für Drucker-OEMs und IHVs, die eine v3 Print Support App (PSA) für ihr Gerät implementieren. |
MSIX-Manifest-Spezifikation für druckunterstützende virtuelle Drucker | Enthält MSIX-Manifest-Anleitungen und Beispiele für Drucker-OEMs und IHVs, die einen druckunterstützenden virtuellen Drucker für ihr Gerät implementieren. |
Zuordnung der Druckunterstützungs-App | Enthält Anleitungen und Beispiele zum Zuordnen einer Druckunterstützungs-App (PSA) zu einem Drucker. |
In diesem Artikel wird gezeigt, wie PSA-APIs erweitert werden, um Softwareendpunkte und einige andere für IHVs erforderliche PSA-Szenarien zu unterstützen.
Terminologie
Begriff | Definition |
---|---|
PSA | Druckunterstützungsanwendung. UWP-App, die die API in diesem Dokument verwendet. |
MXDC | Microsoft XPS-Dokumentkonverter |
MPD | Dialogfeld Moderner Druck. Dieses Dialogfeld wird dem Benutzer angezeigt, wenn eine App mit der Windows.Graphics.Printing-API druckt. |
CPD | Allgemeines Dialogfeld Drucken. Dieses Dialogfeld wird dem Benutzer angezeigt, wenn die App mit der Win32-API gedruckt wird. |
IPP | Internet-Druckprotokoll. Wird von einem Clientgerät verwendet, um mit dem Drucker zu interagieren, um Druckeinstellungen abzurufen und festzulegen und das Dokument zu senden, das gedruckt werden soll. |
Zugehöriger Drucker mit Druckunterstützung | Physischer IPP-Drucker, der mit PSA verknüpft ist. |
IPP-Drucker | Drucker, der das IPP-Protokoll unterstützt. |
MSDW | Microsoft Document Writer |
Benutzeroberfläche für Druckereinstellungen | Dialogfeld zum Ändern der Einstellungen für einen Drucker, die während des Drucks angewendet werden. Beispiele sind Ausrichtung, Papierformat, Farbe, Drucken auf beiden Seiten usw. |
PDL | Datenbeschreibungssprache. Das Format, in dem ein Dokument an den Drucker gesendet wird. |
Zugeordneter PSA-Drucker | Jeder PsA ist einer physischen IPP-Anwendung zugeordnet. |
PDC | PrintDeviceCapabilities XML-Dokumentformat zum Definieren von Druckerfunktionen. |
SoftwareAppMon | Portüberwachungs-DLL für neue virtuelle Druckerwarteschlange |
PrintSupportExtension | PSA-Hintergrundaufgabe ist die für die Bereitstellung von Druckereinschränkungsfunktionen verantwortlich. |
Wiederverwenden der Druckunterstützungs-APIs für Softwareendpunkt
Virtual Printer as IppPrintDevice - IppPrintDevice ist eine Winrt-Klasse, die als Teil der PSA-APIs eingeführt wird. Der virtuelle Drucker wird als IPP-Druckergerät hinzugefügt und IppPrinterDevice::IsIppPrinter gibt „true” für den neu hinzugefügten virtuellen Drucker zurück. Dies geschieht, damit der PDL-Passthrough sowohl für virtuelle Drucker als auch für IPP-Drucker nahtlos funktioniert und ein Großteil der bereits vorhandenen PSA-API-Oberfläche wiederverwendet werden kann. Die Klassenfunktionen IppPrintDevice (GetPrinterAttributesAsBuffer, GetPrinterAttributes, SetPrinterAttributesFromBuffer und SetPrinterAttributes) werden entsprechend für virtuellen Drucker geändert. GetPrinterAttributesAsBuffer und GetPrinterAttributes geben immer „nicht unterstützt” für jedes übergebene IPP-Attribut zurück, und SetPrinterAttributesFromBuffer und SetPrinterAttributes geben immer ein Fehlerergebnis mit dem Fehler „Zugriff verweigert” für virtuelle Drucker zurück. Dies liegt daran, dass virtuelle Drucker nur PDC im Appx-Manifest angeben und keine IPP-Druckerattribute unterstützen.
windows.printSupportSettingsUI-Vertragswiederverwendung für virtuelle Drucker - Windows.printSupportSettingsUI ist ein UI-Vertrag, der als Teil von PSA eingeführt wurde, um benutzerdefinierte Druckpräferenzen für die Benutzeroberfläche des IPP-Druckers unter Verwendung von PSA anzuzeigen. Die Print Support App v4-API-Beispiele in diesem Artikel verwenden denselben Vertrag, um benutzerdefinierte Druckeinstellungen für die Benutzeroberfläche für virtuellen Drucker ohne Änderungen zu unterstützen.
windows.printSupportJobUI-Vertragswiederverwendung für virtuelle Drucker - Windows.printSupportJobUI ist ein UI-Vertrag, der als Teil von PSA eingeführt wurde, um die Benutzeroberfläche anzuzeigen, falls PSA Benutzereingaben benötigt oder die Druckvorschau für den Benutzer angezeigt werden soll. Dieser Vertrag wird für den virtuellen Drucker wiederverwendet, um dem Benutzer die Benutzeroberfläche für Eingaben anzuzeigen oder die Vorschau anzuzeigen. Weitere Informationen finden Sie im Beispiel für die Softwareendpunkt-UI für die Änderungen an den APIs im Windows.printSupportJobUI-Vertrag.
windows.printSupportExtension-Vertragswiederverwendung für virtuelle Drucker - Windows.printSupportExtension ist ein Hintergrundvertrag, der als Teil von PSA eingeführt wurde und von PSA genutzt werden kann, wenn eine individuelle Druckticketvalidierung und andere Funktionen gewünscht ist. Virtuelle Drucker können diesen Vertrag auch wiederverwenden, wenn die App eine benutzerdefinierte Überprüfung des Drucktickets oder eine PDC-Wiederherstellung durchführen möchte.
Beispiele für die API der Druckunterstützungs-App v4
Das folgende Diagramm beschreibt den Druckworkflow für einen virtuellen Drucker.
In diesem Abschnitt wird beschrieben, wie virtuelle Drucker mithilfe von Appx-Manifesteinträgen installiert werden und wie ein virtueller Drucker in verschiedenen Szenarien aufgerufen wird.
windows.PrintSupportVirtualPrinterWorkflow-Vertrag
Damit eine App sich selbst als virtueller Drucker registrieren kann, muss sie über ein XML-Manifest verfügen, das Teil des UWP-Appx-Pakets oder MSIX-Installationsprogrammsist.
Das folgende Beispiel ist ein Appx-Manifest für einen virtuellen Drucker und die Beschreibung, worauf sich jedes Feld bezieht.
<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>
Dies ist ein Vertrag, der für die Installation der Warteschlange für virtuelle Drucker verwendet wird und auch als Hintergrundendpunkt für den installierten virtuellen Drucker fungieren kann. Ein einzelnes Appx-Manifest kann mehrere Druckwarteschlangen installieren, die derselben installierten Anwendung zugeordnet sind. Wenn ein Benutzer über die neue virtuelle Druckerwarteschlange druckt, wird die virtuelle Druckeranwendung im Hintergrund gestartet und löst Ereignisse mit der PrintWorkflowVirtualPrinterDataAvailableEventArgs-Laufzeitklasse als Event Args aus. Die Laufzeitklasse verfügt über APIs zum Lesen der PDL-Daten, zum Starten der Benutzeroberfläche für die Anwendung bei Bedarf usw.
PrintSupportVirtualPrinter – Jeder Eintrag gibt eine Softwareendpunkt-Druckwarteschlange an, die zusammen mit der Anwendung installiert werden soll.
PreferredInputFormat- – Dieses Feld gibt das bevorzugte Eingabe-PDL-Format für den virtuellen Drucker an. Windows Print System generiert dieses Format, bevor PDL-Daten für alle Druckpfade dem virtuellen Drucker zugewiesen werden. Das Feld kann nur die folgenden Werte sein: application/oxps oder application/postscript. Die Installation schlägt fehl, wenn andere Formate in diesem Feld angegeben werden. Wenn das Feld nicht angegeben ist, wird "application/oxps" als bevorzugtes Eingabe-PDL-Format für den installierten virtuellen Drucker festgelegt.
OutputFileTypes – Wenn dieses Feld im Appx-Manifest angegeben wird, erstellt das Windows-Drucksystem eine Druckerwarteschlange, die als Dateidrucker gekennzeichnet ist, und das Dialogfeld „Speichern unter” wird dem Benutzer angezeigt, wenn eine Anwendung mit dem Drucken mit dem virtuellen Drucker beginnt. Die Werte dieses Felds sollten Zieldateierweiterungen wie pdf/pwgr/ps usw. enthalten. Diese Werte werden in den Treiberdaten gespeichert und im Dialogfeld „Speichern unter” als zulässige Erweiterungen hinzugefügt. Das Windows-Drucksystem erstellt eine StorageFile-Klasse für die vom Benutzer ausgewählte Datei, die dann der virtuellen Drucker-App als Teil der Event Args-API übergeben wird. Wenn ein virtueller Drucker das Dateidruckverhalten nicht möchte (dazu gehören virtuelle Drucker, die Druckdaten in der Cloud speichern, oder die Daten an eine Anwendung wie OneNote senden), sollte dieses Feld nicht dem Manifest hinzugefügt werden.
Unterstützte Formate – Virtueller Drucker kann dieses Feld verwenden, um alle PDL-Formate anzugeben, die verarbeitet werden können. Dies wird für Passthrough-Druckanwendungen wie Microsoft Edge verwendet, um das unterstützte Format, wie PDF, zu identifizieren und einen PDF-Stream direkt an den virtuellen Drucker zu übergeben, ohne dass durch das Windows-Drucksystem Änderungen vorgenommen werden. Dieses Feld hat SupportedFormat als ein untergeordnetes Feld. SupportedFormat verfügt über das Feld Type, um den unterstützten MIME-Typ anzugeben, und das Feld MaxVersion gibt die maximale Version dieses PDL-Formats an, die der virtuelle Drucker empfangen kann. Der Wert „MaxVersion” muss im Format „MajorVersion.MinorVersion” vorliegen. Das Windows-Drucksystem schlägt bei der Druckerinstallation fehl, wenn es sich in einem anderen Format befindet. „MajorVersion” und „MinorVersion” dürfen nur Zahlen enthalten. Wenn andere Zeichen vorhanden sind, wird das Versionsfeld ungültig und ignoriert.
PdcFile- – Dieses Feld muss auf eine Ressourcendatei innerhalb des Anwendungspakets verweisen. Die Datei sollte Inhalte im XML-Format "Print Device Capabilities" enthalten, das zum Definieren von Druckerfunktionen verwendet wird und zum Definieren von benutzerdefinierten Features, Optionen oder Parametern verwendet werden soll. Dies ist ein Pflichtfeld, und die Druckerinstallation schlägt fehl, wenn der Wert nicht vorhanden ist oder der Dateiinhalt nicht im gültigen PDC-Format vorhanden ist.
PdrFile – Wenn dieses Feld angegeben wird, muss es auf eine Ressourcendatei innerhalb des Anwendungspakets verweisen. Die Datei sollte Druckerressourcen im XML-Format enthalten. Dieses Feld sollte angegeben werden, wenn die App benutzerdefinierte Druckeinstellungen lokalisieren möchte. Dieses Feld ist optional. Wenn dieses Feld nicht vorhanden ist, übernimmt das Drucksystem die Lokalisierung der Ressourcen für die Druckeinstellungen.
DisplayName – Gibt den Namen der virtuellen Druckerwarteschlange an, die installiert wird. Einschränkungen dieser Zeichenfolge entsprechen den Einschränkungen, die für einen Windows-Druckernamen gelten.
PrinterUri – Gibt einen eindeutigen URI an, der von PSA-Anwendungen zum Identifizieren des Druckers verwendet werden kann. Eine einzelne virtuelle Drucker-App kann mehrere Softwareendpunkte angeben, die dazu führen, dass mehrere Drucker installiert werden. PrinterUri-Feld kann verwendet werden, um zwischen diesen Druckern zu unterscheiden. Dies wird als eine Ausgabe von der IppPrintDevice::PrinterUri-API bereitgestellt. Wenn kein URI angegeben ist, weist Windows dem Drucker einen beliebigen eindeutigen URI zu.
Einfaches Softwareschnittstellenbeispiel für PDF- und XPS-Drucker
Dieses Beispiel zeigt eine Hintergrundaufgabe für eine Software-Endpunkt-App, die zwei Endpunkte registriert hat: „In PDF drucken” und „In XPS drucken”. Im Beispiel wird für das VirtualPrinterDataAvailable-Ereignis in der Sitzung registriert, und die Aufrufe werden gestartet. Wenn das Ereignis ausgelöst wird, enthalten die Ereignisargumente den PDL-Stream, die Zieldatei, den UI-Launcher und den PDL-Konvertierer. Die App konvertiert das PDL-Eingabeformat je nach Drucker in PDF oder XPS und schreibt das Ergebnis in den Ausgabestream der Zieldatei.
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();
}
}
}
Starten der Benutzeroberfläche aus der Hintergrundaufgabe eines Softwareendpunkts
Die Print Support App v4-API bietet die Möglichkeit, der Hintergrundaufgabe des Softwareendpunkts die Benutzeroberfläche für den Benutzer anzuzeigen, falls erforderlich. Dies verwendet die vorhandene PSA-API-Klasse PrintWorkflowUILauncher. Wenn die Hintergrundaufgabe die Funktion LaunchAndCompleteUIAsync aufruft, wird die App im UI-Kontext mit bestehendem PSA-Vertrag Windows.printSupportJobUI gestartet. Weitere Informationen finden Sie im Beispiel für die Softwareendpunkt-UI.
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));
}
Beispiel für eine Softwareendpunkt-Benutzeroberfläche
Dieses Beispiel zeigt den PSA-UI-Vertrag, der geändert wurde, um den Start der Benutzeroberfläche über die Hintergrundaufgabe „Softwareendpunkt” zu unterstützen. Die Klasse PrintWorkflowJobUISession wird geändert, sodass sie ein neues Ereignis namens VirtualPrinterUIDataAvailable enthält. Wenn die Benutzeroberfläche von der Softwareendpunkt-Hintergrundaufgabe gestartet wird, wird das neue Ereignis ausgelöst. Die Anwendung kann dem Benutzer mithilfe des PDL-Quellkontexts, das vom Ereignisargument bereitgestellt wird, eine Vorschau anzeigen.
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
}
}
}
Softwareendpunkt, der die Druckerkonfiguration aktualisiert
Softwareendpunkte möchten möglicherweise die Druckerkonfiguration ändern, wenn der Benutzer die Einstellungen ändert. Um dies zu vereinfachen, wird die Funktion RefreshPrintDeviceCapabilities in der WinRT-Klasse IppPrintDevice hinzugefügt. Bei Aufruf dieser Funktion wird das PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged-Ereignis aufgerufen, wobei die App die aktuellen Druckgerätefunktionen aktualisieren kann.
private void UpdatePrintDeviceCapabilites(string printerName)
{
IppPrintDevice printer = IppPrintDevice.FromPrinterName(printerName);
// Call RefreshPrintDeviceCapabilities results in Print Device Capabilites Changed event to be raised
printer.RefreshPrintDeviceCapabilities();
}
Standarddruckauftrag eines Benutzers abrufen und ändern
IHVs möchten möglicherweise die Standarddruckeinstellungen anzeigen und ändern, wenn eine PSA-App über das Startmenü gestartet wird. Aus diesem Grund wird die UserDefaultPrintTicket--Eigenschaft der WinRT-Klasse IppPrintDevice- hinzugefügt. Jede Anwendung kann das Standarddruckticket des Benutzers mit dieser Eigenschaft abrufen und festlegen.
// 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;
}
Vereinfachung der Arbeit mit Einzelvorgangsattributen
Es kann schwierig sein, die vollständigen Einzelvorgangsattribute zu erstellen, die zum Erstellen eines Drucker-Einzelvorgangs erforderlich sind, wenn ein IHV bestimmte Attribute entfernen möchte, bevor die erstellte Einzelvorgangsanforderung an den Drucker gesendet wird. Ein ConvertPrintTicketToJobAttributes wird der Winrt-Klasse PrintWorkflowPrintJob hinzugefügt, um die IPP-Attribute für ein Druckerticket abzurufen. Im folgenden Beispiel wird gezeigt, wie ein PSA IPP-Attribute aus dem Druckticket abrufen und das Attribut für die Mediengröße entfernen kann, welches dann als Teil des an den Drucker gesendeten PDL-Inhalts übertragen wird.
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;
}
Konfigurieren der Bildqualität von MXDC basierend auf der Seitenausgabequalität
Aktuelle veraltete V4-Drucktreiber von Drittanbietern können die Bildqualität angeben, die von MXDC basierend auf der Seitenqualität erzeugt wird. Weitere Informationen finden Sie unter V4-Treibermanifest.
Im Zuge der Einstellung veralteter V3/V4-Treiber von Drittanbietern muss diese Funktion mithilfe von PSA-APIs bereitgestellt werden. Aus diesem Grund stellt die PSA v4-API eine WinRT-Klasse zum Abrufen und Festlegen der Bildqualitätskonfiguration bereit.
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;
}
Implementierung des PrintSupportSettingUI-Vertrags in der WinAppSdk-App
Die API der Druckunterstützungs-App v4 führt eine Eigenschaft in der WinRT-Klasse PrintSupportSettingsActivatedEventArgs namens OwnerWindowId ein. Die Windows App SDK-Anwendung ist dafür verantwortlich, ihr Fenster so zu erstellen, dass es als modales Fenster dem angegebenen OwnerWindowId--Fenster zugeordnet ist.
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);
}
}
Hinweise
Beispiele in diesem Artikel basieren auf den Beispielen der PSA v1-, PSA v2-API und PSA v3-APIs mit der Annahme, dass der Entwickler mit dem PSA-API-Workflow vertraut ist.
Dieser Artikel enthält die Erweiterungen für die vorhandene öffentliche API der Druckunterstützungsanwendung, wie in der Entwurfanleitung für die Druckunterstützungs-App und im Namespace Windows.Graphics.Printing.PrintSupport beschrieben. Mit der PSA-API können Druckerhersteller UWP-Apps entwickeln, die die Druckerfahrung von Windows-Benutzern verbessern können, während sie den integrierten Microsoft IPP-Klassentreiber verwenden, ohne einen benutzerdefinierten Treiber entwickeln zu müssen.
Druckkomponenten kommunizieren mit der PSA-App über einen PSA-Brokerprozess.
Verwandte Artikel
ConvertPrintTicketToJobAttributes
Ende des Wartungsplans für Druckertreiber von Drittanbietern unter Windows
IppPrinterDevice::IsIppPrinter
PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged
PrintSupportSettingsActivatedEventArgs
RefreshPrintDeviceCapabilities
SetPrinterAttributesFromBuffer