Übersicht über das Drucken von Dokumenten (WPF .NET)

Mit Microsoft .NET verfügen Anwendungsentwickler, die Windows Presentation Foundation (WPF) verwenden, über eine Vielzahl von Druck- und Drucksystemverwaltungs-APIs. Das Herzstück dieser Funktionalität ist das XML Paper Specification (XPS)-Dateiformat und der XPS-Druckpfad.

Info über XPS

XPS ist ein Format für elektronische Dokumente, ein Format für Spooldateien und eine Seitenbeschreibungssprache. Es handelt sich um ein offenes Dokumentformat, das XML, Open Packaging Conventions und andere Branchenstandards verwendet, um plattformübergreifend nutzbare Dokumente zu erstellen. XPS vereinfacht die Vorgänge beim Erstellen, Teilen, Drucken, Anzeigen und Archivieren von digitalen Dokumenten. Weitere Informationen zu XPS finden Sie unter XPS-Dokumente.

XPS-Druckpfad

Der XPS-Druckpfad ist eine Windows-Funktion, die den Umgang mit dem Drucken in Windows-Anwendungen neu definiert. Der XPS-Druckpfad kann folgendes ersetzen:

  • Dokumentpräsentationssprachen, z. B. Rich Text Format oder Portable Document Format.
  • Druckspoolerformate, z. B. Windows Metadatei oder Enhanced Metafile (EMF).
  • Seitenbeschreibungssprachen, z. B. Druckerbefehlssprache oder PostScript.

Daher behält der XPS-Druckpfad das XPS-Format von der Anwendungspublikation bis zur endgültigen Verarbeitung im Druckertreiber oder Gerät bei.

Der Druckspooler für XPS-Dokumente unterstützt sowohl den XPS-Druckpfad als auch den GDI-Druckpfad. Der XPS-Druckpfad verwendet nativ eine XPS-Spooldatei und erfordert einen XPS-Druckertreiber. Der XPS-Druckpfad basiert auf dem XPS-Druckertreibermodell (XPSDrv).

Zu den Vorteilen des XPS-Druckpfads gehören:

  • WYSIWYG-Druckunterstützung.
  • Native Unterstützung erweiterter Farbprofile, z. B. 32 Bit pro Kanal, cmYK-Farbmodell, benannte Farben, n-Inks und Transparenzen und Farbverläufe.
  • Verbesserte Druckleistung – Die Features und Verbesserungen von XPS sind jedoch nur für Anwendungen verfügbar, die den XPS-Druckpfad zum Ziel haben.
  • XPS-Format nach Branchenstandard.

Für einfache Druckszenarien ist eine einfache und intuitiv bedienbare API mit einer Standard-Benutzeroberfläche für Konfiguration und Auftragsübergabe verfügbar. Für erweiterte Szenarien unterstützt die API die Anpassung der oder den Verzicht auf die Benutzeroberfläche, synchronen oder asynchronen Druck und Funktionen zum Druck von Batchaufträgen. Sowohl einfache als auch erweiterte Optionen bieten Druckunterstützung im vollständigen oder teilweise vertrauenswürdigen Modus.

XPS wurde für Erweiterbarkeit entwickelt, sodass Features und Funktionen auf modulare Weise zu XPS hinzugefügt werden können. Zu den Erweiterungsfunktionen gehören:

  • Ein Druckschema, das eine schnelle Erweiterung der Gerätefunktionen unterstützt. Der öffentliche Teil des Schemas wird regelmäßig aktualisiert, um gewünschte Gerätefunktionen hinzuzufügen. Weitere Informationen finden Sie unter Erweiterbare Architektur.
  • Eine erweiterbare Filterpipeline, die XPSDrv-Treiber verwenden, um sowohl direkte als auch skalierbare Druckvorgänge von XPS-Dokumenten zu unterstützen. Weitere Informationen finden Sie unter XPSDrv-Druckertreiber.

WPF-Anwendungen unterstützen den XPS-Druckpfad nativ und können XPS-Druck-APIs verwenden, um direkt mit dm XPSDrv-Treiber zu drucken. Wenn die Zieldruckwarteschlange des Schreibvorgangs keinen XPSDrv-Treiber aufweist, werden die Write- und WriteAsync-Methoden der XpsDocumentWriter-Klasse automatisch Inhalte aus XPS in das GDI-Druckformat für den GDI-Druckpfad konvertiert.

Die folgende Abbildung stellt das Drucksubsystem dar und definiert die von Microsoft und unabhängigen Software- und Hardwareherstellern bereitgestellten Anteile:

Screenshot showing the XPS print system.

Einfacher XPS-Druck

WPF verfügt über eine Druck-API, die sowohl grundlegende als auch erweiterte Druckfunktionen unterstützt. Für Anwendungen, die keine umfangreichen Druckanpassungen oder Zugriff auf die Gesamtmenge der XPS-Funktionen erfordern, kann eine Unterstützung für grundlegenden Druck ausreichen. Grundlegende Druckunterstützung wird über ein PrintDialog-Steuerelement bereitgestellt, das eine minimale Konfiguration erfordert, eine vertraute Benutzeroberfläche aufweist und viele XPS-Features unterstützt.

PrintDialog

Das System.Windows.Controls.PrintDialog-Steuerelement stellt einen einzelnen Einstiegspunkt für die Benutzeroberfläche, zur Konfiguration und für die XPS-Auftragsübermittlung bereit. Informationen zum Instanziieren und Verwenden des Steuerelements finden Sie unter Anzeigen eines Druckdialogfelds.

Erweiterter XPS-Druck

Für den Zugriff auf die Gesamtmenge der XPS-Funktionen muss die erweiterte Druck-API verwendet werden. In diesem Abschnitt werden mehrere relevante APIs beschrieben, darunter PrintTicket, PrintCapabilities, PrintServer, PrintQueue und XpsDocumentWriter. Eine vollständige Liste der APIs des XPS-Druckpfads finden Sie in den Verweisen zu den Namespaces System.Windows.Xps und System.Printing.

PrintTicket und PrintCapabilities

Die Klassen PrintTicket und PrintCapabilities bilden die Grundlage der erweiterten XPS-Funktionen. Beide Objekte enthalten XML-formatierte Strukturen von druckorientierten Features, die vom Druckschema definiert werden. Die Features umfassen Duplexing, Sortierung, zweiseitiges Drucken und Heften. Ein PrintTicket weist einen Drucker an, wie ein Druckauftrag verarbeitet werden muss. Die PrintCapabilities -Klasse definiert die Fähigkeiten eines Druckers. Durch Abfragen der Funktionen eines Druckers kann ein PrintTicket erstellt werden, das die von einem Drucker unterstützten Funktionen in vollem Umfang nutzt. Analog dazu können nicht unterstützte Funktionen vermieden werden.

Das folgende Beispiel fragt die PrintCapabilities eines Druckers ab und erstellt ein PrintTicket mithilfe von Code.

/// <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 und PrintQueue

Die PrintServer-Klasse stellt einen Netzwerkdruckerserver und die PrintQueue-Klasse einen Drucker mit zugeordneter Auftragswarteschlange dar. Zusammen unterstützen diese APIs die erweiterte Verwaltung der Druckaufträge für einen Server. Ein PrintServer oder eine davon abgeleitete Klasse wird verwendet, um eine PrintQueue zu verwalten.

Das folgende Beispiel enthält Code, der ein LocalPrintServer erstellt und auf die PrintQueueCollection des lokalen Computers zugreift.

/// <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 bietet viele Write- und WriteAsync-Methoden und wird zum Hinzufügen von XPS-Dokumenten in eine PrintQueue verwendet. Beispielsweise wird die Write(FixedDocumentSequence, PrintTicket)-Methode verwendet, um synchron ein XPS-Dokument mit einem Druckticket zu einer Warteschlange hinzuzufügen. Die WriteAsync(FixedDocumentSequence, PrintTicket)-Methode wird verwendet, um asynchron ein XPS-Dokument mit einem Druckticket zu einer Warteschlange hinzuzufügen.

Im folgenden Beispiel wird ein XpsDocumentWriter erstellt und XPS-Dokumente hinzugefügt und sowohl synchron als auch asynchron mithilfe von Code zu einer PrintQueue hinzugefügt.

/// <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

GDI-Druckpfad

Obwohl WPF-Anwendungen den XPS-Druckpfad nativ unterstützen, können sie auch zum GDI-Druckpfad ausgeben, indem sie eine der Write- oder WriteAsync-Methoden der XpsDocumentWriter-Klasse aufrufen und die Druckwarteschlange für einen Nicht-XpsDrv-Drucker auswählen.

Für Anwendungen, die keine XPS-Funktion oder -Unterstützung benötigen, bleibt der aktuelle GDI-Druckpfad unverändert. Weitere Infos über den GDI-Druckpfad und die verschiedenen XPS-Konvertierungsoptionen finden Sie unter Microsoft XPS Document Converter (MXDC) und XPSDrv-Druckertreiber.

XPSDrv-Treibermodell

Der XPS-Druckpfad verbessert die Effizienz des Spoolings durch Verwendung von XPS als systemeigenem Druckerspoolerformat beim Drucken auf XPS-fähigen Druckern oder Treibern. Im Gegensatz zu EMF, das die Anwendungsausgabe als Reihe von Aufrufen an GDI für Renderingdienste darstellt, stellt das XPS-Spoolformat das Dokument dar. Wenn also XPS-Spooldateien an einen XPS-basierten Druckertreiber ausgegeben werden, benötigen sie keine weitere Interpretation, da die Treiber direkt mit Daten in diesem Format arbeiten. Durch diese Fähigkeit entfallen die Daten- und Farbraumkonvertierungen, die bei EMF-Dateien und GDI-basierten Druckertreibern erforderlich sind.

Das vereinfachte Spooling beseitigt die Notwendigkeit, vor dem Spoolen des Dokuments eine temporäre Spoolingdatei, wie etwa eine EMF-Datendatei, zu generieren. Durch geringere Größe der Spooldateien kann der XPS-Druckpfad den Netzwerkdatenverkehr verringern und die Druckleistung verbessern. Im Vergleich zu ihren EMF-Entsprechungen sinken die XPS-Spooldateigrößen in der Regel, wenn der XPS-Druckpfad verwendet wird. Die Verringerung der Spooldateigröße erfolgt über mehrere Mechanismen:

  • Subsetting der Schriftart, sodass nur die Zeichen gespeichert werden, die in einem Dokument in der XPS-Datei verwendet werden.
  • Erweiterte Grafikunterstützung, die nativ Transparenz- und Farbverlaufsgrundtypen unterstützt, um die Rasterung von XPS-Inhalten zu vermeiden.
  • Identifizierung häufiger Ressourcen, z. B. ein Bild eines Unternehmenslogos, das mehrmals in einem Dokument verwendet wird. Häufige Ressourcen werden als gemeinsame Ressourcen behandelt und werden nur einmal geladen.
  • ZIP-Komprimierung, die für alle XPS-Dokumente verwendet wird.

Die XPS-Spooldateigröße wird möglicherweise nicht reduziert, wenn eine Vektorgrafik hochkomplex, mehrschichtig oder ineffizient geschrieben ist. Im Gegensatz zu GDI-Spooldateien betten XPS-Dateien Geräteschriftarten und computerbasierte Schriftarten für Bildschirmanzeigezwecke ein, obwohl für beide Arten von Schriftarten Subsetting durchgeführt wird und Druckertreiber Geräteschriftarten entfernen können, bevor die Datei an den Drucker übertragen wird.

Tipp

Sie können XPS-Dateien auch mithilfe von PrintQueue.AddJob-Methoden drucken: Weitere Informationen finden Sie unter Drucken von XPS-Dateien.

Siehe auch