Omówienie dokumentów drukowania (WPF .NET)

W przypadku platformy Microsoft .NET deweloperzy aplikacji korzystający z programu Windows Presentation Foundation (WPF) mają bogaty zestaw interfejsów API zarządzania systemami drukowania i drukowania. Podstawą tej funkcji jest format pliku SPECYFIKACJI PAPIERU XML (XPS) i ścieżka wydruku XPS.

Informacje o systemie XPS

XPS to elektroniczny format dokumentu, format pliku buforu i język opisu strony. Jest to otwarty format dokumentu, który używa konwencji XML, Open Packaging Convention i innych standardów branżowych do tworzenia dokumentów międzyplatformowych. XpS upraszcza proces tworzenia, udostępniania, drukowania, wyświetlania i archiwizowania dokumentów cyfrowych. Aby uzyskać więcej informacji na temat systemu XPS, zobacz XpS Documents (Dokumenty XPS).

Ścieżka wydruku XPS

Ścieżka drukowania XPS to funkcja systemu Windows, która definiuje sposób obsługi drukowania w aplikacjach systemu Windows. Ścieżka wydruku XPS może zastąpić:

  • Języki prezentacji dokumentów, takie jak format tekstu sformatowanego lub przenośny format dokumentu.
  • Formaty buforu wydruku, takie jak Metafile systemu Windows lub Rozszerzony metaplik (EMF).
  • Języki opisu strony, takie jak Język poleceń drukarki lub PostScript.

W związku z tym ścieżka drukowania XPS utrzymuje format XPS z publikacji aplikacji w dół do końcowego przetwarzania w sterowniku drukarki lub urządzeniu.

Bufor wydruku dla dokumentów XPS obsługuje zarówno ścieżkę wydruku XPS, jak i ścieżkę wydruku GDI. Ścieżka wydruku XPS natywnie używa pliku buforu XPS i wymaga sterownika drukarki XPS. Ścieżka wydruku XPS jest oparta na modelu sterownika drukarki XPS (XPSDrv).

Zalety ścieżki drukowania XPS obejmują:

  • Obsługa drukowania WYSIWYG.
  • Natywna obsługa zaawansowanych profilów kolorów, takich jak 32 bity na kanał, model kolorów CMYK, nazwane kolory, n-atramenty i transparencje i gradienty.
  • Zwiększona wydajność drukowania — funkcje i ulepszenia XPS są dostępne tylko dla aplikacji przeznaczonych dla ścieżki wydruku XPS.
  • Format XPS standardu branżowego.

W przypadku podstawowych scenariuszy drukowania prosty i intuicyjny interfejs API jest dostępny ze standardowym interfejsem użytkownika na potrzeby konfiguracji i przesyłania zadań drukowania. W przypadku zaawansowanych scenariuszy interfejs API obsługuje dostosowywanie interfejsu użytkownika lub brak interfejsu użytkownika, synchroniczne lub asynchroniczne drukowanie oraz możliwości drukowania wsadowego. Zarówno proste, jak i zaawansowane opcje zapewniają obsługę drukowania w trybach pełnego lub częściowego zaufania.

XpS został zaprojektowany z myślą o rozszerzalności, więc funkcje i możliwości można dodać do systemu XPS w sposób modułowy. Funkcje rozszerzalności obejmują:

  • Schemat wydruku, który obsługuje szybkie rozszerzanie możliwości urządzenia. Publiczna część schematu jest regularnie aktualizowana w celu dodania żądanych funkcji urządzenia. Aby uzyskać więcej informacji, zobacz Rozszerzalna architektura.
  • Rozszerzalny potok filtru używany przez sterowniki XPSDrv do obsługi zarówno bezpośredniego, jak i skalowalnego drukowania dokumentów XPS. Aby uzyskać więcej informacji, zobacz XPSDrv printer drivers (Sterowniki drukarek XPSDrv).

Aplikacje WPF natywnie obsługują ścieżkę drukowania XPS i mogą używać interfejsów API drukowania XPS do drukowania bezpośrednio do sterownika XPSDrv. Jeśli docelowa kolejka wydruku operacji zapisu nie ma sterownika XPSDrv, metody WriteXpsDocumentWriter i WriteAsync klasy będą automatycznie konwertować zawartość z XPS na format GDI dla ścieżki wydruku GDI.

Poniższa ilustracja przedstawia podsystem wydruku i definiuje części dostarczane przez firmę Microsoft oraz niezależnych dostawców oprogramowania i sprzętu.

Screenshot showing the XPS print system.

Podstawowe drukowanie XPS

WPF ma interfejs API drukowania, który obsługuje zarówno podstawowe, jak i zaawansowane funkcje drukowania. W przypadku tych aplikacji, które nie wymagają rozbudowanego dostosowywania wydruku ani dostępu do kompletnego zestawu funkcji XPS, pomoc techniczna dotycząca drukowania podstawowego może wystarczyć. Obsługa drukowania podstawowego jest zapewniana za pomocą kontrolki PrintDialog , która wymaga minimalnej konfiguracji, ma znany interfejs użytkownika i obsługuje wiele funkcji XPS.

PrintDialog

Kontrolka System.Windows.Controls.PrintDialog zapewnia pojedynczy punkt wejścia dla interfejsu użytkownika, konfiguracji i przesyłania zadań XPS. Aby dowiedzieć się, jak utworzyć wystąpienie i użyć kontrolki, zobacz Jak wyświetlić okno dialogowe drukowania.

Zaawansowane drukowanie XPS

Aby uzyskać dostęp do pełnego zestawu funkcji XPS, użyj zaawansowanego interfejsu API drukowania. W tej sekcji opisano kilka odpowiednich interfejsów API, w tym PrintTicket, PrintCapabilities, PrintServer, PrintQueue i XpsDocumentWriter. Aby uzyskać pełną listę interfejsów API ścieżki wydruku XPS, zobacz System.Windows.Xps przestrzenie nazw i System.Printing .

PrintTicket i PrintCapabilities

Klasy PrintTicket i PrintCapabilities są podstawą zaawansowanych funkcji XPS. Oba obiekty zawierają struktury sformatowane XML cech zorientowanych na drukowanie, które są definiowane przez schemat wydruku. Funkcje obejmują dupleksy, sortowanie, drukowanie dwustronne i zszycie. A PrintTicket instruuje drukarkę, jak przetwarzać zadanie drukowania. Klasa PrintCapabilities definiuje możliwości drukarki. Wykonując zapytanie dotyczące możliwości drukarki, można utworzyć element, PrintTicket który w pełni korzysta z obsługiwanych funkcji drukarki. Podobnie można uniknąć nieobsługiwanych funkcji.

Poniższy przykład wykonuje zapytanie względem PrintCapabilities drukarki i tworzy kod PrintTicket przy użyciu.

/// <summary>
/// Returns a print ticket, which is a set of instructions telling a printer how
/// to set its various features, such as duplexing, collating, and stapling.
/// </summary>
/// <param name="printQueue">The print queue to print to.</param>
/// <returns>A print ticket.</returns>
public static PrintTicket GetPrintTicket(PrintQueue printQueue)
{
    PrintCapabilities printCapabilites = printQueue.GetPrintCapabilities();

    // Get a default print ticket from printer.
    PrintTicket printTicket = printQueue.DefaultPrintTicket;

    // Modify the print ticket.
    if (printCapabilites.CollationCapability.Contains(Collation.Collated))
        printTicket.Collation = Collation.Collated;
    if (printCapabilites.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge))
        printTicket.Duplexing = Duplexing.TwoSidedLongEdge;
    if (printCapabilites.StaplingCapability.Contains(Stapling.StapleDualLeft))
        printTicket.Stapling = Stapling.StapleDualLeft;

    // Returns a print ticket, which is a set of instructions telling a printer how
    // to set its various features, such as duplexing, collating, and stapling.
    return printTicket;
}
''' <summary>
''' Returns a print ticket, which is a set of instructions telling a printer how
''' to set its various features, such as duplexing, collating, and stapling.
''' </summary>
''' <param name="printQueue">The print queue to print to.</param>
''' <returns>A print ticket.</returns>
Public Shared Function GetPrintTicket(printQueue As PrintQueue) As PrintTicket

    Dim printCapabilites As PrintCapabilities = printQueue.GetPrintCapabilities()

    ' Get a default print ticket from printer.
    Dim printTicket As PrintTicket = printQueue.DefaultPrintTicket

    ' Modify the print ticket.
    If printCapabilites.CollationCapability.Contains(Collation.Collated) Then
        printTicket.Collation = Collation.Collated
    End If
    If printCapabilites.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge) Then
        printTicket.Duplexing = Duplexing.TwoSidedLongEdge
    End If
    If printCapabilites.StaplingCapability.Contains(Stapling.StapleDualLeft) Then
        printTicket.Stapling = Stapling.StapleDualLeft
    End If

    ' Returns a print ticket, which is a set of instructions telling a printer how
    ' to set its various features, such as duplexing, collating, and stapling.
    Return printTicket

End Function

PrintServer i PrintQueue

Klasa PrintServer reprezentuje serwer wydruku sieciowego, a PrintQueue klasa reprezentuje drukarkę i kolejkę zadań wyjściowych skojarzonych z nim. Te interfejsy API obsługują zaawansowane zarządzanie zadaniami drukowania dla serwera. Klasa PrintServerlub jedna z jej klas pochodnych służy do zarządzania klasą PrintQueue.

Poniższy przykład tworzy obiekt LocalPrintServer i uzyskuje dostęp do komputera PrintQueueCollection lokalnego przy użyciu kodu.

/// <summary>
/// Return a collection of print queues, which individually hold the features or states
/// of a printer as well as common properties for all print queues.
/// </summary>
/// <returns>A collection of print queues.</returns>
public static PrintQueueCollection GetPrintQueues()
{
    // Create a LocalPrintServer instance, which represents 
    // the print server for the local computer.
    LocalPrintServer localPrintServer = new();

    // Get the default print queue on the local computer.
    //PrintQueue printQueue = localPrintServer.DefaultPrintQueue;

    // Get all print queues on the local computer.
    PrintQueueCollection printQueueCollection = localPrintServer.GetPrintQueues();

    // Return a collection of print queues, which individually hold the features or states
    // of a printer as well as common properties for all print queues.
    return printQueueCollection;
}
''' <summary>
''' Return a collection of print queues, which individually hold the features or states
''' of a printer as well as common properties for all print queues.
''' </summary>
''' <returns>A collection of print queues.</returns>
Public Shared Function GetPrintQueues() As PrintQueueCollection

    ' Create a LocalPrintServer instance, which represents 
    ' the print server for the local computer.
    Dim localPrintServer As LocalPrintServer = New LocalPrintServer()

    ' Get the default print queue on the local computer.
    'Dim  printQueue As PrintQueue = localPrintServer.DefaultPrintQueue

    ' Get all print queues on the local computer.
    Dim printQueueCollection As PrintQueueCollection = localPrintServer.GetPrintQueues()

    ' Return a collection of print queues, which individually hold the features or states
    ' of a printer as well as common properties for all print queues.
    Return printQueueCollection

End Function

XpsDocumentWriter

XpsDocumentWriter, z wieloma metodami Write i WriteAsync służy do dodawania dokumentów XPS do elementu PrintQueue. Na przykład Write(FixedDocumentSequence, PrintTicket) metoda służy do synchronicznego dodawania dokumentu XPS z biletem wydruku do kolejki. Metoda WriteAsync(FixedDocumentSequence, PrintTicket) służy do asynchronicznego dodawania dokumentu XPS z biletem wydruku do kolejki.

Poniższy przykład tworzy XpsDocumentWriter i dodaje dokumenty XPS zarówno synchronicznie, jak i asynchronicznie do PrintQueue kodu przy użyciu.

/// <summary>
/// Asynchronously, add the XPS document together with a print ticket to the print queue.
/// </summary>
/// <param name="xpsFilePath">Path to source XPS file.</param>
/// <param name="printQueue">The print queue to print to.</param>
/// <param name="printTicket">The print ticket for the selected print queue.</param>
public static void PrintXpsDocumentAsync(string xpsFilePath, PrintQueue printQueue, PrintTicket printTicket)
{
    // Create an XpsDocumentWriter object for the print queue.
    XpsDocumentWriter xpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue);

    // Open the selected document.
    XpsDocument xpsDocument = new(xpsFilePath, FileAccess.Read);

    // Get a fixed document sequence for the selected document.
    FixedDocumentSequence fixedDocSeq = xpsDocument.GetFixedDocumentSequence();

    // Asynchronously, add the XPS document together with a print ticket to the print queue.
    xpsDocumentWriter.WriteAsync(fixedDocSeq, printTicket);
}

/// <summary>
/// Synchronously, add the XPS document together with a print ticket to the print queue.
/// </summary>
/// <param name="xpsFilePath">Path to source XPS file.</param>
/// <param name="printQueue">The print queue to print to.</param>
/// <param name="printTicket">The print ticket for the selected print queue.</param>
public static void PrintXpsDocument(string xpsFilePath, PrintQueue printQueue, PrintTicket printTicket)
{
    // Create an XpsDocumentWriter object for the print queue.
    XpsDocumentWriter xpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue);

    // Open the selected document.
    XpsDocument xpsDocument = new(xpsFilePath, FileAccess.Read);

    // Get a fixed document sequence for the selected document.
    FixedDocumentSequence fixedDocSeq = xpsDocument.GetFixedDocumentSequence();

    // Synchronously, add the XPS document together with a print ticket to the print queue.
    xpsDocumentWriter.Write(fixedDocSeq, printTicket);
}
''' <summary>
''' Asynchronously, add the XPS document together with a print ticket to the print queue.
''' </summary>
''' <param name="xpsFilePath">Path to source XPS file.</param>
''' <param name="printQueue">The print queue to print to.</param>
''' <param name="printTicket">The print ticket for the selected print queue.</param>
Public Shared Sub PrintXpsDocumentAsync(xpsFilePath As String, printQueue As PrintQueue, printTicket As PrintTicket)

    ' Create an XpsDocumentWriter object for the print queue.
    Dim xpsDocumentWriter As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue)

    ' Open the selected document.
    Dim xpsDocument As XpsDocument = New XpsDocument(xpsFilePath, FileAccess.Read)

    ' Get a fixed document sequence for the selected document.
    Dim fixedDocSeq As FixedDocumentSequence = xpsDocument.GetFixedDocumentSequence()

    ' Asynchronously, add the XPS document together with a print ticket to the print queue.
    xpsDocumentWriter.WriteAsync(fixedDocSeq, printTicket)

End Sub

''' <summary>
''' Synchronously, add the XPS document together with a print ticket to the print queue.
''' </summary>
''' <param name="xpsFilePath">Path to source XPS file.</param>
''' <param name="printQueue">The print queue to print to.</param>
''' <param name="printTicket">The print ticket for the selected print queue.</param>
Public Shared Sub PrintXpsDocument(xpsFilePath As String, printQueue As PrintQueue, printTicket As PrintTicket)

    ' Create an XpsDocumentWriter object for the print queue.
    Dim xpsDocumentWriter As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue)

    ' Open the selected document.
    Dim xpsDocument As XpsDocument = New XpsDocument(xpsFilePath, FileAccess.Read)

    ' Get a fixed document sequence for the selected document.
    Dim fixedDocSeq As FixedDocumentSequence = xpsDocument.GetFixedDocumentSequence()

    ' Synchronously, add the XPS document together with a print ticket to the print queue.
    xpsDocumentWriter.Write(fixedDocSeq, printTicket)

End Sub

Ścieżka wydruku GDI

Mimo że aplikacje WPF natywnie obsługują ścieżkę drukowania XPS, mogą również dawać dane wyjściowe do ścieżki wydruku GDI, wywołując jedną z Write metod XpsDocumentWriter lub WriteAsync klasy i wybierając kolejkę wydruku dla drukarki innej niż XpsDrv.

W przypadku aplikacji, które nie wymagają funkcji lub obsługi systemu XPS, bieżąca ścieżka drukowania GDI pozostaje niezmieniona. Aby uzyskać więcej informacji na temat ścieżki drukowania GDI i różnych opcji konwersji XPS, zobacz Microsoft XPS document converter (MXDC) i XPSDrv printer drivers (XPSDrv printer drivers).

Model sterownika XPSDrv

Ścieżka drukowania XPS zwiększa wydajność buforowania przy użyciu xpS jako natywnego formatu buforu wydruku podczas drukowania na drukarce lub sterowniku z włączoną obsługą systemu XPS. W przeciwieństwie do pakietu EMF, który reprezentuje dane wyjściowe aplikacji jako serię wywołań do interfejsu GDI dla usług renderowania, format buforu XPS reprezentuje dokument. W związku z tym, gdy pliki buforu XPS są wyjściowe do sterownika drukarki opartego na systemie XPS, nie wymagają dalszej interpretacji, ponieważ sterowniki działają bezpośrednio na danych w tym formacie. Ta funkcja eliminuje konwersje przestrzeni kolorów i danych wymagane dla plików EMF i sterowników wydruku opartych na GDI.

Uproszczony proces buforowania eliminuje konieczność wygenerowania pośredniego pliku buforu, takiego jak plik danych EMF, przed buforowaniem dokumentu. W przypadku mniejszych rozmiarów plików buforu ścieżka wydruku XPS może zmniejszyć ruch sieciowy i zwiększyć wydajność drukowania. W porównaniu z ich odpowiednikami EMF rozmiary plików buforu XPS są zwykle zmniejszane w przypadku korzystania ze ścieżki wydruku XPS. Zmniejszenie rozmiaru pliku buforu odbywa się za pomocą kilku mechanizmów:

  • Podsetting czcionki, który przechowuje tylko znaki używane w dokumencie w pliku XPS.
  • Zaawansowana obsługa grafiki, która natywnie obsługuje przezroczystość i typy pierwotne gradientu, aby uniknąć rasteryzacji zawartości XPS.
  • Identyfikacja typowych zasobów, takich jak obraz logo firmy używanego wielokrotnie w dokumencie. Wspólne zasoby są traktowane jako zasoby udostępnione i są ładowane tylko raz.
  • Kompresja ZIP używana we wszystkich dokumentach XPS.

Rozmiar pliku buforu XPS może nie zostać zmniejszony, jeśli grafika wektorowa jest bardzo złożona, wielowarstwowa lub nieefektywnie napisana. W przeciwieństwie do plików buforu GDI pliki XPS osadzają czcionki urządzenia i czcionki oparte na komputerze na potrzeby wyświetlania ekranu, choć oba rodzaje czcionek są podzbiorne, a sterowniki drukarek mogą usuwać czcionki urządzenia przed przesłaniem pliku do drukarki.

Napiwek

Pliki XPS można również drukować przy użyciu PrintQueue.AddJob metod. Aby uzyskać więcej informacji, zobacz Jak drukować pliki XPS.

Zobacz też