Guía de diseño de la API de app v4 de soporte técnico de impresión
Print Support App v4 API admite una arquitectura de impresora virtual para facilitar la implementación de impresoras virtuales sin controladores de terceros heredados. A través de esta arquitectura, un proveedor de software independiente (ISV) puede implementar una impresora virtual como una aplicación que incorpora las funcionalidades actualmente soportadas por los controladores heredados V3/V4. En el artículo se describe cómo una aplicación puede registrarse como una impresora virtual y cómo implementar elementos de interfaz de usuario y conversión pdL necesarios para la implementación.
Aplicación para compatibilidad con impresión (PSA) es la arquitectura introducida para ayudar a los IHV a agregar personalización a las impresoras IPP sin recurrir a controladores heredados de terceros. Para facilitar la transición a la nueva impresora virtual, todas las API están integradas en el espacio de nombres de la API de la aplicación de soporte de impresión y reutilizan algunos de los contratos de PSA que son aplicables a la arquitectura de la impresora virtual.
Para obtener más información, consulte los artículos siguientes:
Tema | Descripción |
---|---|
guía de diseño de aplicaciones de soporte de impresión | Proporciona instrucciones y ejemplos para los OEMs de impresoras e IHVs que implementan una aplicación de soporte de impresión (PSA) para su dispositivo. |
Guía de diseño de la API de la Aplicación de Soporte de Impresión v3 | Proporciona instrucciones y ejemplos para los OEM de impresora e IHD que implementan una aplicación de soporte de impresión v3 (PSA) para su dispositivo. |
Especificación del manifiesto MSIX para impresora virtual de soporte de impresión | Proporciona instrucciones y ejemplos de manifiestos MSIX para los OEM de impresoras e IHV que implementan una impresora virtual de soporte de impresión. |
Asociación de aplicaciones de soporte de impresión | Proporciona instrucciones y ejemplos para asociar una aplicación de soporte de impresión (PSA) con una impresora. |
En este artículo se muestra cómo se amplían las API de PSA para admitir el punto de conexión de software y algunos otros escenarios de PSA requeridos por los IHV.
Terminología
Término | Definición |
---|---|
APE | Aplicación de soporte técnico de impresión. Aplicación para UWP que usa la API de este documento. |
MXDC | Convertidor de documentos de Microsoft XPS |
MPD | Cuadro de diálogo de impresión moderno. Este cuadro de diálogo se muestra al usuario cuando una aplicación está imprimiendo mediante windows.Graphics.Printing API. |
CPD | Cuadro de diálogo de impresión común. Este cuadro de diálogo se muestra al usuario cuando la aplicación está imprimiendo mediante la API de Win32. |
IPP | Protocolo de impresión de Internet. Se usa desde un dispositivo cliente para interactuar con la impresora para recuperar y establecer preferencias de impresión y enviar el documento que se va a imprimir. |
Impresora asociada a la compatibilidad con impresión | Impresora IPP física que está vinculada a PSA. |
Impresora IPP | Impresora que admite el protocolo IPP. |
MSDW | Escritor de documentos de Microsoft |
Interfaz de usuario de preferencias de impresora | Cuadro de diálogo en el que el usuario puede cambiar las preferencias relacionadas con una impresora que se aplicarían en tiempo de impresión. Algunos ejemplos son la orientación, el tamaño del papel, el color, la impresión en ambos lados, etc. |
PDL | Idioma de descripción de página. Formato en el que se envía un documento a la impresora. |
Impresora PSA asociada | Cada PSA está asociado a una impresora IPP física. |
PDC | Formato de documento XML PrintDeviceCapabilities para definir funcionalidades de impresora. |
SoftwareAppMon | DLL del monitor de puerto para la nueva cola de impresora virtual |
PrintSupportExtension | La tarea en segundo plano de PSA es responsable de proporcionar funcionalidades de extensión de restricción de impresora. |
Reutilización de las API de compatibilidad con impresión para el punto de conexión de software
Impresora virtual como IppPrintDevice - IppPrintDevice es una clase Winrt introducida como parte de las API de PSA. La Impresora virtual se agrega como un dispositivo de impresora IPP e IppPrinterDevice::IsIppPrinter devuelve true para la impresora virtual recién agregada. Esto se hace para que el tránsito de PDL funcione sin problemas tanto para impresoras virtuales como para impresoras IPP, y para reutilizar gran parte de la superficie de la API de PSA que ya está presente. Las funciones de la clase
IppPrintDevice ( ,GetPrinterAttributesAsBuffer ,GetPrinterAttributes ySetPrinterAttributesFromBuffer ) se modifican en consecuencia para la impresora virtual. GetPrinterAttributesAsBuffer y GetPrinterAttributes siempre devuelven no compatible para cualquier atributo IPP pasado, y SetPrinterAttributesFromBuffer y SetPrinterAttributes siempre devuelven un resultado de error con el error configurado como acceso denegado para impresoras virtuales. Esto se debe a que las impresoras virtuales solo especifican PDC en el manifiesto appx y no admiten ningún atributo de impresora IPP.SetPrinterAttributes La reutilización del contrato windows.printSupportSettingsUI para la impresora virtual - Windows.printSupportSettingsUI es un contrato de interfaz de usuario introducido como parte de PSA para mostrar al usuario una interfaz de preferencias de impresión personalizadas mediante PSA para la impresora IPP. Los ejemplos de api de la aplicación de soporte técnico para impresión v4 de este artículo reutilizan el mismo contrato para admitir preferencias de impresión personalizadas para la interfaz de usuario para la impresora virtual sin cambios.
La reutilización del contrato Windows.printSupportJobUI para la impresora virtual - Windows.printSupportJobUI es un contrato de interfaz de usuario introducido como parte de PSA para mostrar la interfaz al usuario cuando PSA necesite la interacción del usuario o para mostrar la vista previa de impresión. Este contrato se reutiliza para que la impresora virtual muestre la interfaz de usuario al usuario para las entradas o para mostrar la vista previa. Para obtener más información, consulte el ejemplo de interfaz de usuario de punto de conexión de software para ver los cambios realizados en las API del contrato Windows.printSupportJobUI.
La reutilización del contrato windows.printSupportExtension para la impresora virtual - Windows.printSupportExtension es un contrato en segundo plano introducido como parte de PSA, que puede ser utilizado por la PSA si desean una validación personalizada del ticket de impresión y otras características. Las impresoras virtuales también pueden reutilizar este contrato si la aplicación quiere realizar la validación personalizada del vale de impresión o la regeneración de PDC.
Ejemplos de la API de la App de Soporte de Impresión v4
En el diagrama siguiente se describe el flujo de trabajo de impresión de una impresora virtual.
En esta sección se describe cómo se instalan las impresoras virtuales mediante entradas de manifiesto appx y cómo se invoca una impresora virtual en varios escenarios.
Contrato windows.PrintSupportVirtualPrinterWorkflow
Para que una aplicación se registre como una impresora virtual, debe tener un manifiesto XML que forma parte del paquete appx de UWP o instalador MSIX.
El ejemplo siguiente es un manifiesto Appx para una impresora virtual y la descripción de lo que hace referencia cada campo.
<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>
Se trata de un contrato que se usa para instalar la cola de impresoras virtuales y también puede actuar como punto de conexión en segundo plano para la impresora virtual instalada. Un único manifiesto appx puede instalar varias colas de impresión, que están asociadas a la misma aplicación instalada. Cuando un usuario imprime en la nueva cola de impresoras virtuales, la aplicación de impresora virtual se inicia en segundo plano y genera eventos con la clase PrintWorkflowVirtualPrinterDataAvailableEventArgs como argumentos de evento en tiempo de ejecución. La clase en tiempo de ejecución tiene API para leer los datos de PDL, iniciar la interfaz de usuario de la aplicación si es necesario, etc.
PrintSupportVirtualPrinter - Cada entrada especifica una cola de impresión de punto de conexión de software que se va a instalar junto con la aplicación.
PreferredInputFormat: este campo indica el formato PDL de entrada preferido para la impresora virtual. El sistema de impresión de Windows genera este formato antes de proporcionar datos PDL a la impresora virtual para todas las rutas de impresión. El campo solo puede ser los siguientes valores: application/oxps o application/postscript. Se produce un error en la instalación si se especifican otros formatos en este campo. Si no se especifica el campo, application/oxps se establece como el formato PDL de entrada preferido para la impresora virtual instalada.
OutputFileTypes - Cuando se especifica este campo en el manifiesto appx, el sistema de impresión de Windows crea una cola de impresión marcada como impresora de archivo, y el cuadro de diálogo "Guardar como" se muestra al usuario cuando una aplicación empieza a imprimir en la impresora virtual. Los valores de este campo deben contener extensiones de archivo de destino, como pdf/pwgr/ps, etc. Estos valores se almacenan en los datos del controlador y se agregan a Guardar como cuadro de diálogo como extensiones permitidas. El sistema de impresión de Windows crea una clase de StorageFile para el archivo seleccionado por el usuario y se proporciona a la aplicación de impresora virtual como parte de la API de argumentos de eventos. Si una impresora virtual no desea el comportamiento de impresión de archivos (esto incluye impresoras virtuales que almacenan datos de impresión en la nube o impresoras que envían datos a una aplicación como OneNote), este campo no se debe agregar al manifiesto.
formatos admitidos: la impresora virtual puede usar este campo para especificar todos los formatos PDL que puede procesar. Esto se utiliza en aplicaciones de impresión por flujo directo, como Microsoft Edge, para identificar el formato compatible, como PDF, y enviar directamente una secuencia PDF a la impresora virtual sin que el sistema de impresión de Windows realice ningún cambio entre medio. Este campo tiene SupportedFormat como campo secundario. SupportedFormat incluye el campo Type para especificar el tipo MIME admitido y el campo MaxVersion que especifica la versión máxima de ese formato PDL que puede recibir la impresora virtual. El valor MaxVersion debe tener el formato MajorVersion.MinorVersion. El sistema de impresión de Windows produce un error en la instalación de la impresora si está en cualquier otro formato. MajorVersion y MinorVersion solo pueden ser números; si hay caracteres presentes, el campo de versión queda invalidado y se omite.
PdcFile: este campo debe apuntar a un archivo de recursos dentro del paquete de aplicación. El archivo debe contener contenido en formato xml Print Device Capabilities, que se usa para definir las funcionalidades de impresora y debe usarse para definir las características, opciones o parámetros personalizados. Se trata de un campo obligatorio y se produce un error en la instalación de la impresora si el valor no está presente o si el contenido del archivo no está en formato PDC válido.
pdrFile: si se proporciona este campo debe apuntar a un archivo de recursos dentro del paquete de aplicación. El archivo debe contener recursos de dispositivo de impresión en formato xml. Este campo debe proporcionarse si la aplicación quiere localizar preferencias de impresión personalizadas. Este campo es opcional y el sistema de impresión realiza la localización de recursos para las preferencias de impresión si este campo no está presente.
DisplayName - Especifica el nombre de la cola de impresoras virtuales que está instalada. Las restricciones de esta cadena son las mismas que tiene para un nombre de impresora de Windows.
PrinterUri: especifica un URI único que las aplicaciones PSA pueden usar para identificar la impresora. Una sola aplicación de impresora virtual puede especificar varios puntos de conexión de software, lo que da como resultado la instalación de varias impresoras. El campo PrinterUri se puede usar para diferenciar entre estas impresoras. Esto se proporciona como salida de IppPrintDevice::PrinterUri API. Si no se especifica el URI, Windows asigna un URI único arbitrario a la impresora.
Ejemplo de punto de conexión de software simple para impresoras PDF y XPS
En este ejemplo se muestra una tarea en segundo plano de una aplicación de punto de conexión de software que ha registrado dos puntos de conexión: Imprimir en PDF e Imprimir en XPS. El ejemplo se registra en la sesión para el evento VirtualPrinterDataAvailable y llama a iniciar. Cuando se genera el evento, Event Args contiene secuencia PDL, archivo de destino, iniciador de interfaz de usuario y convertidor PDL. La aplicación convierte el formato PDL de entrada en PDF o XPS en función de la impresora y escribe el contenido resultante en el flujo de salida del archivo de destino.
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();
}
}
}
Inicio de la interfaz de usuario desde una tarea en segundo plano de punto de conexión de software
La API v4 de aplicación para compatibilidad con impresión proporciona funcionalidad para que la tarea en segundo plano del punto final de software muestre su interfaz si es necesario. Usa la API de PSA existente PrintWorkflowUILauncher Class. Cuando la tarea en segundo plano llama a la función LaunchAndCompleteUIAsync, la aplicación se inicia en el contexto de la interfaz de usuario mediante el contrato de PSA existente Windows.printSupportJobUI. Para obtener más información, consulte el ejemplo de la interfaz de usuario del extremo de software.
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));
}
Ejemplo de interfaz de usuario de punto de conexión de software
En este ejemplo se muestra el contrato de la interfaz de usuario de PSA modificado para admitir el inicio de la interfaz de usuario desde la tarea en segundo plano del punto de conexión de software. La clase PrintWorkflowJobUISession se ha modificado para tener un nuevo evento VirtualPrinterUIDataAvailable. Cuando se inicia la interfaz de usuario desde la tarea en segundo plano del punto de conexión de software, se invoca el nuevo evento. La aplicación puede mostrar una vista previa al usuario mediante el contexto de origen de PDL proporcionado por 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
}
}
}
Punto de conexión de software que actualiza la configuración de la impresora
Es posible que los puntos de conexión de software quieran cambiar la configuración de la impresora cuando el usuario cambie la configuración. Para facilitar esto, se agrega la función
private void UpdatePrintDeviceCapabilites(string printerName)
{
IppPrintDevice printer = IppPrintDevice.FromPrinterName(printerName);
// Call RefreshPrintDeviceCapabilities results in Print Device Capabilites Changed event to be raised
printer.RefreshPrintDeviceCapabilities();
}
Obtención y cambio del ticket de impresión predeterminado del usuario
Es posible que los IHVs quieran mostrar y modificar las preferencias de impresión predeterminadas cuando se inicia una aplicación PSA desde el menú Inicio. Por este motivo, la propiedad UserDefaultPrintTicket se agrega a la clase IppPrintDevice WinRT. Cualquier aplicación puede obtener y establecer el ticket de impresión predeterminado del usuario con esta propiedad.
// 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;
}
Facilitar el trabajo con los atributos del trabajo
Puede ser difícil crear los atributos de trabajo completos necesarios para crear un trabajo en la impresora en los casos en los que un IHV quiera quitar determinados atributos antes de enviar la solicitud de trabajo creada a la impresora. Se agrega ConvertPrintTicketToJobAttributes a la clase Winrt PrintWorkflowPrintJob para obtener los atributos IPP de un ticket de impresora. En el ejemplo siguiente se muestra cómo una PSA puede obtener atributos IPP del atributo de ticket de impresión y de eliminación de tamaño multimedia, que luego se envía como parte del contenido PDL enviado a la impresora.
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;
}
Configuración de la calidad de la imagen de MXDC en función de la calidad de salida de la página
Los controladores de impresión V4 heredados actuales pueden especificar la calidad de imagen producida por MXDC en función de la calidad de la página. Para obtener más información, consulte Manifiesto de controlador V4.
Al avanzar hacia el desuso de los controladores V3/V4 heredados de terceros, es necesario proporcionar compatibilidad para esta funcionalidad mediante las API de PSA. Por este motivo, la API psa v4 proporciona una clase WinRT para obtener y establecer la configuración de calidad de la imagen.
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;
}
Implementación del contrato PrintSupportSettingUI en La aplicación WinAppSdk
La API v4 de aplicación para compatibilidad con impresión presenta una propiedad en la clase Winrt PrintSupportSettingsActivatedEventArgs denominada OwnerWindowId. La aplicación del SDK de la aplicación de Windows es responsable de crear su ventana como modal para la ventana especificada de 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);
}
}
Observaciones
Los ejemplos de este artículo se basan en los ejemplos de la API PSA v1, PSA v2 y API de PSA v3 con la suposición de que el desarrollador está familiarizado con el flujo de trabajo de la API de PSA.
Este artículo contiene las extensiones para la API pública existente de la aplicación de soporte técnico de impresión descrita en la guía de diseño de la aplicación de soporte de impresión y el espacio de nombres Windows.Graphics.Printing.PrintSupport. La API de PSA permite a los fabricantes de impresoras desarrollar aplicaciones para UWP que pueden mejorar la experiencia de impresión de los usuarios de Windows mientras se usa el controlador de clase IPP de Microsoft integrado, sin necesidad de desarrollar un controlador personalizado.
Los componentes de impresión se comunican con la aplicación PSA a través de un proceso intermediario de PSA.
Artículos relacionados
ConvertPrintTicketToJobAttributes
Fin del plan de servicio para controladores de impresora de terceros en Windows
IppPrinterDevice::IsIppPrinter
PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged
PrintSupportSettingsActivatedEventArgs
RefreshPrintDeviceCapabilities
EstablecerAtributosDeImpresoraDesdeBuffer