Przewodnik projektowania interfejsu API obsługi wydruku w wersji 4
Interfejs API obsługi wydruku w wersji 4 obsługuje architekturę drukarki wirtualnej, aby ułatwić implementację drukarek wirtualnych bez starszych sterowników innych firm. Dzięki tej architekturze niezależny dostawca oprogramowania (ISV) może zaimplementować drukarkę wirtualną jako aplikację implementując funkcje obecnie obsługiwane przez starsze sterowniki V3/V4 innych firm. W tym artykule opisano, jak aplikacja może zarejestrować się jako drukarka wirtualna oraz jak zaimplementować elementy konwersji PDL i interfejsu użytkownika wymagane do implementacji.
Aplikacja do obsługi wydruku (PSA) to architektura, która została wprowadzona, aby ułatwić IHV dodawanie dostosowywania do drukarek IPP bez używania starszych sterowników innych firm. Aby ułatwić przejście na nową drukarkę wirtualną, wszystkie interfejsy API są częścią przestrzeni nazw API aplikacji Print Support App* i ponownie wykorzystują niektóre kontrakty PSA, które są odpowiednie dla architektury drukarki wirtualnej.
Aby uzyskać więcej informacji, zobacz następujące artykuły:
Temat | Opis |
---|---|
Przewodnik projektowania aplikacji obsługi wydruku | Zawiera wskazówki i przykłady dla producentów OEM i IHV drukarek, którzy implementują aplikację do obsługi wydruku (PSA) dla swoich urządzeń. |
Przewodnik projektowania interfejsu API Print App w wersji 3 | Zawiera wskazówki i przykłady dla OEM-ów i IHV-ów drukarek, które implementują aplikację wsparcia drukowania w wersji 3 (PSA) dla ich urządzeń. |
specyfikacja manifestu MSIX do obsługi drukowania drukarki wirtualnej | Zawiera wskazówki i przykłady manifestu MSIX dla OEM drukarek i IHV w zakresie implementacji wirtualnej drukarki wspierającej drukowanie. |
Obsługa aplikacji do drukowania — skojarzenie | Zawiera wskazówki i przykłady dotyczące kojarzenia aplikacji do obsługi wydruku (PSA) z drukarką. |
W tym artykule pokazano, jak interfejsy API PSA są rozszerzone w celu obsługi punktu końcowego oprogramowania i kilku innych scenariuszy PSA wymaganych przez IHV.
Terminologia
Termin | Definicja |
---|---|
PSA | Aplikacja wspomagająca drukowanie. Aplikacja platformy UWP korzystająca z interfejsu API w tym dokumencie. |
MXDC | Microsoft XPS Document Converter |
Metropolitalny Departament Policji | Nowoczesne okno dialogowe drukowania. To okno dialogowe jest wyświetlane użytkownikowi podczas drukowania aplikacji przy użyciu interfejsu API Windows.Graphics.Printing. |
CPD | Typowe okno dialogowe drukowania. To okno dialogowe jest wyświetlane użytkownikowi podczas drukowania aplikacji przy użyciu interfejsu API Win32. |
IPP | Protokół drukowania internetowego. Używany z urządzenia klienckiego do interakcji z drukarką w celu pobrania i ustawienia preferencji drukowania i wysłania dokumentu do wydrukowania. |
Drukarka skojarzona z obsługą drukowania | Fizyczna drukarka IPP połączona z PSA. |
Drukarka IPP | Drukarka obsługująca protokół IPP. |
MSDW | Program do pisania dokumentów firmy Microsoft |
Interfejs użytkownika ustawień drukarki | Okno dialogowe, w którym użytkownik może zmienić preferencje związane z drukarką, która będzie stosowana w czasie drukowania. Przykłady obejmują orientację, rozmiar papieru, kolor, drukowanie po obu stronach itd. |
PDL | Język opisu strony. Format, w którym dokument jest wysyłany do drukarki. |
Skojarzona drukarka PSA | Każdy PSA jest skojarzony z fizyczną drukarką IPP. |
PDC | PrintDeviceCapabilities format dokumentu XML do definiowania możliwości drukarki. |
SoftwareAppMon | Biblioteka DLL monitora portów dla nowej kolejki drukarki wirtualnej |
PrintSupportExtension | Zadanie w tle PSA jest odpowiedzialne za zapewnienie możliwości rozszerzenia ograniczeń drukarki. |
Interfejsy API do zarządzania drukowaniem ponownie używane dla punktów końcowych oprogramowania
Virtual Printer as IppPrintDevice - IppPrintDevice to klasa Winrt wprowadzona jako część interfejsów API PSA. Drukarka wirtualna jest dodawana jako urządzenie drukarki IPP i IppPrinterDevice::IsIppPrinter zwraca wartość true dla nowo dodanej drukarki wirtualnej. Odbywa się to, aby automatyczne przekazywanie PDL działało bezproblemowo zarówno dla drukarek wirtualnych, jak i drukarek IPP, a także aby ponownie wykorzystać wiele elementów interfejsu API PSA, które są już dostępne. Funkcje klasy IppPrintDevice (GetPrinterAttributesAsBuffer, GetPrinterAttributes, SetPrinterAttributesFromBufferoraz SetPrinterAttributes) zostały zmienione dla Virtual Printer. pl-PL: GetPrinterAttributesAsBuffer i GetPrinterAttributes zawsze zwracają nieobsługiwane dla każdego przekazanego atrybutu IPP, a SetPrinterAttributesFromBuffer i SetPrinterAttributes zawsze zwracają błąd z ustawionym błędem 'odmowa dostępu' dla drukarek wirtualnych. Dzieje się tak, ponieważ drukarki wirtualne określają jedynie PDC w manifeście appx i nie obsługują żadnych atrybutów drukarki IPP.
windows.printSupportSettingsUI ponowne użycie kontraktu dla drukarki wirtualnej - Windows.printSupportSettingsUI jest kontraktem interfejsu użytkownika wprowadzonym w ramach PSA w celu wyświetlania niestandardowych preferencji drukowania interfejsu użytkownika dla drukarki IPP przy użyciu PSA. Przykłady interfejsu API aplikacji do obsługi wydruku w wersji 4 w tym artykule umożliwiają ponowne użycie tego samego kontraktu w celu obsługi niestandardowych preferencji drukowania dla interfejsu użytkownika drukarki wirtualnej bez żadnych zmian.
windows.printSupportJobUI ponowne użycie kontraktu dla drukarki wirtualnej - Windows.printSupportJobUI jest kontraktem interfejsu użytkownika wprowadzonym w ramach PSA w celu wyświetlenia interfejsu użytkownika w przypadku, gdy PSA chce uzyskać dane wejściowe od użytkownika lub wyświetlić podgląd wydruku użytkownikowi. Ten kontrakt jest ponownie używany dla drukarki wirtualnej, aby wyświetlić interfejs użytkownika dla danych wejściowych lub wyświetlić podgląd. Aby uzyskać więcej informacji, zobacz przykład interfejsu użytkownika punktu końcowego oprogramowania , dotyczący zmian wprowadzonych w interfejsach API w kontrakcie Windows.printSupportJobUI.
windows.printSupportExtension kontrakt ponownego użycia dla drukarki wirtualnej - Windows.printSupportExtension jest tłem kontraktowym wprowadzonym w ramach PSA, który może być używany przez PSA, jeśli chce dostosować weryfikację Dokumentu Druku i inne funkcje. Drukarki wirtualne mogą również używać tego kontraktu, jeśli aplikacja chce przeprowadzić walidację niestandardową biletu wydruku lub regenerację PDC.
Przykłady interfejsu API obsługi wydruku w wersji 4
Na poniższym diagramie opisano przepływ pracy drukowania dla drukarki wirtualnej.
W tej sekcji opisano sposób instalowania drukarek wirtualnych przy użyciu wpisów manifestu appx oraz wywoływania drukarki wirtualnej w różnych scenariuszach.
Windows. PrintSupportVirtualPrinterWorkflow kontrakt
Aby aplikacja zarejestrowała się jako drukarka wirtualna, musi mieć manifest XML, który jest częścią pakietu appx platformy UWP lub instalatora MSIX .
Poniższy przykład to manifest appx dla drukarki wirtualnej i opis tego, do czego odnosi się każde pole.
<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>
Jest to kontrakt używany do instalowania kolejki drukarek wirtualnych i może również działać jako punkt końcowy w tle dla zainstalowanej drukarki wirtualnej. Jeden manifest appx może zainstalować wiele kolejek wydruku skojarzonych z tą samą zainstalowaną aplikacją. Gdy użytkownik drukuje na nowej kolejce drukarki wirtualnej, aplikacja drukarki wirtualnej jest uruchamiana w tle i zgłasza zdarzenia z klasy środowiska uruchomieniowego PrintWorkflowVirtualPrinterDataAvailableEventArgs jako Event Args. Klasa środowiska uruchomieniowego ma interfejsy API do odczytywania danych PDL, uruchamiania interfejsu użytkownika dla aplikacji w razie potrzeby itd.
PrintSupportVirtualPrinter — każdy wpis określa jedną kolejkę drukowania programowego punktu końcowego, którą należy zainstalować wraz z aplikacją.
PreferredInputFormat — to pole wskazuje preferowany format wejściowy PDL dla drukarki wirtualnej. System windows print generuje ten format przed przekazaniem danych PDL do drukarki wirtualnej dla wszystkich ścieżek drukowania. Pole może przyjmować tylko następujące wartości: application/oxps lub application/postscript. Instalacja nie powiedzie się, jeśli w tym polu określono inne formaty. Jeśli pole nie zostanie określone, parametr application/oxps zostanie ustawiony jako preferowany format wejściowy PDL dla zainstalowanej drukarki wirtualnej.
OutputFileTypes — gdy to pole jest określone w manifeście appx, system Windows Print tworzy kolejkę drukarki oznaczoną jako drukarkę plików, a okno dialogowe Zapisz jako jest wyświetlane użytkownikowi, gdy aplikacja rozpoczyna proces drukowania do Wirtualnej Drukarki. Wartości tego pola powinny zawierać docelowe rozszerzenia plików, takie jak pdf/pwgr/ps itp. Te wartości są przechowywane w danych sterownika i są dodawane do okna dialogowego Zapisz jako jako dozwolone rozszerzenia. System Druku Windows tworzy klasę StorageFile dla wybranego przez użytkownika pliku i jest przekazywana aplikacji Drukarki Wirtualnej w ramach interfejsu API Event Args. Jeśli drukarka wirtualna nie chce zachowania drukowania plików (dotyczy to drukarek wirtualnych, które przechowują dane drukowania w chmurze lub drukarkach wysyłających dane do aplikacji, takiej jak OneNote), to pole nie powinno być dodawane do manifestu.
Obsługiwane formaty — drukarka wirtualna może używać tego pola do określania wszystkich formatów PDL, które może przetwarzać. Służy to aplikacji do drukowania przekazywanego, takich jak Microsoft Edge, do identyfikowania obsługiwanego formatu, takiego jak PDF, aby bezpośrednio przekazać strumień PDF do drukarki wirtualnej bez żadnych zmian wprowadzanych przez system drukowania Windows. To pole zawiera pole podrzędne o nazwie SupportedFormat. SupportedFormat ma typ pola, aby określić obsługiwany typ MIME i pole MaxVersion określa maksymalną wersję tego formatu PDL, który może odbierać drukarka wirtualna. Wartość MaxVersion musi być w formacie MajorVersion.MinorVersion. Instalacja drukarki w systemie Windows kończy się niepowodzeniem, jeśli jest w innym formacie. MajorVersion i MinorVersion mogą zawierać tylko liczby, jeśli występują jakiekolwiek znaki, pole wersji jest unieważniane i ignorowane.
PdcFile — to pole musi wskazywać plik zasobu w pakiecie aplikacji. Plik powinien zawierać zawartość w formacie XML Możliwości urządzenia wydruku, który służy do definiowania możliwości drukarki i powinien służyć do definiowania dowolnych funkcji niestandardowych, opcji lub parametrów. Jest to obowiązkowe pole, a instalacja drukarki kończy się niepowodzeniem, jeśli wartość nie jest obecna lub jeśli zawartość pliku nie jest w prawidłowym formacie PDC.
PdrFile — jeśli jest to pole podane, musi wskazywać plik zasobu w pakiecie aplikacji. Plik powinien zawierać zasoby urządzenia drukowania w formacie XML. To pole powinno zostać podane, jeśli aplikacja chce lokalizować niestandardowe preferencje drukowania. To pole jest opcjonalne, a lokalizacja zasobów dla preferencji drukowania jest wykonywana przez system wydruku, jeśli to pole nie jest obecne.
DisplayName — określa nazwę zainstalowanej kolejki drukarki wirtualnej. Ograniczenia tego ciągu znaków są takie same jak ograniczenia dotyczące nazwy drukarki systemu Windows.
PrinterUri — określa unikatowy identyfikator URI, który może być używany przez aplikacje PSA do identyfikowania drukarki. Pojedyncza aplikacja drukarki wirtualnej może określać wiele punktów końcowych oprogramowania, co powoduje zainstalowanie wielu drukarek. Pole PrinterUri może służyć do rozróżniania tych drukarek. Jest to podane jako dane wyjściowe z IppPrintDevice::PrinterUri API. Jeśli nie określono identyfikatora URI, system Windows przypisuje do drukarki dowolny unikatowy identyfikator URI.
Przykład prostego punktu końcowego oprogramowania dla drukarek PDF i XPS
W tym przykładzie pokazano zadanie działające w tle aplikacji punktu końcowego, która zarejestrowała dwa punkty końcowe: Drukuj do PDF i Drukuj do XPS. Przykładowe rejestry dla zdarzenia VirtualPrinterDataAvailable w sesji i wywołania są uruchamiane. Po wystąpieniu zdarzenia Event Args zawiera strumień PDL, plik docelowy, uruchamiacz interfejsu użytkownika i konwerter PDL. Aplikacja konwertuje format wejściowy PDL na format PDF lub XPS w zależności od drukarki i zapisuje wynikową zawartość do docelowego strumienia wyjściowego.
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();
}
}
}
Uruchamianie interfejsu użytkownika z zadania w tle punktu końcowego oprogramowania
Interfejs API Print Support App w wersji 4 umożliwia zadaniu w tle powiązanemu z punktem końcowym oprogramowania wyświetlenie interfejsu użytkownika, jeśli jest to konieczne. Korzysta to z istniejącego interfejsu API PSA PrintWorkflowUILauncher Class. Gdy zadanie w tle wywołuje funkcję LaunchAndCompleteUIAsync, aplikacja jest uruchamiana w kontekście interfejsu użytkownika przy użyciu istniejącego kontraktu PSA Windows.printSupportJobUI. Aby uzyskać więcej informacji, zobacz przykładowy interfejs użytkownika punktu końcowego oprogramowania .
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));
}
Przykład interfejsu użytkownika punktu końcowego oprogramowania
W tym przykładzie przedstawiono kontrakt interfejsu użytkownika PSA zmodyfikowany w celu obsługi uruchamiania interfejsu użytkownika z zadania w tle punktu końcowego oprogramowania. Klasa PrintWorkflowJobUISession została zmodyfikowana w celu utworzenia nowego zdarzenia VirtualPrinterUIDataAvailable. Gdy interfejs użytkownika zostanie uruchomiony z zadania w tle oprogramowania końcowego, zostaje wywołane nowe zdarzenie. Aplikacja może wyświetlić podgląd użytkownikowi przy użyciu kontekstu źródłowego PDL dostarczonego przez usługę 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
}
}
}
Oprogramowanie do zarządzania punktami końcowymi, które aktualizuje konfigurację drukarki
Punkty końcowe oprogramowania mogą chcieć zmienić konfigurację drukarki, gdy użytkownik zmieni ustawienia. Aby to ułatwić, funkcja RefreshPrintDeviceCapabilities jest dodawana w klasie IppPrintDevice WinRT. Gdy ta funkcja jest wywoływana, wywołuje zdarzenie PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged, w którym aplikacja może zaktualizować bieżące możliwości urządzenia drukowania.
private void UpdatePrintDeviceCapabilites(string printerName)
{
IppPrintDevice printer = IppPrintDevice.FromPrinterName(printerName);
// Call RefreshPrintDeviceCapabilities results in Print Device Capabilites Changed event to be raised
printer.RefreshPrintDeviceCapabilities();
}
Pobieranie i zmienianie domyślnego biletu drukowania użytkownika
Niezależni dostawcy sprzętu mogą chcieć wyświetlać i modyfikować domyślne preferencje drukowania, gdy aplikacja PSA jest uruchamiana z menu Start. Z tego powodu właściwość UserDefaultPrintTicket jest dodawana do klasy IppPrintDevice WinRT. Każda aplikacja może pobrać i ustawić domyślny bilet drukowania użytkownika z użyciem tej właściwości.
// 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;
}
Ułatwianie pracy z atrybutami zadań
Może być trudno utworzyć pełne atrybuty zadania wymagane do stworzenia zadania na drukarce w sytuacjach, gdy niezależny dostawca sprzętu (IHV) chce usunąć określone atrybuty przed wysłaniem żądania utworzenia zadania do drukarki. ConvertPrintTicketToJobAttributes jest dodawany do klasy Winrt PrintWorkflowPrintJob, aby uzyskać atrybuty IPP dla biletu drukarki. Poniższy przykład pokazuje, jak aplikacja usług drukowania może pobrać atrybuty IPP z biletu drukowania i usunąć atrybut rozmiaru nośnika, który jest następnie wysyłany jako część zawartości PDL wysyłanej do drukarki.
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;
}
Konfigurowanie jakości obrazu MXDC na podstawie jakości danych wyjściowych strony
Starsze sterowniki wydruku w wersji 4 innych firm mogą określać jakość obrazu produkowaną przez MXDC w zależności od jakości strony. Aby uzyskać więcej informacji, zobacz Manifest sterownika wersji 4 .
Przejście do wycofania przestarzałych sterowników innych firm V3/V4 wymaga zapewnienia równości tej funkcji z użyciem API PSA. Z tego powodu interfejs API PSA w wersji 4 udostępnia klasę WinRT do uzyskiwania i ustawiania konfiguracji jakości obrazu.
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;
}
Implementowanie kontraktu PrintSupportSettingUI w aplikacji WinAppSdk
Interfejs API obsługi wydruku w wersji 4 wprowadza właściwość w PrintSupportSettingsActivatedEventArgs klasę Winrt o nazwie OwnerWindowId. Aplikacja Windows App SDK jest odpowiedzialna za utworzenie okna w trybie modalnym dla okna o identyfikatorze 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);
}
}
Uwagi
Przykłady w tym artykule są oparte na przykładach PSA v1, PSA v2 API i PSA v3 API, przy założeniu, że deweloper jest zaznajomiony z przepływem pracy API PSA.
Ten artykuł zawiera rozszerzenia istniejącego publicznego interfejsu API aplikacji obsługi wydruku opisanego w przewodniku projektowania aplikacji pomocy technicznej drukowania i Windows.Graphics.Print.PrintSupport Przestrzeni nazw. Interfejs API PSA umożliwia producentom drukarek tworzenie aplikacji UWP, które mogą usprawnić doświadczenie drukowania użytkowników systemu Windows podczas korzystania ze wbudowanego sterownika klasy IPP firmy Microsoft, bez konieczności opracowywania sterownika niestandardowego.
Składniki drukowania komunikują się z aplikacją PSA za pośrednictwem procesu brokera PSA.
Powiązane artykuły
KonwertujBiletDrukuNaAtrybutyZadania
koniec planu obsługi sterowników drukarek innych firm w systemie Windows
IppPrinterDevice::IsIppPrinter
PrintSupportExtensionSession.PrintDeviceCapabilitiesChanged
PrintSupportSettingsActivatedEventArgs
RefreshPrintDeviceCapabilities
SetPrinterAttributesFromBuffer
Przykład interfejsu użytkownika punktu końcowego oprogramowania