列印支援應用程式 v4 API 設計指南
印表支援應用程式 v4 API 支援虛擬印表機架構,以協助實作沒有舊版第三方驅動程式的虛擬印表機。 透過此架構,獨立軟體廠商 (ISV) 能夠實作虛擬印表機作為應用程式,以實作舊版第三方 V3/V4 驅動程式目前支援的功能。 本文說明應用程式如何自行註冊為虛擬印表機,以及如何實作實作所需的 PDL 轉換和 UI 元素。
列印支援應用程式 (PSA) 是引進的架構,可協助 IHV 在不使用舊版第三方驅動程序的情況下,將自定義新增至 IPP 印表機。 為了方便轉換到新的虛擬印表機,所有 API 都是列印支援應用程式* API 命名空間的一部分,並重複使用一些適用於虛擬印表機架構的PSA合約。
如需詳細資訊,請參閱下列文章:
主題 | 描述 |
---|---|
列印支援應用程式設計指南 | 為正在針對裝置開發印表支援應用程式(PSA)的印表機 OEM 和獨立硬體供應商(IHV)提供指引和範例。 |
列印支援應用程式 v3 API 設計指南 | 提供指引和範例給印表機 OEM 和 IHV,以便為他們的裝置實作 v3 列印支援應用程式(PSA)。 |
支援列印的虛擬印表機的 MSIX 配置規範 | 針對實現印表支援虛擬印表機的印表機 OEM 和獨立硬體廠商,提供 MSIX 指令清單指引和範例。 |
列印支援應用程式關聯 | 提供將列印支援應用程式 (PSA) 與印表機產生關聯的指引和範例。 |
本文說明如何擴充PSA APIs以支援軟體端點,以及獨立硬體供應商所需的一些其他PSA案例。
術語
術語 | 定義 |
---|---|
PSA | 列印支援應用程式。 本檔中使用 API 的 UWP 應用程式。 |
MXDC | Microsoft XPS 檔案轉換器 |
MPD | 新式列印對話框。 當應用程式使用 Windows.Graphics.Printing API 列印時,會顯示此對話方塊給使用者。 |
持續專業發展 (CPD) | 一般列印對話框。 當應用程式使用 Win32 API 列印時,會顯示此對話框給使用者。 |
IPP | 因特網列印通訊協定。 從用戶端裝置用來與印表機互動,以擷取和設定印印喜好設定,並傳送要列印的檔。 |
支援列印的相關印表機 | 連結到PSA的實體 IPP 印表機。 |
IPP 印表機 | 支援 IPP 通訊協定的印表機。 |
MSDW | Microsoft文件寫入器 |
印表機偏好設定使用者介面 | 用戶可以在列印時變更適用於印表機的相關偏好設定的對話框。 範例包括方向、紙張大小、色彩、兩側的列印等等。 |
PDL | 頁面描述語言。 檔傳送至印表機的格式。 |
相關聯的PSA印表機 | 每個PSA都會與實體 IPP 印表機相關聯。 |
PDC | PrintDeviceCapabilities XML 檔格式,用於定義印表機功能。 |
SoftwareAppMon | 新虛擬印表機佇列的埠監視 DLL |
PrintSupportExtension | PSA 背景任務負責提供印表機限制擴充功能。 |
列印軟體端點的支援 API 重複使用
Virtual Printer as IppPrintDevice - IppPrintDevice 是作為PSA API 一部分導入的 Winrt 類別。 虛擬印表機作為 IPP 印表機裝置新增,IppPrinterDevice::IsIppPrinter 將針對新增的虛擬印表機返回 true。 這樣做可讓 PDL 傳遞順暢地適用於虛擬印表機和 IPP 印表機,並重複使用已經存在的大部分PSA API 介面。 IppPrintDevice 類別函式(GetPrinterAttributesAsBuffer、GetPrinterAttributes、SetPrinterAttributesFromBuffer和 SetPrinterAttributes)會隨著虛擬印表機而變更。 GetPrinterAttributesAsBuffer 和 GetPrinterAttributes 對於任何傳入的 IPP 屬性一律返回不支援,而 SetPrinterAttributesFromBuffer 和 SetPrinterAttributes 則對於虛擬列印機一律返回錯誤結果,且錯誤設置為拒絕存取。 這是因為虛擬印表機只會在 appx 指令清單中指定 PDC,且不支援任何 IPP 印表機屬性。
windows.printSupportSettingsUI 合約在虛擬印表機上的重複使用 - Windows.printSupportSettingsUI 是作為 PSA 的一部分引進的 UI 合約,用於通過 PSA 顯示 IPP 印表機用戶的自定義列印偏好設定 UI。 本文中的列印支援應用程式 v4 API 範例會重複使用相同的合約,以支援虛擬印表機 UI 的自定義列印喜好設定,而不需要進行任何變更。
windows.printSupportJobUI 合約重複用於虛擬印表機 - Windows.printSupportJobUI 是 PSA 所引入的 UI 合約的一部分,適用於 PSA 希望獲取使用者輸入或向使用者顯示列印預覽的情況。 這份合約被重複使用於虛擬列印機,以便向用戶顯示介面進行輸入或顯示預覽。 如需詳細資訊,請參閱 軟體端點 UI 範例,以瞭解 Windows.printSupportJobUI 合約中對 API 所做的變更。
Windows.printSupportExtension 合約重複使用於虛擬印表機 - 。Windows.printSupportExtension 是一種背景合約,作為 PSA 的一部分引入,以供 PSA 使用,從而進行自定義打印票證驗證和其他功能。 如果應用程式想要對印表票證或 PDC 重新產生進行自訂驗證,虛擬印表機也可以重複使用此合約。
列印支援應用程式 v4 API 範例
下圖描述虛擬印表機的印表工作流程。
本節說明如何使用 appx 指令清單專案安裝虛擬印表機,以及如何在各種案例中叫用虛擬印表機。
Windows PrintSupportVirtualPrinterWorkflow 合約
若要讓應用程式將本身註冊為虛擬印表機,它必須有 XML 指令清單,這是 UWP appx 套件的一部分,或 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 資料、視需要啟動應用程式的 UI 等等。
PrintSupportVirtualPrinter - 每個項目都會指定要與應用程式一起安裝的一個軟體端點列印佇列。
PreferredInputFormat - 此欄位表示虛擬印表機的慣用輸入 PDL 格式。 Windows 列印系統會在將所有列印路徑的 PDL 資料提供給虛擬印表機之前,先產生此格式。 欄位只能是下列值:application/oxps 或 application/postscript。 如果在此欄位中指定其他格式,則安裝會失敗。 如果未指定欄位,應用程式/oxps 會設定為已安裝虛擬印表機的慣用輸入 PDL 格式。
OutputFileTypes - 當此欄位在 appx 指令清單中指定時,Windows 印表系統會建立標示為檔案列印機的印表機佇列,並在應用程式開始列印至虛擬印表機時向用戶顯示 [另存新檔] 對話框。 此欄位的值應該包含目標擴展名,例如 pdf/pwgr/ps 等。這些值會儲存在驅動程序數據中,並新增至 [另存新檔] 對話框作為允許的延伸模組。 Windows 列印系統會為使用者選取的檔案建立 StorageFile 類別,並提供給虛擬印表機應用程式作為事件 Args API 的一部分。 如果虛擬印表機不想要檔案列印行為(這包括將列印數據儲存至雲端的虛擬印表機,或將數據傳送至 OneNote 之類的應用程式的印表機),則不應該將此字段新增至指令清單。
支援的格式 - 虛擬印表機可以使用此欄位來指定它可以處理的所有 PDL 格式。 這用於傳遞列印應用程式,例如 Microsoft Edge,以識別支援的格式,像是 PDF,並直接將 PDF 數據流傳遞至虛擬印表機,而不會經過 Windows 印表系統的任何變更。 此欄位具有 SupportedFormat 做為子欄位。 SupportedFormat 具有欄位 Type 可指定支援的 MIME 類型,而欄位 MaxVersion 會指定虛擬印表機可接收之 PDL 格式的最大值版本。 MaxVersion 值的格式必須是 MajorVersion.MinorVersion。 如果列印系統是其他任何格式,Windows 列印系統將無法安裝印表機。 只有當 MajorVersion 和 MinorVersion 只有數字時,版本欄位才有效;如果出現任何字元,版本欄位將會無效並被忽略。
PdcFile - 此字位必須指向應用程式套件內的資源檔。 檔案應包含印表裝置功能 xml 格式的內容,該格式是用來定義印表機功能,而且應該用來定義任何自定義功能、選項或參數。 這是強制欄位,如果值不存在,或檔案內容不是有效的 PDC 格式,則印表機安裝會失敗。
PdrFile - 如果提供此字位必須指向應用程式套件內的資源檔。 檔案應包含 XML 格式的列印裝置資源。 如果應用程式想要當地語系化自定義列印喜好設定,則應該提供此欄位。 此欄位是選擇性的,如果此欄位不存在,列印系統就會完成列印喜好設定的資源當地語系化。
DisplayName - 指定已安裝的虛擬印表機佇列名稱。 此字串的限制與 Windows 印表機名稱的限制相同。
PrinterUri - 指定由PSA應用程式用來識別印表機的唯一 URI。 單一虛擬印表機應用程式可以指定多個軟體端點,這會導致安裝多個印表機。 PrinterUri 欄位可用來區分這些印表機。 這是從 IppPrintDevice::PrinterUri API 所產生的輸出。 如果未指定 URI,Windows 會將任意唯一 URI 指派給印表機。
PDF 和 XPS 印表機的簡單軟體端點範例
此範例顯示已註冊兩個端點之軟體端點應用程式的背景工作:列印至 PDF 和列印至 XPS。 此範例會在會話中註冊 VirtualPrinterDataAvailable 事件,並呼叫 start。 引發事件時,事件參數包含 PDL 資料流、目標檔案、UI 啟動程式和 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();
}
}
}
從軟體端點背景工作啟動用戶界面
列印支援應用程式 v4 API 提供讓軟體端點背景工作在需要時向使用者顯示使用者介面的功能。 這會使用現有的 PSA API PrintWorkflowUILauncher 類別。 當背景任務呼叫 LaunchAndCompleteUIAsync 函數時,應用程式會透過現有的 PSA 合約以 UI 界面啟動,Windows.printSupportJobUI。 如需詳細資訊,請參閱 軟體端點 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));
}
軟體端點 UI 範例
此範例顯示已修改為支援從軟體端點背景工作啟動UI的PSA UI合約。 PrintWorkflowJobUISession 類別被修改以新增一個新事件 VirtualPrinterUIDataAvailable。 從軟體端點背景工作啟動使用者介面時,會觸發新的事件。 應用程式可以使用事件 Args 所提供的 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 事件,其中應用程式可以更新目前的列印裝置功能。
private void UpdatePrintDeviceCapabilites(string printerName)
{
IppPrintDevice printer = IppPrintDevice.FromPrinterName(printerName);
// Call RefreshPrintDeviceCapabilities results in Print Device Capabilites Changed event to be raised
printer.RefreshPrintDeviceCapabilities();
}
取得和變更預設用戶列印票證
當從開始功能表啟動PSA應用程式時,IHV可能會想要顯示和修改預設列印偏好設定。 因此,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 如何從列印票證(Print Ticket)中獲取 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 的影像品質
目前的舊版第三方 V4 列印驅動程式可以根據頁面品質來指定 MXDC 所產生的影像品質。 如需詳細資訊,請參閱 V4 驅動程式指令清單。
在推進廢止舊版第三方 V3/V4 驅動程式的過程中,有必要使用 PSA API 為此功能提供對等支援。 基於這個理由,PSA v4 API 提供 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;
}
在 App WinAppSdk 中實作 PrintSupportSettingUI 合約
Print Support App v4 API 在 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);
}
}
備註
本文中的範例是以PSA v1、PSA v2 API 和PSA v3 API 的範例為基礎,假設開發人員熟悉PSA API 工作流程。
本文包含列印支援應用程式設計指南中所描述的現有公用列印支援應用程式 API 擴充,以及在 Windows.Graphics.Printing.PrintSupport 命名空間中提到的內容。 PSA API 可讓印表機製造商開發 UWP 應用程式,以增強 Windows 使用者列印體驗,同時使用收件匣Microsoft IPP 類別驅動程式,而不需要開發自定義驅動程式。
列印元件會透過 PSA 中介程式與 PSA 應用程式進行通訊。
相關文章
ConvertPrintTicketToJobAttributes
Windows 上第三方印表機驅動程式的服務計劃結束
IppPrinterDevice::IsIppPrinter
PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged
PrintSupportSettingsActivatedEventArgs
RefreshPrintDeviceCapabilities