Übersicht über das Drucken
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-Druckpfad
GDI-Druckpfad
XPSDrv-Treibermodell
Verwandte Themen
Informationen über XPS
XPS ist ein Format für elektronische Dokumente, ein Format für Spooldateien und eine Seitenbeschreibungssprache. Ein geöffnetes Dokumentformat verwendet XML, Open Packaging Conventions (OPC) und andere Industriestandards, um plattformübergreifende Dokumente zu erstellen. XPS vereinfacht den Prozess, mit dem digitale Dokumente erstellt, freigegeben, 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 unter Gewusst wie: Programmgesteuertes Drucken von XPS-Dateien dargestellt. 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 user interface (UI) (oder die UI 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:
Druckschema. 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 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- 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 für die Konvertierung 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 den Write- und WriteAsync-Methoden 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.
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 UI 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 UI, 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 vom Druckschema 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 Function GetPrintTicketFromPrinter() As PrintTicket
Dim printQueue As PrintQueue = Nothing
Dim localPrintServer As New LocalPrintServer()
' Retrieving collection of local printer on user machine
Dim localPrinterCollection As PrintQueueCollection = localPrintServer.GetPrintQueues()
Dim localPrinterEnumerator As System.Collections.IEnumerator = localPrinterCollection.GetEnumerator()
If localPrinterEnumerator.MoveNext() Then
' Get PrintQueue from first available printer
printQueue = CType(localPrinterEnumerator.Current, PrintQueue)
Else
' No printer exist, return null PrintTicket
Return Nothing
End If
' Get default PrintTicket from printer
Dim printTicket As PrintTicket = printQueue.DefaultPrintTicket
Dim printCapabilites As PrintCapabilities = printQueue.GetPrintCapabilities()
' Modify PrintTicket
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
Return printTicket
End Function ' end:GetPrintTicketFromPrinter()
// ---------------------- 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()
// ---------------------- GetPrintTicketFromPrinter -----------------------
/// <summary>
/// Returns a PrintTicket based on the current default printer.</summary>
/// <returns>
/// A PrintTicket for the current local default printer.</returns>
PrintTicket^ GetPrintTicketFromPrinter ()
{
PrintQueue^ printQueue = nullptr;
LocalPrintServer^ localPrintServer = gcnew 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
{
return nullptr;
}
// 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()
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 gezeigt, 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 Function GetPrintXpsDocumentWriter() As XpsDocumentWriter
' Create a local print server
Dim ps As New LocalPrintServer()
' Get the default print queue
Dim pq As PrintQueue = ps.DefaultPrintQueue
' Get an XpsDocumentWriter for the default print queue
Dim xpsdw As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(pq)
Return xpsdw
End Function ' end:GetPrintXpsDocumentWriter()
// -------------------- 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()
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 Function GetPrintXpsDocumentWriter() As XpsDocumentWriter
' Create a local print server
Dim ps As New LocalPrintServer()
' Get the default print queue
Dim pq As PrintQueue = ps.DefaultPrintQueue
' Get an XpsDocumentWriter for the default print queue
Dim xpsdw As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(pq)
Return xpsdw
End Function ' end:GetPrintXpsDocumentWriter()
// -------------------- 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()
Die AddJob-Methoden bieten auch Möglichkeiten zum Drucken. Siehe Gewusst wie: Programmgesteuertes Drucken von XPS-Dateien, um ausführliche Informationen zu erhalten.
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 die 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.
- Zusätzliches Referenzmaterial über den GDI-Druckpfad und die verschiedenen XPS-Konvertierungsmöglichkeiten finden Sie unter Microsoft XPS Document Converter-Druckerescape und unter "XPSDrv" im Windows Driver Development Kit.
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
Referenz
Microsoft XPS Document Converter-Druckerescape
Konzepte
Serialisierung und Speicherung von Dokumenten