Übersicht über das Drucken

Aktualisiert: November 2007

Mit Microsoft .NET Framework verfügen Anwendungsentwickler, die Windows Presentation Foundation (WPF) verwenden, über eine Reihe von APIs für die Druck- und Drucksystemverwaltung. Mit Windows Vista sind einige dieser Verbesserungen des Drucksystems auch für Entwickler verfügbar, die Windows Forms-Anwendungen erstellen, und für Entwickler, die nicht verwalteten Code verwenden. Hauptbestandteil dieser neuen Funktionen sind das neue XML Paper Specification (XPS)-Dateiformat und der XPS-Druckpfad.

Dieses Thema enthält folgende Abschnitte.

Informationen über XPS

XPS ist ein Format für elektronische Dokumente, ein Format für Spooldateien und eine Seitenbeschreibungssprache. Mit diesem offenen Dokumentformat, das XML, Open Packaging-Konventionen (Open Packaging Conventions, OPC) und andere Industriestandards verwendet, werden plattformübergreifende Dokumente erstellt. XPS vereinfacht den Vorgang, durch den digitale Dokumente erstellt, gemeinsam genutzt, gedruckt, angezeigt und archiviert werden. Weitere Informationen über XPS finden Sie unter XPS Web Site.

Verschiedene Techniken zum Drucken XPS-basierter Inhalte mithilfe von WPF werden im Beispiel Drucken eines XPS-Dokuments und unter Gewusst wie: Programmgesteuertes Drucken von XPS-Dateien veranschaulicht. Bei der Beschäftigung mit den in diesem Thema enthaltenen Inhalten ist es möglicherweise hilfreich, auf diese Beispiele zurückzugreifen. (Entwickler von nicht verwaltetem Code sollten die Hilfe für Microsoft XPS Document Converter-Druckerescape konsultieren. Windows Forms-Entwickler müssen die API im System.Drawing.Printing-Namespace verwenden, die nicht den vollständigen XPS-Druckpfad, sondern einen hybriden GDI/XPS-Druckpfad unterstützt. Siehe Druckpfadarchitektur weiter unten.)

XPS-Druckpfad

Der XML Paper Specification (XPS)-Druckpfad ist ein neues Windows-Feature, das neu definiert, wie das Drucken in Windows-Anwendungen behandelt wird. Da XPS eine Dokumentenbeschreibungssprache (z. B. RTF), ein Druckspoolerformat (z. B. WMF) und eine Seitenbeschreibungssprache (z. B. PCL oder Postscript) ersetzen kann, behält der neue Druckpfad das XPS-Format von der Anwendungsveröffentlichung bis zur abschließenden Verarbeitung im Druckertreiber oder im Gerät bei.

Der XPS-Druckpfad basiert auf dem XPS-Druckertreibermodell (XPSDrv), was mehrere Vorteile für Entwickler bietet, z. B. "what you see is what you get" (WYSIWYG)-Drucken, verbesserte Farbunterstützung und erheblich verbesserte Druckleistung. (Weitere Informationen über XPSDrv finden Sie unter Windows Driver Development Kit.)

Die Funktionsweise des Druckspoolers für XPS-Dokumente entspricht weitgehend der in früheren Versionen von Windows. Sie wurde jedoch verbessert und unterstützt jetzt nicht nur wie bisher den GDI-Druckpfad, sondern auch den XPS-Druckpfad. Der neue Druckpfad nutzt direkt eine XPS-Spooldatei. Während für frühere Versionen von Windows geschriebene Benutzermodus-Druckertreiber weiterhin funktionieren, wird ein XPS-Druckertreiber (XPSDrv) benötigt, um den XPS-Druckpfad zu verwenden.

Die Vorteile des XPS-Druckpfads sind bedeutend und umfassen:

  • WYSIWYG-Druckunterstützung

  • Systemeigene Unterstützung von erweiterten Farbprofilen mit 32 Bits pro Kanal, CMYK, benannten Farben und n-Tinten sowie systemeigene Unterstützung von Transparenz und Farbverläufen.

  • Verbesserte Druckleistung für .NET Framework-basierte und Win32-basierte Anwendungen.

  • XPS-Format als Industriestandard.

Für Druckszenarien ohne besonderen Aufwand steht eine einfache und intuitive API mit einem einzigen Einstiegspunkt für Benutzeroberfläche, Konfiguration und Auftragsübermittlung zur Verfügung. Bei komplexeren Szenarien wird eine zusätzliche Unterstützung für die Anpassung der Benutzeroberfläche (user interface, UI) (oder die Benutzeroberfläche fehlt vollständig), synchrones oder asynchrones Drucken und Funktionen zum Drucken im Batchmodus hinzugefügt. Beide Optionen bieten Druckunterstützung im vollständig oder teilweise vertrauenswürdigen Modus.

XPS wurde im Hinblick auf eine Erweiterbarkeit entwickelt. Mit dem Erweiterungsframework können XPS Features und Funktionen modular hinzugefügt werden. Zu den Erweiterungsfeatures zählen:

  • Print Schema. Das öffentliche Schema wird regelmäßig aktualisiert und ermöglicht die schnelle Erweiterung von Gerätefunktionen. (Siehe PrintTicket und PrintCapabilities weiter unten.)

  • Erweiterbare Filterpipeline. Die Filterpipeline für den XPS-Druckertreiber (XPSDrv) wurde für das direkte und skalierbare Drucken von XPS-Dokumenten konzipiert. (Weitere Informationen über "XPSDrv" finden Sie unter Windows Driver Development Kit.)

Druckpfadarchitektur

Obwohl Win32-Anwendungen und .NET Framework-Anwendungen XPS unterstützen, verwenden Win32-Anwendungen und Windows Forms-Anwendungen eine Konvertierung von GDI in XPS, um XPS-formatierte Inhalte für den XPS-Druckertreiber (XPSDrv) zu erstellen. Es ist nicht erforderlich, dass diese Anwendungen den XPS-Druckpfad verwenden. Sie können weiterhin das Erweiterte Metadatei (Enhanced Metafile, EMF)-basierte Drucken verwenden. Allerdings stehen die meisten Features und Verbesserungen von XPS nur Anwendungen zur Verfügung, die den XPS-Druckpfad nutzen.

Damit Win32-Anwendungen und Windows Forms-Anwendungen XPSDrv-basierte Drucker verwenden können, unterstützt der XPS-Druckertreiber (XPSDrv) die Konvertierung des GDI-Formats in das XPS-Format. Das XPSDrv-Modell bietet auch einen Konverter vom XPS-Format in das GDI-Format, sodass Win32-Anwendungen XPS-Dokumente drucken können. Für WPF-Anwendungen wird die Konvertierung vom XPS-Format in das GDI-Format automatisch von der Write-Methode und der WriteAsync-Methode der XpsDocumentWriter-Klasse durchgeführt, wenn die Zieldruckwarteschlange des Schreibvorgangs keinen XPSDrv-Treiber aufweist. (Windows Forms-Anwendungen können keine XPS-Dokumente drucken.)

In der folgenden Abbildung wird das Subsystem für das Drucken dargestellt. Außerdem werden die von Microsoft bereitgestellten sowie die von Hardware- und Softwareherstellern definierten Bestandteile definiert.

Das XPS-Drucksystem

Einfaches XPS-Drucken

WPF definiert eine einfache und eine erweiterte API. Für die Anwendungen, die keine umfassende Druckanpassung oder keinen Zugriff auf den kompletten XPS-Featuresatz benötigen, steht die einfache Druckunterstützung zur Verfügung. Die einfache Druckunterstützung wird durch ein Steuerelement für den Druckdialog bereitgestellt, das einen minimalen Konfigurationsaufwand erfordert und über eine bekannte Benutzeroberfläche verfügt. Viele XPS-Features sind mit diesem vereinfachten Druckmodell verfügbar.

PrintDialog

Das System.Windows.Controls.PrintDialog-Steuerelement stellt einen einzelnen Einstiegspunkt für Benutzeroberfläche, Konfiguration und XPS-Auftragsübermittlung bereit. Informationen, wie das Steuerelement instanziiert und verwendet wird, finden Sie unter Gewusst wie: Aufrufen eines Druckdialogfelds.

Erweitertes XPS-Drucken

Um auf den vollständigen Satz von XPS-Features zuzugreifen, muss die erweiterte Druck-API verwendet werden. Mehrere relevante APIs werden weiter unten ausführlich beschrieben. Eine vollständige Liste von APIs für den XPS-Druckpfad finden Sie unter dem System.Windows.Xps-Namespaceverweis und unter dem System.Printing-Namespaceverweis.

PrintTicket und PrintCapabilities

Die PrintTicket-Klasse und die PrintCapabilities-Klasse bilden die Grundlage der erweiterten XPS-Features. Bei beiden Objektarten handelt es sich um XML-formatierte Strukturen druckorientierter Features wie Sortierreihenfolge, doppelseitiges Drucken, Hefttypen usw. Diese Strukturen werden von Print Schema definiert. Mit PrintTicket wird ein Drucker angewiesen, wie ein Druckauftrag verarbeitet werden soll. Die PrintCapabilities-Klasse definiert die Fähigkeiten eines Druckers. Durch Abfragen der Druckerfähigkeiten kann ein PrintTicket erstellt werden, das die unterstützten Druckerfunktionen vollständig nutzt. Auf ähnliche Weise können nicht unterstützte Features vermieden werden.

Im folgenden Beispiel wird gezeigt, wie mithilfe von Code die PrintCapabilities eines Druckers abgefragt werden und wie ein PrintTicket erstellt wird.

// ---------------------- GetPrintTicketFromPrinter -----------------------
/// <summary>
///   Returns a PrintTicket based on the current default printer.</summary>
/// <returns>
///   A PrintTicket for the current local default printer.</returns>
private PrintTicket GetPrintTicketFromPrinter()
{
    PrintQueue printQueue = null;

    LocalPrintServer localPrintServer = new LocalPrintServer();

    // Retrieving collection of local printer on user machine
    PrintQueueCollection localPrinterCollection =
        localPrintServer.GetPrintQueues();

    System.Collections.IEnumerator localPrinterEnumerator =
        localPrinterCollection.GetEnumerator();

    if (localPrinterEnumerator.MoveNext())
    {
        // Get PrintQueue from first available printer
        printQueue = (PrintQueue)localPrinterEnumerator.Current;
    }
    else
    {
        // No printer exist, return null PrintTicket
        return null;
    }

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

    PrintCapabilities printCapabilites = printQueue.GetPrintCapabilities();

    // Modify PrintTicket
    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;
    }

    return printTicket;
}// end:GetPrintTicketFromPrinter()

Das vollständige Beispiel finden Sie unter Beispiel zum Erstellen eines XPS-Dokuments.

PrintServer und PrintQueue

Die PrintServer-Klasse stellt einen Netzwerkdruckerserver und die PrintQueue-Klasse einen Drucker und die ihm zugeordnete Ausgabewarteschlange der Aufträge dar. Mit diesen beiden APIs lässt sich eine erweiterte Verwaltung der Druckaufträge eines Servers erreichen. Mit einem PrintServer oder einer davon abgeleiteten Klasse kann eine PrintQueue verwaltet werden. Mit der AddJob-Methode wird ein neuer Druckauftrag in die Warteschlange eingefügt.

Im folgenden Beispiel wird veranschaulicht, wie mithilfe von Code ein LocalPrintServer erstellt und auf dessen Standard-PrintQueue zugegriffen wird.

// -------------------- GetPrintXpsDocumentWriter() -------------------
/// <summary>
///   Returns an XpsDocumentWriter for the default print queue.</summary>
/// <returns>
///   An XpsDocumentWriter for the default print queue.</returns>
private XpsDocumentWriter GetPrintXpsDocumentWriter()
{
    // Create a local print server
    LocalPrintServer ps = new LocalPrintServer();

    // Get the default print queue
    PrintQueue pq = ps.DefaultPrintQueue;

    // Get an XpsDocumentWriter for the default print queue
    XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq);
    return xpsdw;
}// end:GetPrintXpsDocumentWriter()

Das vollständige Beispiel finden Sie unter Drucken eines XPS-Dokuments.

XpsDocumentWriter

Mit XpsDocumentWriter, und den zugehörigen Methoden Write und WriteAsync, werden XPS-Dokumente in eine PrintQueue geschrieben. Mit der Write(FixedPage, PrintTicket)-Methode werden z. B. ein XPS-Dokument und ein PrintTicket synchron ausgegeben. Mit der WriteAsync(FixedDocument, PrintTicket)-Methode werden ein XPS-Dokument und ein PrintTicket asynchron ausgegeben.

Im folgenden Beispiel wird veranschaulicht, wie mithilfe von Code ein XpsDocumentWriter erstellt wird.

// -------------------- GetPrintXpsDocumentWriter() -------------------
/// <summary>
///   Returns an XpsDocumentWriter for the default print queue.</summary>
/// <returns>
///   An XpsDocumentWriter for the default print queue.</returns>
private XpsDocumentWriter GetPrintXpsDocumentWriter()
{
    // Create a local print server
    LocalPrintServer ps = new LocalPrintServer();

    // Get the default print queue
    PrintQueue pq = ps.DefaultPrintQueue;

    // Get an XpsDocumentWriter for the default print queue
    XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq);
    return xpsdw;
}// end:GetPrintXpsDocumentWriter()

Das vollständige Beispiel finden Sie unter Drucken eines XPS-Dokuments.

Die AddJob-Methoden bieten auch Möglichkeiten zum Drucken. Weitere Informationen finden Sie unter Gewusst wie: Programmgesteuertes Drucken von XPS-Dateien.

GDI-Druckpfad

Obwohl WPF-Anwendungen den XPS-Druckpfad direkt unterstützen, können auch Win32-Anwendungen und Windows Forms-Anwendungen einige XPS-Features nutzen. Der XPS-Druckertreiber (XPSDrv) kann XPS-basierte Ausgaben in das GDI-Format konvertieren. Für erweiterte Szenarios wird benutzerdefinierte Konvertierung des Inhalts mit dem Microsoft XPS Document Converter-Druckerescape unterstützt. Auf ähnliche Weise können WPF-Anwendungen auch Ausgaben für den GDI-Druckpfad vornehmen, indem sie die Write-Methode oder die WriteAsync-Methode der XpsDocumentWriter-Klasse aufrufen und einen Nicht-XpsDrv-Drucker als Zieldruckwarteschlange angeben.

Für Anwendungen, die keine Funktionen oder Unterstützung von XPS benötigen, bleibt der aktuelle GDI-Druckpfad unverändert.

XPSDrv-Treibermodell

Der XPS-Druckpfad verbessert die Spoolereffizienz, indem XPS als systemeigenes Druckspoolerformat beim Drucken auf einen Drucker oder Treiber, der für XPS aktiviert ist, verwendet wird. Durch die vereinfachte Übertragung der Druckaufträge muss nicht erst eine Spooldatei, z. B. eine EMF-Datendatei, generiert werden, bevor das Dokument in die Warteschlange gestellt wird. Durch eine geringere Größe der Spooldatei kann der XPS-Druckpfad den Netzwerkverkehr reduzieren und die Druckleistung verbessern.

EMF ist ein geschlossenes Format, das die Anwendungsausgabe als eine Reihe von GDI-Aufrufen für Renderingdienste darstellt. Im Gegensatz zu EMF stellt das XPS-Spoolformat das eigentliche Dokument dar, ohne dass bei der Ausgabe auf einen XPS-basierten Druckertreiber (XPSDrv) eine weitere Interpretation benötigt wird. Die Treiber können direkt mit den Daten im Format arbeiten. Durch diese Funktion werden die bei der Verwendung von EMF-Dateien und GDI-basierten Druckertreibern benötigten Daten- und Farbraumkonvertierungen vermieden.

Die Größe der Spooldateien wird im Vergleich zum EMF-Format in der Regel reduziert, wenn XPS-Dokumente für einen XPS-Druckertreiber (XPSDrv) verwendet werden. Es gibt allerdings Ausnahmen:

  • Eine Vektorgrafik, die sehr komplex ist, aus mehreren Ebenen besteht oder ineffizient geschrieben ist, kann größer sein als eine Bitmapversion derselben Grafik.

  • Aus Gründen der Bildschirmdarstellung sind in XPS-Dateien Geräteschriftarten und computerbasierte Schriftarten eingebettet. In GDI-Spooldateien sind dagegen keine Geräteschriftarten eingebettet. Beide Schriftarttypen sind aber in Teilmengen unterteilt (siehe unten), und Druckertreiber können die Geräteschriftarten vor der Übertragung der Datei zum Drucker entfernen.

Die Reduzierung der Spoolgröße erfolgt mithilfe mehrerer Mechanismen:

  • Schriftartenteilmengen. Nur Zeichen, die im aktuellen Dokument verwendet werden, werden in der XPS-Datei gespeichert.

  • Erweiterte Grafikunterstützung. Durch die direkte Unterstützung für Transparenz und Farbverlaufprimitiven wird die Rasterung des Inhalts im XPS-Dokument vermieden.

  • Identifikation gemeinsamer Ressourcen. Mehrmals verwendete Ressourcen (z. B. ein Bild, das ein Firmenlogo darstellt) werden als gemeinsam genutzte Ressourcen behandelt und nur einmal geladen.

  • ZIP-Komprimierung. Alle XPS-Dokumente verwenden die ZIP-Komprimierung.

Siehe auch

Aufgaben

Drucken eines XPS-Dokuments

Konzepte

Dokumente in Windows Presentation Foundation

Serialisierung und Speicherung von Dokumenten

Referenz

PrintDialog

XpsDocumentWriter

XpsDocument

PrintTicket

PrintCapabilities

PrintServer

PrintQueue

Microsoft XPS Document Converter-Druckerescape

Weitere Ressourcen

Gewusst-wie-Themen zum Drucken

Print Schema

XPS

Printing and Print Spooler