Freigeben über


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

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

Informationen zu XPS

XPS ist ein elektronisches Dokumentformat, ein Spooldateiformat und eine Seitenbeschreibungssprache. Es handelt sich um ein offenes Dokumentformat, das XML, Open Packaging Conventions und andere Branchenstandards verwendet, um plattformübergreifende Dokumente zu erstellen. XPS vereinfacht den Prozess, mit dem digitale Dokumente erstellt, freigegeben, gedruckt, angezeigt und archiviert werden. Weitere Informationen zu XPS finden Sie unter XPS-Dokumente.

XPS-Druckpfad

Der XPS-Druckpfad ist ein Windows-Feature, mit dem das Drucken in Windows-Anwendungen neu definiert wird. Der XPS-Druckpfad kann Folgendes ersetzen:

  • Dokumentpräsentationssprachen, z. B. Rich Text Format oder Portable Document Format.
  • Druckspoolerformate (z. B. Windows Metafile 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 sowie Transparenzen und Farbverläufe)
  • Verbesserte Druckleistung – XPS-Features und -Verbesserungen stehen nur Anwendungen zur Verfügung, die den XPS-Druckpfad verwenden.
  • Branchenstandard-XPS-Format.

Für grundlegende Druckszenarien steht eine einfache und intuitive API mit einer Standardbenutzeroberfläche für die Druckkonfiguration und Auftragsübermittlung zur Verfügung. Für erweiterte Szenarien unterstützt die API die Anpassung der Benutzeroberfläche oder überhaupt keine Benutzeroberfläche, synchrones oder asynchrones Drucken und Batchdruckfunktionen. Sowohl einfache als auch erweiterte Optionen bieten Druckunterstützung im vollständigen oder teilweise vertrauenswürdigen Modus.

XPS wurde mit Blick auf Erweiterbarkeit entwickelt, sodass Features und Funktionen modular zu XPS hinzugefügt werden können. Zu den Erweiterbarkeitsfunktionen gehören:

  • Ein Druckschema, das eine schnelle Erweiterung der Gerätefunktionen unterstützt. Der öffentliche Teil des Schemas wird regelmäßig aktualisiert, um die gewünschten Gerätefunktionen hinzuzufügen. Weitere Informationen finden Sie unter Erweiterbare Architektur.
  • Eine erweiterbare Filterpipeline, die XPSDrv-Treiber verwenden, um das direkte und skalierbare Drucken 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 auf den XPSDrv-Treiber zu drucken. Wenn die Zieldruckwarteschlange des Schreibvorgangs keinen XPSDrv-Treiber aufweist, konvertieren die Methoden Write und WriteAsync der XpsDocumentWriter-Klasse Inhalte automatisch aus XPS in das GDI-Druckformat für den GDI-Druckpfad.

Die folgende Abbildung zeigt das Drucksubsystem und definiert die Teile, die von Microsoft und unabhängigen Software- und Hardwareanbietern bereitgestellt werden.

Screenshot, der das XPS-Drucksystem zeigt.

Grundlegendes XPS-Drucken

WPF verfügt über eine Druck-API, die sowohl grundlegende als auch erweiterte Druckfunktionen unterstützt. Für Anwendungen, die keine umfangreiche Druckanpassung oder den Zugriff auf den vollständigen XPS-Featuresatz erfordern, reicht die grundlegende Druckunterstützung möglicherweise aus. Die grundlegende Druckunterstützung wird über ein PrintDialog-Steuerelement bereitgestellt, das eine minimale Konfiguration erfordert, über eine vertraute Benutzeroberfläche verfügt 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

Verwenden Sie die erweiterte Druck-API, um auf die vollständigen XPS-Features zuzugreifen. In diesem Abschnitt werden mehrere relevante APIs beschrieben, darunter PrintTicket, PrintCapabilities, PrintServer, PrintQueueund XpsDocumentWriter. Eine vollständige Liste der XPS-Druckpfad-APIs finden Sie in den namespaces System.Windows.Xps und System.Printing.

„PrintTicket“ und „PrintCapabilities“

Die klassen PrintTicket und PrintCapabilities sind die Grundlage erweiterter XPS-Features. Beide Objekte enthalten XML-formatierte Strukturen von druckorientierten Features, die vom Druckschema definiert werden. Die Features umfassen Duplexing, Sortierung, zweiseitiges Drucken und Funktionsanheftung. Ein PrintTicket weist einen Drucker an, wie ein Druckauftrag verarbeitet werden muss. Die PrintCapabilities Klasse definiert die Funktionen eines Druckers. Durch Abfragen der Funktionen eines Druckers kann ein PrintTicket erstellt werden, das die von einem Drucker unterstützten Features in vollem Umfang nutzt. Ebenso können nicht unterstützte Features 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 Netzwerkdruckserver dar, und die PrintQueue Klasse stellt einen Drucker und die damit verknüpfte Ausgabeauftragswarteschlange 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-Funktionalität oder -Unterstützung erfordern, bleibt der aktuelle GDI-Druckpfad unverändert. Weitere Informationen zum GDI-Druckpfad und den verschiedenen XPS-Konvertierungsoptionen finden Sie unter "Microsoft XPS-Dokumentkonverter (MXDC)" und "XPSDrv-Druckertreiber".

XPSDrv-Treibermodell

Der XPS-Druckpfad verbessert die Spoolereffizienz durch die Verwendung von XPS als natives Druckerspoolerformat beim Drucken über XPS-fähige Drucker oder Treiber. Im Gegensatz zu EMF, das die Anwendungsausgabe als eine Reihe von Aufrufen an GDI für Renderdienste darstellt, repräsentiert das XPS-Spoolformat das Dokument. 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. Mit dieser Funktion werden die Daten- und Farbraumkonvertierungen beseitigt, die für EMF-Dateien und GDI-basierte Drucktreiber erforderlich sind.

Das vereinfachte Spooling beseitigt die Notwendigkeit, vor dem Spoolen des Dokuments eine temporäre Spoolingdatei (z. B. eine EMF-Datendatei) zu generieren. Mit kleineren Spooldateigrößen kann der XPS-Druckpfad den Netzwerkdatenverkehr reduzieren 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 Reduzierung der Spooldateigröße erfolgt über mehrere Mechanismen:

  • Unterklasse der Schriftarten, 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 allgemeiner Ressourcen, z. B. ein Bild eines Unternehmenslogos, das mehrmals in einem Dokument verwendet wird. Gemeinsame Ressourcen werden als geteilte Ressourcen behandelt und 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 mit den PrintQueue.AddJob-Methoden drucken. Weitere Informationen finden Sie unter Drucken von XPS-Dateien.

Siehe auch