Guide de conception de l’API Application de support d’impression v4
L’API Print Support App v4 prend en charge une architecture d’imprimante virtuelle pour faciliter l’implémentation des imprimantes virtuelles sans pilotes tiers hérités. Grâce à cette architecture, un éditeur de logiciels indépendant (ISV) est en mesure d’implémenter une imprimante virtuelle en tant qu’application implémentant les fonctionnalités actuellement prises en charge par les pilotes V3/V4 tiers hérités. L’article décrit comment une application peut s’inscrire en tant qu’imprimante virtuelle et comment implémenter des éléments de conversion et d’interface utilisateur PDL requis pour l’implémentation.
L’application de support d’impression (PSA) est l’architecture qui a été introduite pour aider les IHV à ajouter une personnalisation aux imprimantes IPP sans utiliser de pilotes tiers hérités. Pour faciliter la transition vers la nouvelle imprimante virtuelle, toutes les API font partie de l’espace de noms de l’API Print Support App* et réutilise certains contrats PSA applicables à l’architecture d’imprimante virtuelle.
Pour plus d’informations, consultez les articles suivants :
Sujet | Description |
---|---|
Guide de conception de l'application de support pour l'impression | Fournit des conseils et des exemples pour les oem d’imprimante et les IHD qui implémentent une application de support d’impression (PSA) pour leur appareil. |
Guide de conception de l'API de l'application Print Support v3 | Fournit des conseils et des exemples pour les oem d’imprimante et les IHD qui implémentent une application de support d’impression v3 (PSA) pour leur appareil. |
Spécification du manifeste MSIX pour l’imprimante virtuelle de prise en charge de l’impression | Donne des conseils et des exemples de manifeste MSIX pour les fabricants d’imprimantes et les fournisseurs de matériel qui implémentent une imprimante virtuelle avec support d’impression. |
Association d’applications de support d’impression | Fournit des conseils et des exemples pour associer une application de support d’impression (PSA) à une imprimante. |
Cet article montre comment les API PSA sont étendues pour prendre en charge le point d'accès logiciel ainsi que quelques autres scénarios PSA requis par les IHVs.
Terminologie
Terme | Définition |
---|---|
Antigène prostatique spécifique (PSA) | Application de prise en charge d’impression. Application UWP qui utilise l’API dans ce document. |
MXDC | Convertisseur de documents Microsoft XPS |
MPD | Boîte de dialogue d’impression moderne. Cette boîte de dialogue s’affiche à l’utilisateur lorsqu’une application imprime à l’aide de l’API Windows.Graphics.Printing. |
CPD | Boîte de dialogue d’impression commun. Cette boîte de dialogue s’affiche à l’utilisateur lorsque l’application imprime à l’aide de l’API Win32. |
IPP | Protocole d’impression Internet. Utilisé à partir d’un appareil client pour interagir avec l’imprimante pour récupérer et définir les préférences d’impression et envoyer le document à imprimer. |
Imprimante associée au support d’impression. | Imprimante IPP physique liée à PSA. |
Imprimante IPP | Imprimante qui prend en charge le protocole IPP. |
MSDW | Enregistreur de documents Microsoft |
Interface utilisateur préférences de l’imprimante | Boîte de dialogue où l’utilisateur peut modifier les préférences liées à une imprimante qui serait appliquée au moment de l’impression. Les exemples incluent l’orientation, la taille du papier, la couleur, l’impression sur les deux côtés, et ainsi de suite. |
PDL | Langue de description de la page. Format dans lequel un document est envoyé à l’imprimante. |
Imprimante PSA associée | Chaque PSA est associé à une imprimante IPP physique. |
PDC | Format de document XML PrintDeviceCapabilities pour définir des fonctionnalités d’imprimante. |
SoftwareAppMon | DLL du moniteur de port pour la nouvelle file d’attente d’imprimante virtuelle |
PrintSupportExtension | La tâche en arrière-plan PSA est responsable de fournir les capacités d’extension des contraintes d’imprimante. |
Réutilisation des API Print Support pour Software Endpoint
Imprimante virtuelle en tant que IppPrintDevice - IppPrintDevice est une classe Winrt introduite dans le cadre des API PSA. L’imprimante virtuelle est ajoutée en tant qu’appareil d’imprimante IPP et IppPrinterDevice::IsIppPrinter renvoie True pour la nouvelle imprimante virtuelle ajoutée. Cela permet au passage direct du PDL de fonctionner de manière transparente tant pour les imprimantes virtuelles que pour les imprimantes IPP, et de réutiliser une grande partie de la surface des API PSA déjà présente. Les fonctions de classe IppPrintDevice (GetPrinterAttributesAsBuffer, GetPrinterAttributes, SetPrinterAttributesFromBufferet SetPrinterAttributes) sont modifiées en conséquence pour l’imprimante virtuelle. GetPrinterAttributesAsBuffer et GetPrinterAttributes renvoient toujours "non pris en charge" pour tout attribut IPP transmis, et SetPrinterAttributesFromBuffer et SetPrinterAttributes renvoient toujours un résultat d'erreur avec l'erreur définie sur "accès refusé" pour les imprimantes virtuelles. Cela est dû au fait que les imprimantes virtuelles spécifient uniquement le PDC dans le manifeste appx et ne prennent pas en charge les attributs d'imprimante IPP.
windows.printSupportSettingsUI contract reuse for Virtual Printer - Windows.printSupportSettingsUI est un contrat d’interface utilisateur introduit dans le cadre de PSA pour afficher à l’utilisateur l’interface personnalisée des préférences d’impression pour l’imprimante IPP utilisant PSA. Les exemples d’API Application de support d’impression v4 de cet article réutilisent le même contrat pour prendre en charge les préférences d’impression personnalisées pour l’interface utilisateur pour l’imprimante virtuelle sans aucune modification.
windows.printSupportJobUI contract reuse for Virtual Printer - Windows.printSupportJobUI est un contrat d’interface utilisateur introduit dans le cadre de PSA pour afficher une interface à l’utilisateur lorsqu’une saisie est requise ou pour présenter un aperçu avant impression. Ce contrat est réutilisé pour que l’imprimante virtuelle affiche l’interface utilisateur à l’utilisateur pour les entrées ou pour afficher l’aperçu. Pour plus d’informations, consultez le Software Endpoint UI sample concernant les modifications apportées aux API dans le contrat Windows.printSupportJobUI.
windows.printSupportExtension contract reuse for Virtual Printer - Windows.printSupportExtension est un contrat en arrière-plan introduit dans le cadre de PSA, pouvant être utilisé par PSA pour une validation personnalisée des tickets d’impression et d’autres fonctionnalités. Les imprimantes virtuelles peuvent également réutiliser ce contrat si l’application souhaite effectuer une validation personnalisée du ticket d’impression ou une régénération du PDC.
Exemples d’API Print Support App v4
Le diagramme suivant décrit le flux de travail d’impression d’une imprimante virtuelle.
Cette section décrit comment les imprimantes virtuelles sont installées à l’aide d’entrées de manifeste appx et comment une imprimante virtuelle est appelée dans différents scénarios.
Contrat windows.PrintSupportVirtualPrinterWorkflow
Pour qu’une application s’inscrive en tant qu’imprimante virtuelle, elle doit avoir un manifeste XML qui fait partie du package appx UWP ou programme d’installation MSIX.
L’exemple suivant est un manifeste Appx pour une imprimante virtuelle et la description de ce à quoi chaque champ fait référence.
<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>
Il s’agit d’un contrat utilisé pour installer la file d’attente des imprimantes virtuelles et peut également servir de point de terminaison en arrière-plan pour l’imprimante virtuelle installée. Un manifeste appx unique peut installer plusieurs files d’attente d’impression, qui est associée à la même application installée. Lorsqu’un utilisateur imprime sur la nouvelle file d’attente d’imprimantes virtuelles, l’application Imprimante virtuelle est lancée en arrière-plan et déclenche des événements avec printWorkflowVirtualPrinterDataAvailableEventArgs comme classe runtime Event Args. La classe runtime dispose d’API pour lire les données PDL, lancer l’interface utilisateur de l’application si nécessaire, et ainsi de suite.
PrintSupportVirtualPrinter : chaque entrée spécifie une file d’attente d’impression de Software Endpoint à installer avec l’application.
PreferredInputFormat : ce champ indique le format PDL d’entrée préféré pour l’imprimante virtuelle. Le système d’impression Windows génère ce format avant d’accorder des données PDL à l’imprimante virtuelle pour tous les chemins d’impression. Le champ ne peut être que les valeurs suivantes : application/oxps ou application/postscript. L’installation échoue si d’autres formats sont spécifiés dans ce champ. Si le champ n’est pas spécifié, application/oxps est défini comme format PDL d’entrée préféré pour l’imprimante virtuelle installée.
OutputFileTypes : lorsque ce champ est spécifié dans le manifeste appx, le système d’impression Windows crée une file d’attente d’imprimante marquée comme imprimante de fichiers, et la boîte de dialogue Enregistrer sous s’affiche à l’utilisateur lorsqu’une application commence à imprimer sur l’imprimante virtuelle. Les valeurs de ce champ doivent contenir des extensions de fichier cible telles que pdf/pwgr/ps, etc. Ces valeurs sont stockées dans les données du pilote et sont ajoutées à Enregistrer sous la boîte de dialogue en tant qu’extensions autorisées. Le système d’impression Windows crée une classe StorageFile pour le fichier sélectionné par l’utilisateur et est donnée à l’application Imprimante virtuelle dans le cadre de l’API Event Args. Si une imprimante virtuelle ne souhaite pas de comportement d’impression de fichier (cela inclut les imprimantes virtuelles qui stockent les données d’impression dans le cloud ou les imprimantes qui envoient des données à une application comme OneNote), ce champ ne doit pas être ajouté au manifeste.
formats pris en charge : l’imprimante virtuelle peut utiliser ce champ pour spécifier tous les formats PDL qu’il peut traiter. Cela est utilisé pour des applications d'impression directe, telles que Microsoft Edge, pour identifier des formats pris en charge comme le PDF et transmettre directement un flux PDF à l'imprimante virtuelle, sans que le système d'impression Windows n'effectue de modifications entre-temps. Ce champ comporte SupportedFormat en tant que champ enfant. SupportedFormat a le type de champ pour spécifier le type MIME pris en charge et le champ MaxVersion spécifie la version maximale de ce format PDL que l’imprimante virtuelle peut recevoir. La valeur MaxVersion doit être au format MajorVersion.MinorVersion. Le système d’impression Windows échoue à l’installation de l’imprimante s’il est dans un autre format. MajorVersion et MinorVersion ne peuvent être que des nombres. Si des caractères sont présents, le champ de version est invalidé et ignoré.
PdcFile : ce champ doit pointer vers un fichier de ressources dans le package d’application. Le fichier doit contenir du contenu au format xml des fonctionnalités d’impression, qui est utilisé pour définir les fonctionnalités d’imprimante et doit être utilisé pour définir les fonctionnalités personnalisées, les options ou les paramètres. Il s’agit d’un champ obligatoire et l’installation de l’imprimante échoue si la valeur n’est pas présente ou si le contenu du fichier n’est pas au format PDC valide.
pdrFile : si ce champ est fourni, il doit pointer vers un fichier de ressources dans le package d’application. Le fichier doit contenir des ressources d’appareil d’impression dans un format xml. Ce champ doit être fourni si l’application souhaite localiser les préférences d’impression personnalisées. Ce champ est facultatif et la localisation des ressources pour les préférences d’impression est effectuée par le système d’impression si ce champ n’est pas présent.
DisplayName : spécifie le nom de la file d’attente de l’imprimante virtuelle installée. Restrictions de cette chaîne identiques à celles dont vous disposez pour un nom d’imprimante Windows.
PrinterUri : spécifie un URI unique qui peut être utilisé par les applications PSA pour identifier l’imprimante. Une application d’imprimante virtuelle unique peut spécifier plusieurs points de terminaison logiciels qui entraînent l’installation de plusieurs imprimantes. Le champ PrinterUri peut être utilisé pour différencier ces imprimantes. Cela est donné comme sortie de l'API IppPrintDevice::PrinterUri. Si l’URI n’est pas spécifié, Windows affecte un URI unique arbitraire à l’imprimante.
Exemple de point de terminaison logiciel simple pour les imprimantes PDF et XPS
Cet exemple présente une tâche en arrière-plan d’une application Software Endpoint qui a enregistré deux points de terminaison : Imprimer en PDF et Imprimer en XPS. L’exemple s’inscrit à l’événement VirtualPrinterDataAvailable dans la session et appelle Start. Lorsque l’événement est déclenché, les arguments d’événement contiennent le flux PDL, le fichier cible, le lanceur d’interface utilisateur et le convertisseur PDL. L’application convertit le format PDL d’entrée au format PDF ou XPS en fonction de l’imprimante et écrit le contenu résultant dans le flux de sortie de fichier cible.
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();
}
}
}
Lancement de l’interface utilisateur depuis une tâche en arrière-plan Software Endpoint
L’API Print Support App v4 offre la possibilité à une tâche en arrière-plan Software Endpoint d’afficher une interface utilisateur à l’utilisateur si nécessaire. Cela utilise l’API PSA existante PrintWorkflowUILauncher Class. Lorsque la tâche en arrière-plan appelle la fonction LaunchAndCompleteUIAsync, l’application est lancée dans un contexte d’interface utilisateur en utilisant le contrat PSA existant Windows.printSupportJobUI. Pour plus d’informations, consultez le Software Endpoint UI sample.
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));
}
Software Endpoint UI sample
Cet exemple illustre le contrat UI PSA modifié pour supporter le lancement d’une interface utilisateur depuis une tâche en arrière-plan Software Endpoint. La classe PrintWorkflowJobUISession est modifiée pour inclure un nouvel événement VirtualPrinterUIDataAvailable. Lorsque l’interface utilisateur est lancée depuis une tâche en arrière-plan Software Endpoint, le nouvel événement est déclenché. L’application peut afficher un aperçu pour l’utilisateur à l’aide du contexte source PDL fourni par les arguments d’événement.
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
}
}
}
Point de terminaison logiciel mettant à jour la configuration de l’imprimante
Les points de terminaison logiciels peuvent vouloir modifier la configuration de l’imprimante lorsque l’utilisateur modifie les paramètres. Pour faciliter cela, la fonction RefreshPrintDeviceCapabilities est ajoutée dans la classe IppPrintDevice WinRT. Lorsque cette fonction est appelée, elle appelle l’événement PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged Event, où l’application peut mettre à jour les fonctionnalités actuelles de l’appareil d’impression.
private void UpdatePrintDeviceCapabilites(string printerName)
{
IppPrintDevice printer = IppPrintDevice.FromPrinterName(printerName);
// Call RefreshPrintDeviceCapabilities results in Print Device Capabilites Changed event to be raised
printer.RefreshPrintDeviceCapabilities();
}
Obtenir et modifier le ticket d'imprimante utilisateur par défaut
Les IHV peuvent souhaiter afficher et modifier les préférences d’impression par défaut lorsqu’une application PSA est lancée depuis le menu Démarrer. Pour cette raison, la propriété UserDefaultPrintTicket est ajoutée à la classe IppPrintDevice WinRT. Toute application peut obtenir et définir le ticket d’impression par défaut de l’utilisateur avec cette propriété.
// 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;
}
Faciliter la gestion des attributs de travaux
Il peut être difficile de créer les attributs de travail complets requis pour créer un travail sur l’imprimante dans les cas où un IHV peut vouloir supprimer certains attributs avant d’envoyer la demande de travail créée à l’imprimante. Un ConvertPrintTicketToJobAttributes a été ajouté à la classe Winrt PrintWorkflowPrintJob pour obtenir les attributs IPP d’un ticket d’impression. L’exemple suivant montre comment un PSA peut extraire les attributs IPP du ticket d’impression et supprimer l’attribut media-size, qui est ensuite envoyé dans le contenu PDL transmis à l’imprimante.
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;
}
Configuration de la qualité d’image de MXDC en fonction de la qualité de sortie de page
Les pilotes d’impression V4 tiers existants peuvent spécifier la qualité d’image produite par MXDC en fonction de la qualité de la page. Pour plus d’informations, consultez V4 Driver Manifest.
Avant d'abandonner progressivement les anciens pilotes V3/V4 de fournisseurs tiers, il est nécessaire de garantir une parité pour cette fonctionnalité à l’aide des API PSA. Pour cette raison, l’API PSA v4 fournit une classe WinRT pour obtenir et définir la configuration de la qualité de l’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;
}
Implémentation du contrat PrintSupportSettingUI dans App WinAppSdk
L’API Print Support App v4 introduit une propriété dans PrintSupportSettingsActivatedEventArgs classe Winrt appelée OwnerWindowId. L’application du Kit de développement logiciel (SDK) d’application Windows est chargée de créer sa fenêtre en tant que modale pour la fenêtre OwnerWindowId donnée.
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);
}
}
Remarques
Les exemples de cet article sont basés sur les exemples de l’API PSA v1, PSA v2 et PSA v3 avec l’hypothèse que le développeur est familiarisé avec le flux de travail de l’API PSA.
Cet article contient les extensions de l’API publique existante de l’application de support d’impression décrite dans le guide de conception de l’application de support d’impression et dans l’espace de noms Windows.Graphics.Printing.PrintSupport. L’API PSA permet aux fabricants d’imprimantes de développer des applications UWP qui peuvent améliorer l’expérience d’impression des utilisateurs Windows lors de l’utilisation du pilote de classe IPP Microsoft, sans avoir besoin de développer un pilote personnalisé.
Les composants d’impression communiquent avec l’application PSA via un processus de courtier PSA.
Articles connexes
ConvertPrintTicketToJobAttributes
plan de fin de maintenance pour les pilotes d’imprimante tiers sur Windows
IppPrinterDevice::IsIppPrinter
PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged
PrintSupportSettingsActivatedEventArgs
actualiserLesCapacitésDuPériphériqueD'impression