Руководство по проектированию API поддержки печати версии 4
API поддержки печати версии 4 поддерживает архитектуру виртуальных принтеров, чтобы упростить реализацию виртуальных принтеров без устаревших сторонних драйверов. Благодаря этой архитектуре независимый поставщик программного обеспечения (ISV) может реализовать виртуальный принтер в качестве приложения, реализующего функции, которые в настоящее время поддерживаются устаревшими драйверами версии 3/V4 сторонних разработчиков. В статье описывается, как приложение может зарегистрировать себя как виртуальный принтер и как реализовать преобразование PDL и элементы пользовательского интерфейса, необходимые для реализации.
Приложение поддержки печати (PSA) — это архитектура, которая была представлена, чтобы позволить независимым поставщикам оборудования (IHV) настраивать принтеры IPP без использования устаревших драйверов сторонних разработчиков. Чтобы упростить переход на новый виртуальный принтер, все API являются частью пространства имен API поддержки печати и использует некоторые контракты PSA, применимые к архитектуре виртуального принтера.
Дополнительные сведения см. в следующих статьях:
Тема | Описание |
---|---|
руководство по проектированию приложений для поддержки печати | Предоставляет рекомендации и примеры для изготовителей оборудования принтера и IHV, которые реализуют приложение поддержки печати (PSA) для своего устройства. |
Руководство по проектированию API Приложения для Поддержки Печати версии 3 | Предоставляет рекомендации и примеры для изготовителей оборудования принтера и IHV, которые реализуют приложение поддержки печати версии 3 (PSA) для своего устройства. |
спецификация манифеста MSIX для виртуальных принтеров с поддержкой печати | Предоставляет рекомендации по манифесту MSIX и примеры для изготовителей оборудования принтера и IHV, реализующих виртуальный принтер поддержки печати. |
ассоциация приложения поддержки печати | Предоставляет рекомендации и примеры для связывания приложения поддержки печати (PSA) с принтером. |
В этой статье показано, как API PSA расширены для поддержки конечной точки программного обеспечения и нескольких других сценариев PSA, необходимых для IHV.
Терминология
Срок | Определение |
---|---|
ПСА (простатспецифический антиген) | Приложение поддержки печати. Приложение UWP, использующее API в этом документе. |
MXDC | Microsoft XPS Document Converter |
MPD | Диалоговое окно "Современная печать". Это диалоговое окно отображается пользователю при печати приложения с помощью API Windows.Graphics.Printing. |
Непрерывное профессиональное развитие | Общее диалоговое окно печати. Это диалоговое окно отображается пользователю при печати приложения с помощью API Win32. |
IPP | Протокол интернет-печати. Используется с клиентского устройства для взаимодействия с принтером для получения и задания параметров печати и отправки документа для печати. |
Связанный принтер с поддержкой печати | Физический принтер IPP, связанный с PSA. |
Принтер IPP | Принтер, поддерживающий протокол IPP. |
MSDW | Модуль записи документов Майкрософт |
Пользовательский интерфейс параметров принтера | Диалоговое окно, в котором пользователь может изменить настройки, связанные с принтером, который будет применяться во время печати. Примеры включают ориентацию, размер бумаги, цвет, печать на обеих сторонах и т. д. |
PDL | Язык описания страницы. Формат, в котором документ отправляется на принтер. |
Ассоциированный принтер PSA | Каждый PSA связан с физическим принтером IPP. |
PDC | Формат XML-документа PrintDeviceCapabilities для определения возможностей принтера. |
SoftwareAppMon | Библиотека DLL монитора портов для новой очереди виртуального принтера |
РасширениеПоддержкиПечати | Фоновая задача PSA отвечает за предоставление возможностей расширения ограничений принтера. |
Повторное использование API поддержки печати для конечной точки программного обеспечения
виртуальный принтер как IppPrintDevice - IppPrintDevice — это класс Winrt, представленный в рамках API PSA. Виртуальный принтер добавляется как устройство принтера IPP и IppPrinterDevice::IsIppPrinter возвращает значение true для только что добавленного виртуального принтера. Это делается для того, чтобы сквозная передача PDL работала безупречно как для виртуальных принтеров, так и для принтеров IPP, а также для повторного использования большей части интерфейса API PSA, который уже существует. Функции класса IppPrintDevice (GetPrinterAttributesAsBuffer, GetPrinterAttributes, SetPrinterAttributesFromBufferи SetPrinterAttributes) изменены соответственно для виртуального принтера. GetPrinterAttributesAsBuffer и GetPrinterAttributes всегда возвращают "не поддерживается" для любого переданного IPP-атрибута, а SetPrinterAttributesFromBuffer и SetPrinterAttributes всегда возвращают ошибку с указанием "доступ запрещен" для виртуальных принтеров. Это связано с тем, что виртуальные принтеры указывают только PDC в манифесте appx и не поддерживают атрибуты принтера IPP.
повторное использование контракта windows.printSupportSettingsUI для виртуального принтера - Windows.printSupportSettingsUI — это контракт пользовательского интерфейса, представленный в рамках PSA, чтобы отобразить кастомный интерфейс настройки печати для пользователя IPP принтера с помощью PSA. Примеры API приложения поддержки печати версии 4 в этой статье повторно используют тот же контракт для поддержки пользовательских настроек печати для пользовательского интерфейса виртуального принтера без каких-либо изменений.
Контракт windows.printSupportJobUI для виртуального принтера - — это контракт пользовательского интерфейса, представленный в рамках PSA, который отображает пользовательский интерфейс, когда требуется ввод от пользователя или необходимо показать пользователю предварительный просмотр печати. Этот контракт повторно используется для виртуального принтера, чтобы отобразить пользовательский интерфейс пользователю для ввода или отображения предварительной версии. Дополнительные сведения см. в примере пользовательского интерфейса для программной конечной точки, где отображены изменения, внесенные в API в модуле Windows.printSupportJobUI.
контракт windows.printSupportExtension повторное использование с виртуальными принтерами - Windows.printSupportExtension — это фоновый контракт, представленный в рамках PSA, который может использоваться системой PSA, если она хочет настроить проверку задания на печать и другие функции. Виртуальные принтеры также могут повторно использовать этот контракт, если приложению необходимо выполнить произвольную проверку печатного задания или повторное восстановление PDC.
Примеры API поддержки печати версии 4
На следующей схеме описывается рабочий процесс печати для виртуального принтера.
В этом разделе описывается, как виртуальные принтеры устанавливаются с помощью записей манифеста appx и как вызывается виртуальный принтер в различных сценариях.
виндоус. Контракт PrintSupportVirtualPrinterWorkflow
Для регистрации приложения в качестве виртуального принтера необходимо иметь XML-манифест, который является частью пакета appx UWP или установщика MSIX.
В следующем примере представлен манифест Appx для виртуального принтера и описание того, к чему относится каждое поле.
<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>
Это контракт, используемый для установки очереди виртуальных принтеров, а также может выступать в качестве фоновой конечной точки для установленного виртуального принтера. Один манифест appx может устанавливать несколько очередей печати, которые связаны с одной и той же установленной программой. Когда пользователь печатает на новой очереди виртуальных принтеров, приложение виртуального принтера запускается в фоновом режиме и вызывает события, используя класс PrintWorkflowVirtualPrinterDataAvailableEventArgs в качестве аргументов события. Класс среды выполнения имеет API для чтения данных PDL, запуска пользовательского интерфейса для приложения при необходимости и т. д.
PrintSupportVirtualPrinter . Каждая запись указывает одну очередь печати конечной точки программного обеспечения, которую необходимо установить вместе с приложением.
Предпочтительный формат ввода. Это поле указывает предпочтительный формат PDL для виртуального принтера. Система печати Windows создает этот формат, прежде чем предоставлять PDL-данные виртуальному принтеру для всех путей печати. Поле может быть только следующими значениями: application/oxps или application/postscript. Установка завершается ошибкой, если в этом поле указаны другие форматы. Если поле не указано, в качестве предпочтительного входного формата PDL для установленного виртуального принтера задается application/oxps.
OutputFileTypes. Если это поле указано в манифесте appx, система печати Windows создает очередь принтера, помеченную как принтер файла, и при запуске печати приложения на виртуальный принтер отображается диалоговое окно "Сохранить как". Значения этого поля должны содержать целевые расширения файлов, такие как pdf/pwgr/ps и т. д. Эти значения хранятся в данных драйвера и добавляются в раздел "Сохранить как диалоговое окно" в качестве разрешенных расширений. Система печати Windows создает класс StorageFile для файла, выбранного пользователем, который затем предоставляется приложению виртуального принтера как часть API аргументов событий. Если виртуальный принтер не хочет печатать файлы (это включает виртуальные принтеры, которые хранят данные печати в облаке или принтерах, которые отправляют данные в приложение, например OneNote), то это поле не должно быть добавлено в манифест.
поддерживаемые форматы . Виртуальный принтер может использовать это поле для указания всех форматов PDL, которые он может обрабатывать. Это используется для сквозной печати приложений, таких как Microsoft Edge, чтобы определить поддерживаемый формат, например PDF, и напрямую передать поток PDF на виртуальный принтер без каких-либо изменений, выполняемых системой Windows Print. Это поле имеет дочернее поле SupportedFormat. SupportedFormat имеет тип поля, чтобы указать поддерживаемый тип MIME и поле MaxVersion указывает максимальную версию этого формата PDL, который может получать виртуальный принтер. Значение MaxVersion должно быть в формате MajorVersion.MinorVersion. Система печати Windows завершает установку принтера, если она находится в любом другом формате. MajorVersion и MinorVersion могут быть только числами; если в поле версии присутствуют любые символы, оно становится недействительным и игнорируется.
PdcFile . Это поле должно указывать на файл ресурсов в пакете приложения. Файл должен содержать данные в формате XML возможностей печатного устройства, который используется для определения возможностей принтера, а также для задания любых пользовательских функций, опций или параметров. Это обязательное поле и установка принтера завершается ошибкой, если значение отсутствует или содержимое файла не находится в допустимом формате PDC.
PdrFile. Если это поле указано, оно должно указывать на файл ресурсов в пакете приложения. Файл должен содержать ресурсы устройства печати в формате XML. Это поле должно быть предоставлено, если приложение хочет локализовать настраиваемые параметры печати. Это поле является необязательным, а локализация ресурсов для параметров печати выполняется системой печати, если это поле отсутствует.
DisplayName — указывает имя установленной очереди виртуальных принтеров. Ограничения этой строки совпадают с ограничениями, которые имеются для имени принтера Windows.
PrinterUri — задает уникальный URI, который можно использовать приложениями PSA для идентификации принтера. Одно приложение виртуального принтера может указать несколько конечных точек программного обеспечения, что приводит к установке нескольких принтеров. Поле PrinterUri можно использовать для различения этих принтеров. Это выводится как выходные данные от API IppPrintDevice::PrinterUri. Если универсальный код ресурса (URI) не указан, Windows назначает произвольный уникальный универсальный код ресурса (URI) принтеру.
Пример простой конечной точки программного обеспечения для принтеров PDF и XPS
В этом примере показана фоновая задача программного приложения с конечными точками, которое зарегистрировало два типа конечных точек: печать в PDF и печать в XPS. Пример регистрирует событие VirtualPrinterDataAvailable в сеансе и вызывает start. При возникновении события Event Args содержит поток PDL, целевой файл, средство запуска пользовательского интерфейса и преобразователь PDL. Приложение преобразует входной формат PDL в PDF или XPS в зависимости от принтера и записывает результирующий контент в поток вывода целевого файла.
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();
}
}
}
Запуск пользовательского интерфейса из фоновой задачи программной конечной точки
API версии 4 приложения поддержки печати предоставляет возможность фоновой задаче, связанной с конечной точкой программного обеспечения, отобразить пользовательский интерфейс, если это необходимо. Для этого используется существующий API PSA класс PrintWorkflowUILauncher. Когда фоновая задача вызывает функцию LaunchAndCompleteUIAsync, приложение запускается в контексте пользовательского интерфейса с использованием существующего контракта PSA Windows.printSupportJobUI. Дополнительные сведения см. в примере пользовательского интерфейса конечной точки программного обеспечения .
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));
}
Пример пользовательского интерфейса конечной точки программного обеспечения
В этом примере показан контракт пользовательского интерфейса PSA, изменённый для поддержки его запуска из фоновой задачи Software Endpoint. Класс PrintWorkflowJobUISession модифицирован для включения нового события VirtualPrinterUIDataAvailable. При запуске пользовательского интерфейса из фоновой задачи программной конечной точки инициируется новое событие. Приложение может показать пользователю предварительный просмотр, используя контекст источника PDL, предоставленный аргументами события.
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
}
}
}
Конечный узел программного обеспечения для обновления конфигурации принтера
Когда пользователь изменяет параметры, конечные точки программного обеспечения могут захотеть изменить конфигурацию принтера. Чтобы упростить это, функция RefreshPrintDeviceCapabilities добавляется в класс IppPrintDevice WinRT. При вызове этой функции вызывается PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged Event, где приложение может обновить текущие возможности устройства печати.
private void UpdatePrintDeviceCapabilites(string printerName)
{
IppPrintDevice printer = IppPrintDevice.FromPrinterName(printerName);
// Call RefreshPrintDeviceCapabilities results in Print Device Capabilites Changed event to be raised
printer.RefreshPrintDeviceCapabilities();
}
Получение и изменение запроса на печать пользователя по умолчанию
Возможно, IHV потребуется показать и изменить настройки печати по умолчанию при запуске приложения PSA из меню "Пуск". По этой причине свойство UserDefaultPrintTicket добавляется в класс IppPrintDevice WinRT. Любое приложение может получить и задать запрос на печать пользователя по умолчанию с помощью этого свойства.
// 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;
}
Упрощение работы с атрибутами задания
Создать полные атрибуты задания, необходимые для создания задания на принтере, может быть сложно, если IHV может потребоваться удалить определенные атрибуты перед отправкой созданного запроса задания на принтер. ConvertPrintTicketToJobAttributes добавляется в класс Winrt PrintWorkflowPrintJob, чтобы получить атрибуты IPP для печатного билета. В следующем примере показано, как PSA может получать атрибуты IPP из билета печати и удалять атрибут размера мультимедиа, который затем отправляется в составе содержимого PDL, отправляемого на принтер.
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;
}
Настройка качества изображения MXDC на основе качества выходных данных страницы
Текущие устаревшие сторонние драйверы печати версии 4 могут указывать качество изображения, созданное MXDC на основе качества страницы. Более подробную информацию см. в манифесте драйвера версии 4 .
Переход к прекращению поддержки устаревших сторонних драйверов версий V3/V4 требует обеспечить эквивалентность для этой функции с помощью PSA APIs. По этой причине API PSA версии 4 предоставляет класс WinRT для получения и настройки конфигурации качества изображения.
private void PrintDeviceCapabilitiesChanged(PrintSupportExtensionSession sender, PrintSupportPrintDeviceCapabilitiesChangedEventArgs args)
{
//....
this.SetImageQualityForPrinter(this.printDevice, args.MxdcImageQualityConfiguration);
//....
}
private void SetImageQualityForPrinter(IppPrintDevice printDevice, PrintSupportMxdcImageQualityConfiguration mxdcImageQualityConfiguration)
{
//....
// Set image quality for large scale printer
mxdcImageQualityConfiguration.TextOutputQuality = XpsImageQuality.JpegHighCompression;
mxdcImageQualityConfiguration.DraftOutputQuality = XpsImageQuality.JpegMediumCompression;
mxdcImageQualityConfiguration.NormalOutputQuality = XpsImageQuality.JpegLowCompression;
mxdcImageQualityConfiguration.HighOutputQuality = XpsImageQuality.Png;
mxdcImageQualityConfiguration.PhotographicOutputQuality = XpsImageQuality.Png;
mxdcImageQualityConfiguration.AutomaticOutputQuality = XpsImageQuality.JpegMediumCompression;
mxdcImageQualityConfiguration.FaxOutputQuality = XpsImageQuality.JpegMediumCompression;
}
Реализация контракта PrintSupportSettingUI в Приложении WinAppSdk
API поддержки печати версии 4 вводит новое свойство в PrintSupportSettingsActivatedEventArgs классе WinRT с именем OwnerWindowId. Приложение Windows App SDK отвечает за создание окна в модальном режиме для заданного окна 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);
}
}
Замечания
Примеры в этой статье основаны на примерах API PSA версии 1, PSA версии 2 и API PSA версии 3 с предположением, что разработчик знаком с рабочим процессом API PSA.
В этой статье содержатся расширения для существующего общедоступного API приложения поддержки печати, описанного в руководстве по проектированию приложений поддержки печати и Windows.Graphics.Printing.PrintSupport пространства имен. API PSA позволяет производителям принтеров разрабатывать приложения UWP, которые могут улучшить возможности печати пользователей Windows при использовании драйвера классов Microsoft IPP в папке "Входящие" без необходимости разработки пользовательского драйвера.
Компоненты печати обмениваются данными с приложением PSA через процесс брокера PSA.
Связанные статьи
ConvertPrintTicketToJobAttributes
Завершение плана обслуживания сторонних драйверов принтеров в Windows
IppPrinterDevice::IsIppPrinter
PrintSupportExtensionSession.ИзмененыВозможностиУстройства
PrintSupportSettingsActivatedEventArgs
ОбновитьВозможностиУстройстваПечати
УстановитьАтрибутыПринтераИзБуфера
пример пользовательского интерфейса программного обеспечения для конечных точек