Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Print Support App v4 API mendukung Arsitektur Printer Virtual untuk memfasilitasi implementasi Printer Virtual tanpa driver pihak ketiga warisan. Melalui arsitektur ini, Vendor Perangkat Lunak Independen (ISV) dapat mengimplementasikan Printer Virtual sebagai aplikasi yang mengimplementasikan fitur yang saat ini didukung oleh driver V3/V4 pihak ketiga warisan. Artikel ini menjelaskan bagaimana aplikasi dapat mendaftarkan dirinya sebagai Printer Virtual dan cara menerapkan konversi PDL dan elemen UI yang diperlukan untuk implementasi.
Print Support App (PSA) adalah arsitektur yang diperkenalkan untuk membantu IHV menambahkan penyesuaian ke printer IPP tanpa menggunakan driver pihak ketiga warisan. Untuk memfasilitasi kemudahan transisi ke Virtual Printer baru, semua API adalah bagian dari namespace layanan API Print Support App*, dan menggunakan kembali beberapa kontrak PSA yang berlaku untuk arsitektur Virtual Printer.
Untuk informasi selengkapnya, lihat artikel berikut ini:
| Topik | Deskripsi |
|---|---|
| panduan desain Aplikasi Dukungan Cetak | Memberikan panduan dan contoh untuk OEM printer dan IHV yang menerapkan aplikasi dukungan cetak (PSA) untuk perangkat mereka. |
| Panduan Desain API Aplikasi Pendukung Cetak v3 | Memberikan panduan dan contoh untuk OEM printer dan IHV yang mengimplementasikan Aplikasi Dukungan Cetak (PSA) v3 untuk perangkat mereka. |
| Spesifikasi Manifes MSIX untuk Dukungan Cetak Printer Virtual | Menyediakan panduan dan contoh manifes MSIX untuk OEM printer dan IHV yang mengimplementasikan Printer Virtual dengan Dukungan Cetak. |
| asosiasi aplikasi dukungan cetak | Menyediakan panduan dan contoh untuk mengaitkan aplikasi dukungan cetak (PSA) dengan printer. |
Artikel ini menunjukkan bagaimana API PSA diperluas untuk mendukung Titik Akhir Perangkat Lunak dan beberapa skenario PSA lainnya yang diperlukan oleh IHV.
Terminologi
| Istilah | Definisi |
|---|---|
| PSA | Cetak Aplikasi Dukungan. Aplikasi UWP yang menggunakan API dalam dokumen ini. |
| MXDC | Konversi Dokumen Microsoft XPS |
| MPD | Dialog Cetak Modern. Dialog ini ditampilkan kepada pengguna saat aplikasi mencetak menggunakan Windows.Graphics.Printing API. |
| Pengembangan Profesional Berkelanjutan | Dialog Cetak Umum. Dialog ini ditampilkan kepada pengguna saat aplikasi mencetak menggunakan API Win32. |
| IPP | Protokol Pencetakan Internet. Digunakan dari perangkat klien untuk berinteraksi dengan printer untuk mengambil dan mengatur preferensi pencetakan dan mengirim dokumen yang akan dicetak. |
| Dukungan Cetak untuk Printer Terkait | Printer IPP fisik yang ditautkan ke PSA. |
| IPP Printer | Printer yang mendukung protokol IPP. |
| MSDW | Microsoft Document Writer |
| Antarmuka Pengguna Pengaturan Printer | Dialog di mana pengguna dapat mengubah preferensi yang terkait dengan printer yang akan diterapkan pada waktu cetak. Contohnya termasuk orientasi, ukuran kertas, warna, cetak di kedua sisi, dan sebagainya. |
| PDL | Bahasa Deskripsi Halaman. Format di mana dokumen dikirim ke printer. |
| Printer Terkait dengan PSA | Setiap PSA dikaitkan dengan Printer Fisik IPP. |
| PDC | Format dokumen XML PrintDeviceCapabilities untuk menentukan kemampuan printer. |
| SoftwareAppMon | DLL pemantau port untuk antrian printer virtual baru |
| PrintSupportExtension | Tugas latar belakang PSA bertanggung jawab untuk menyediakan kemampuan perpanjangan batasan printer. |
API Dukungan Pencetakan digunakan kembali untuk Endpoint Perangkat Lunak
Virtual Printer sebagai IppPrintDevice - IppPrintDevice adalah kelas WinRT yang diperkenalkan sebagai bagian dari PSA APIs. Printer Virtual ditambahkan sebagai perangkat printer IPP dan IppPrinterDevice::IsIppPrinter mengembalikan true untuk Printer Virtual yang baru saja ditambahkan. Ini dilakukan agar PDL passthrough bekerja dengan mulus untuk printer Virtual dan IPP, serta untuk menggunakan kembali sebagian besar fitur PSA API yang sudah ada. Fungsi kelas IppPrintDevice (GetPrinterAttributesAsBuffer, GetPrinterAttributes, SetPrinterAttributesFromBuffer, dan SetPrinterAttributes) diubah sesuai untuk Virtual Printer. GetPrinterAttributesAsBuffer dan GetPrinterAttributes selalu mengembalikan hasil "tidak didukung" untuk setiap atribut IPP yang diteruskan, dan SetPrinterAttributesFromBuffer serta SetPrinterAttributes selalu mengembalikan hasil kesalahan dengan kesalahan ditetapkan sebagai "akses ditolak" untuk Printer Virtual. Ini karena Printer Virtual hanya menentukan PDC dalam manifes appx dan tidak mendukung atribut printer IPP apa pun.
Penggunaan Kembali Kontrak windows.printSupportSettingsUI untuk Virtual Printer - Windows.printSupportSettingsUI adalah kontrak antarmuka pengguna (UI) yang diperkenalkan sebagai bagian dari PSA untuk menampilkan antarmuka preferensi cetak kustom bagi pengguna untuk printer IPP dengan menggunakan PSA. Sampel API Print Support App v4 dalam artikel ini menggunakan kembali kontrak yang sama untuk mendukung preferensi cetak kustom untuk UI untuk Printer Virtual tanpa perubahan apa pun.
penggunaan kembali kontrak windows.printSupportJobUI untuk Printer Virtual - Windows.printSupportJobUI adalah kontrak UI yang diperkenalkan sebagai bagian dari PSA untuk menampilkan UI bagi pengguna jika PSA menginginkan input pengguna atau menampilkan pratinjau cetak kepada pengguna. Kontrak ini digunakan kembali agar Printer Virtual menampilkan UI kepada pengguna untuk input atau menampilkan pratinjau. Untuk informasi selengkapnya, lihat contoh antarmuka pengguna Titik Akhir Perangkat Lunak untuk perubahan yang dilakukan pada API dalam kontrak Windows.printSupportJobUI.
penggunaan kembali kontrak windows.printSupportExtension untuk Printer Virtual - Windows.printSupportExtension adalah kontrak latar belakang yang diperkenalkan sebagai bagian dari PSA yang dapat digunakan PSA untuk validasi Print Ticket yang disesuaikan dan fitur lainnya. Printer Virtual juga dapat menggunakan kembali kontrak ini jika aplikasi ingin melakukan validasi kustom tiket cetak atau regenerasi PDC.
Cetak sampel API Aplikasi Dukungan v4
Diagram berikut menjelaskan alur kerja cetak untuk Printer Virtual.
Bagian ini menjelaskan bagaimana Printer Virtual diinstal menggunakan entri manifes appx dan bagaimana Printer Virtual dipanggil dalam berbagai skenario.
Kontrak PrintSupportVirtualPrinterWorkflow Windows
Agar aplikasi mendaftarkan dirinya sebagai Printer Virtual, aplikasi harus memiliki manifes XML yang merupakan bagian dari paket appx UWP atau penginstal MSIX.
Contoh berikut adalah manifes Appx untuk Printer Virtual dan deskripsi tentang apa yang dimaksud oleh setiap bidang.
<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>
Ini adalah kontrak yang digunakan untuk menginstal Antrean Printer Virtual dan juga dapat bertindak sebagai titik akhir latar belakang untuk Printer Virtual yang diinstal. Sebuah manifes appx dapat menginstal beberapa antrean cetak yang terkait dengan aplikasi terinstal yang sama. Ketika pengguna mencetak ke Antrean Printer Virtual baru, aplikasi Printer Virtual dijalankan di latar belakang dan memicu peristiwa dengan kelas runtime PrintWorkflowVirtualPrinterDataAvailableEventArgs sebagai Event Args. Kelas runtime memiliki API untuk membaca data PDL, Meluncurkan UI untuk aplikasi jika diperlukan, dan sebagainya.
PrintSupportVirtualPrinter - Setiap entri menentukan satu antrean pencetakan untuk titik akhir perangkat lunak yang akan dipasang bersama dengan aplikasi.
preferredInputFormat - Bidang ini menunjukkan format PDL input pilihan untuk Printer Virtual. Sistem Cetak Windows menghasilkan format ini sebelum memberikan data PDL ke Printer Virtual untuk semua jalur pencetakan. Bidang hanya dapat berupa nilai berikut: application/oxps atau application/postscript. Penginstalan gagal jika format lain ditentukan di bidang ini. Jika bidang tidak ditentukan, aplikasi/oxps diatur sebagai format PDL input pilihan untuk Printer Virtual yang diinstal.
OutputFileTypes - Ketika bidang ini ditentukan dalam manifes appx, Sistem Cetak Windows membuat antrean printer yang ditandai sebagai printer file, dan dialog Simpan Sebagai ditampilkan kepada pengguna ketika aplikasi mulai mencetak ke Printer Virtual. Nilai bidang ini harus berisi ekstensi file target seperti pdf/pwgr/ps dll. Nilai-nilai ini disimpan dalam data driver dan ditambahkan ke Simpan sebagai Dialog sebagai ekstensi yang diizinkan. Windows Print System membuat kelas
StorageFile untuk file yang dipilih pengguna dan diberikan ke Aplikasi Printer Virtual sebagai bagian dari API Event Args. Jika Printer Virtual tidak menginginkan perilaku cetak file (ini termasuk Printer Virtual yang menyimpan data cetak ke cloud atau printer yang mengirim data ke aplikasi seperti OneNote), maka bidang ini tidak boleh ditambahkan ke manifes.
Format yang Didukung - Printer Virtual dapat menggunakan bidang ini untuk menentukan semua format PDL yang dapat diproses. Ini digunakan untuk aplikasi pencetakan passthrough seperti Microsoft Edge untuk mengidentifikasi format yang didukung seperti PDF dan langsung meneruskan aliran PDF ke Printer Virtual tanpa perubahan apa pun yang dilakukan di antaranya oleh sistem Windows Print. Bidang ini memiliki SupportedFormat sebagai bidang turunan. SupportedFormat memiliki bidang Jenis untuk menentukan jenis MIME yang didukung dan bidang MaxVersion menentukan versi maksimum format PDL yang dapat diterima Printer Virtual. Nilai MaxVersion harus dalam format MajorVersion.MinorVersion. Sistem pencetakan Windows gagal memasang printer jika file dalam format lain. MajorVersion dan MinorVersion harus hanya berupa angka. Jika ada karakter, bidang versi menjadi tidak valid dan diabaikan.
PdcFile - Bidang ini harus menunjuk ke file sumber daya dalam paket aplikasi. File harus berisi konten dalam format xml Kemampuan Perangkat Cetak, yang digunakan untuk menentukan kemampuan printer dan harus digunakan untuk menentukan fitur, opsi, atau parameter kustom apa pun. Ini adalah bidang wajib dan penginstalan printer gagal jika nilai tidak ada atau jika konten file tidak dalam format PDC yang valid.
PdrFile - Jika disediakan, bidang ini harus menunjuk ke file sumber daya dalam paket aplikasi. File harus berisi Sumber Daya Perangkat Cetak dalam format XML. Bidang ini harus disediakan jika aplikasi ingin melokalisasi preferensi cetak kustom. Bidang ini bersifat opsional dan pelokalan sumber daya untuk preferensi cetak dilakukan oleh sistem cetak jika bidang ini tidak ada.
DisplayName - Menentukan nama Antrian Printer Virtual yang diinstal. Pembatasan string ini sama dengan batasan yang Anda miliki untuk nama printer windows.
PrinterUri - Menentukan URI unik yang dapat digunakan oleh aplikasi PSA untuk mengidentifikasi printer. Satu aplikasi Virtual Printer dapat menentukan beberapa titik akhir perangkat lunak yang menghasilkan beberapa printer yang akan diinstal. Bidang PrinterUri dapat digunakan untuk membedakan antara printer ini. Ini diberikan sebagai output dari IppPrintDevice::PrinterUri API. Jika URI tidak ditentukan, Windows menetapkan URI unik arbitrer ke printer.
Sampel Titik Akhir Perangkat Lunak Sederhana untuk printer PDF dan XPS
Sampel ini menunjukkan tugas latar belakang Aplikasi Titik Akhir Perangkat Lunak yang telah mendaftarkan dua titik akhir: Cetak Ke PDF dan Cetak Ke XPS. Sampel mendaftar untuk acara VirtualPrinterDataAvailable dalam sesi dan memulai panggilan. Ketika event dipicu, Event Args berisi aliran PDL, file target, peluncur UI, dan konverter PDL. Aplikasi mengonversi format PDL input ke PDF atau XPS berdasarkan printer dan menulis konten yang dihasilkan ke aliran output file target.
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();
}
}
}
Meluncurkan UI dari tugas latar belakang Titik Akhir Perangkat Lunak
API Aplikasi Dukungan Cetak v4 menyediakan kemampuan bagi tugas latar belakang di Endpoint Perangkat Lunak untuk menampilkan UI kepada pengguna jika diperlukan. Ini menggunakan API PSA yang ada PrintWorkflowUILauncher Class. Ketika tugas latar belakang memanggil fungsi LaunchAndCompleteUIAsync, Aplikasi diluncurkan dalam konteks UI menggunakan kontrak PSA yang ada Windows.printSupportJobUI. Untuk informasi selengkapnya, lihat contoh antarmuka pengguna untuk titik akhir perangkat lunak .
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));
}
Sampel antarmuka pengguna Titik Akhir Perangkat Lunak
Sampel ini menunjukkan kontrak antarmuka pengguna PSA yang dimodifikasi untuk mendukung peluncuran UI dari tugas latar belakang Titik Akhir Perangkat Lunak. Kelas PrintWorkflowJobUISession telah dimodifikasi untuk memiliki peristiwa baru VirtualPrinterUIDataAvailable. Ketika UI diluncurkan dari tugas latar belakang Titik Akhir Perangkat Lunak, event baru dipicu. Aplikasi dapat menampilkan pratinjau kepada pengguna menggunakan konteks sumber PDL yang disediakan oleh 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
}
}
}
Titik Akhir Perangkat Lunak memperbarui konfigurasi printer
Titik Akhir Perangkat Lunak mungkin ingin mengubah konfigurasi printer ketika pengguna mengubah pengaturan. Untuk memfasilitasi hal ini, fungsi
private void UpdatePrintDeviceCapabilites(string printerName)
{
IppPrintDevice printer = IppPrintDevice.FromPrinterName(printerName);
// Call RefreshPrintDeviceCapabilities results in Print Device Capabilites Changed event to be raised
printer.RefreshPrintDeviceCapabilities();
}
Dapatkan dan ubah tiket cetak pengguna bawaan
IHV mungkin ingin menampilkan dan memodifikasi preferensi cetak default saat aplikasi PSA diluncurkan dari Menu Mulai. Untuk alasan ini, properti UserDefaultPrintTicket ditambahkan ke kelas IppPrintDevice WinRT. Aplikasi apa pun bisa mendapatkan dan mengatur tiket cetak default pengguna dengan properti ini.
// 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;
}
Mempermudah dalam menangani atribut pekerjaan
Mungkin sulit untuk membuat atribut pekerjaan lengkap yang diperlukan untuk membuat pekerjaan pada printer jika IHV mungkin ingin menghapus atribut tertentu sebelum mengirim permintaan pekerjaan yang dibuat ke printer. ConvertPrintTicketToJobAttributes ditambahkan ke Winrt Class PrintWorkflowPrintJob untuk mendapatkan atribut IPP untuk tiket printer. Sampel berikut menunjukkan bagaimana PSA bisa mendapatkan atribut IPP dari Tiket Cetak dan menghapus atribut ukuran media, yang kemudian dikirim sebagai bagian dari konten PDL yang dikirim ke printer.
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;
}
Mengonfigurasi kualitas gambar MXDC berdasarkan kualitas output halaman
Driver cetak V4 pihak ketiga yang lama saat ini dapat menentukan kualitas gambar yang dihasilkan oleh MXDC berdasarkan kualitas halaman. Untuk informasi selengkapnya, lihat Manifes Driver V4 .
Ke depan untuk menghentikan penggunaan driver pihak ketiga V3/V4 yang sudah usang, ada kebutuhan untuk menyediakan kesetaraan fungsi untuk fitur ini menggunakan API PSA. Untuk alasan ini, API PSA v4 menyediakan kelas WinRT untuk mendapatkan dan mengatur konfigurasi kualitas gambar.
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;
}
Menerapkan Kontrak PrintSupportSettingUI di App WinAppSdk
API Aplikasi Dukungan Cetak v4 memperkenalkan properti di PrintSupportSettingsActivatedEventArgs kelas WinRT yang disebut OwnerWindowId. Aplikasi Windows App SDK bertanggung jawab untuk membuat jendelanya sebagai modal dari jendela OwnerWindowId yang diberikan.
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);
}
}
Komentar
Sampel dalam artikel ini dibangun di atas sampel API PSA v1, PSA v2 API, dan PSA v3 dengan asumsi bahwa pengembang terbiasa dengan alur kerja API PSA.
Artikel ini berisi ekstensi untuk API Aplikasi Dukungan Cetak publik yang sudah ada yang dijelaskan dalam panduan desain Aplikasi Dukungan Cetak dan Windows.Graphics.Printing.PrintSupport Namespace. API PSA memungkinkan produsen printer untuk mengembangkan aplikasi UWP untuk meningkatkan pengalaman mencetak pengguna Windows saat menggunakan driver Microsoft IPP Class yang telah terinstal, tanpa perlu mengembangkan driver kustom.
Komponen pencetakan berkomunikasi ke aplikasi PSA melalui proses perantara PSA.
Artikel terkait
MengonversiTiketCetakKeAtributPekerjaan
Akhir paket layanan untuk driver printer pihak ketiga pada Windows
IppPrinterDevice::IsIppPrinter
PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged
PrintSupportSettingsActivatedEventArgs
MuatUlangKemampuanPerangkatCetak
SetPrinterAttributesFromBuffer
Sampel UI Titik Akhir Perangkat Lunak