Vue d’ensemble de l’impression de documents (WPF .NET)
Avec Microsoft .NET, les développeurs d’applications utilisant Windows Presentation Foundation (WPF) disposent d’un ensemble complet d’API d’impression et de gestion du système d’impression. Le cœur de cette fonctionnalité est le format de fichier XPS (XML Paper Specification) et le chemin d’impression XPS.
À propos de XPS
XPS est un format de document électronique, un format de fichier de pool et une langue de description de page. Il s’agit d’un format de document ouvert qui utilise XML, Open Packaging Conventions et d’autres normes du secteur pour créer des documents multiplateformes. XPS simplifie le processus par lequel les documents numériques sont créés, partagés, imprimés, affichés et archivés. Pour plus d’informations sur XPS, consultez Documents XPS.
Chemin d’impression XPS
Le chemin d’impression XPS est une fonctionnalité Windows qui redéfinit la façon dont l’impression est gérée dans les applications Windows. Le chemin d’impression XPS peut remplacer :
- Langages de présentation de documents, tels que le format de texte enrichi ou le format de document portable.
- Imprimer des formats de spouleur, tels que le métafichier Windows ou le métafichier amélioré (EMF).
- Langues de description de page, telles que le langage de commande de l’imprimante ou PostScript.
Par conséquent, le chemin d’impression XPS conserve le format XPS de la publication de l’application jusqu’au traitement final dans le pilote ou le périphérique de l’imprimante.
Le spouleur d’impression pour les documents XPS prend en charge le chemin d’impression XPS et le chemin d’impression GDI. Le chemin d’impression XPS consomme en mode natif un fichier de pool XPS et nécessite un pilote d’imprimante XPS. Le chemin d’impression XPS est basé sur le modèle de pilote d'imprimante XPS (XPSDrv).
Les avantages du chemin d’impression XPS sont les suivants :
- Prise en charge de l’impression WYSIWYG.
- Prise en charge native des profils de couleurs avancés, tels que 32 bits par canal, le modèle de couleur CMYK, les couleurs nommées, les n-encres et les transparences et dégradés.
- Amélioration des performances d’impression : les fonctionnalités XPS et les améliorations sont uniquement disponibles pour les applications qui ciblent le chemin d’impression XPS.
- Format XPS standard du secteur.
Pour les scénarios d’impression de base, une API simple et intuitive est disponible avec une interface utilisateur standard pour la configuration d’impression et l’envoi de travaux. Pour les scénarios avancés, l’API prend en charge la personnalisation de l’interface utilisateur ou aucune interface utilisateur du tout, l’impression synchrone ou asynchrone et les fonctionnalités d’impression par lots. Les options simples et avancées offrent une prise en charge de l’impression en mode confiance complète ou partielle.
XPS a été conçu avec extensibilité à l’esprit, de sorte que les fonctionnalités et fonctionnalités peuvent être ajoutées à XPS de manière modulaire. Les fonctionnalités d’extensibilité sont les suivantes :
- Schéma d’impression qui prend en charge l’extension rapide des fonctionnalités d’appareil. La partie publique du schéma est régulièrement mise à jour pour ajouter des fonctionnalités d’appareil souhaitées. Pour plus d’informations, consultez architecture extensible.
- Pipeline de filtre extensible que les pilotes XPSDrv utilisent pour prendre en charge l’impression directe et évolutive de documents XPS. Pour plus d’informations, consultez pilotes d’imprimante XPSDrv.
Architecture du chemin d’impression
Les applications WPF prennent en charge en mode natif le chemin d’impression XPS et peuvent utiliser les API d’impression XPS pour imprimer directement dans le pilote XPSDrv. Si la file d’attente d’impression cible de l’opération d’écriture n’a pas de pilote XPSDrv, les méthodes Write et WriteAsync de la classe XpsDocumentWriter convertit automatiquement le contenu du format XPS au format GDI pour le chemin d’impression GDI.
L’illustration suivante montre le sous-système d’impression et définit les parties fournies par Microsoft et les fournisseurs de logiciels et de matériel indépendants.
Impression XPS de base
WPF dispose d’une API d’impression qui prend en charge les fonctionnalités d’impression de base et avancées. Pour les applications qui n’ont pas besoin d’une personnalisation d’impression complète ou d’un accès à l’ensemble complet de fonctionnalités XPS, la prise en charge de base de l’impression peut suffire. La prise en charge de base de l’impression est fournie via un contrôle PrintDialog qui nécessite une configuration minimale, possède une interface utilisateur familière et prend en charge de nombreuses fonctionnalités XPS.
PrintDialog
Le contrôle System.Windows.Controls.PrintDialog fournit un point d’entrée unique pour l’interface utilisateur, la configuration et l’envoi de travaux XPS. Pour savoir comment instancier et utiliser le contrôle, consultez Comment afficher une boîte de dialogue d’impression.
Impression XPS avancée
Pour accéder à l’ensemble complet de fonctionnalités XPS, utilisez l’API d’impression avancée. Plusieurs API pertinentes sont décrites dans cette section, notamment PrintTicket, PrintCapabilities, PrintServer, PrintQueueet XpsDocumentWriter. Pour obtenir la liste complète des API de chemin d’impression XPS, consultez les espaces de noms System.Windows.Xps et System.Printing.
PrintTicket et PrintCapabilities
Les classes PrintTicket et PrintCapabilities sont les bases des fonctionnalités XPS avancées. Les deux objets contiennent des structures au format XML de caractéristiques orientées impression définies par le schéma d’impression. Les fonctionnalités incluent le recto verso, le classement, l’impression à deux côtés et l’agrafage. Une PrintTicket
indique à une imprimante comment traiter un travail d’impression. La classe PrintCapabilities
définit les fonctionnalités d’une imprimante. En interrogeant les fonctionnalités d’une imprimante, un PrintTicket
peut être créé qui tire pleinement parti des fonctionnalités prises en charge d’une imprimante. De même, les fonctionnalités non prises en charge peuvent être évitées.
L’exemple suivant interroge la PrintCapabilities
d’une imprimante et crée un PrintTicket
à l’aide de 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 et PrintQueue
La classe PrintServer représente un serveur d’impression réseau, et la classe PrintQueue représente une imprimante et la file d’attente de travaux de sortie associée. Ensemble, ces API prennent en charge la gestion avancée des travaux d’impression pour un serveur. Une PrintServer
, ou l’une de ses classes dérivées, est utilisée pour gérer un PrintQueue
.
L’exemple suivant crée une LocalPrintServer et accède aux PrintQueueCollection de l’ordinateur local à l’aide du code.
/// <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, avec ses nombreuses méthodes Write et WriteAsync, est utilisée pour ajouter des documents XPS à un PrintQueue. Par exemple, la méthode Write(FixedDocumentSequence, PrintTicket) est utilisée pour ajouter de façon synchrone un document XPS avec un ticket d’impression à une file d’attente. La méthode WriteAsync(FixedDocumentSequence, PrintTicket) est utilisée pour ajouter de façon asynchrone un document XPS avec un ticket d’impression à une file d’attente.
L’exemple suivant crée un XpsDocumentWriter
et ajoute des documents XPS de manière synchrone et asynchrone à un PrintQueue
à l’aide de code.
/// <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
Chemin d’impression GDI
Bien que les applications WPF prennent en charge en mode natif le chemin d’impression XPS, elles peuvent également générer le chemin d’impression GDI en appelant l’une des méthodes Write ou WriteAsync de la classe XpsDocumentWriter et en sélectionnant la file d’attente d’impression pour une imprimante non XpsDrv.
Pour les applications qui ne nécessitent pas de fonctionnalités XPS ni de prise en charge, le chemin d’impression GDI actuel reste inchangé. Pour plus d’informations sur le chemin d’impression GDI et les différentes options de conversion XPS, consultez convertisseur de documents Microsoft XPS (MXDC) et pilotes d’imprimante XPSDrv.
Modèle de pilote XPSDrv
Le chemin d’impression XPS améliore l’efficacité du spouleur en utilisant XPS comme format de spouleur natif lors de l’impression avec une imprimante ou un pilote compatible XPS. Contrairement à EMF, qui représente la sortie de l’application sous la forme d’une série d’appels dans GDI pour les services de rendu, le format de spouleur XPS représente le document. Par conséquent, lorsque les fichiers de spoulage XPS sont générés vers un pilote d’imprimante XPS, ils ne nécessitent pas d’interprétation supplémentaire lorsque les pilotes fonctionnent directement sur les données dans ce format. Cette fonctionnalité élimine les conversions d’espace de données et d’espace de couleur requises pour les fichiers EMF et les pilotes d’impression basés sur GDI.
Le processus de spoulage simplifié élimine la nécessité de générer un fichier de pool intermédiaire, tel qu’un fichier de données EMF, avant que le document ne soit mis en pool. Avec des tailles de fichier de pool plus petites, le chemin d’impression XPS peut réduire le trafic réseau et améliorer les performances d’impression. Par rapport à leurs équivalents EMF, les tailles de fichier du pool XPS sont généralement réduites lors de l’utilisation du chemin d’impression XPS. La réduction de la taille des fichiers de spool est effectuée à l’aide de plusieurs mécanismes :
- Sous-ensemble de police, qui stocke uniquement les caractères utilisés dans un document dans le fichier XPS.
- Prise en charge avancée des graphiques , qui prend en charge nativement la transparence et les primitives de dégradé pour éviter la rastérisation du contenu XPS.
- Identification des ressources courantes, comme une image d’un logo d’entreprise utilisé plusieurs fois dans un document. Les ressources courantes sont traitées comme des ressources partagées et ne sont chargées qu’une seule fois.
- compression ZIP, qui est utilisée sur tous les documents XPS.
La taille de fichier du pool XPS peut ne pas être réduite si un graphique vectoriel est très complexe, multicouche ou écrit de manière inefficace. Contrairement aux fichiers de pool GDI, les fichiers XPS incorporent des polices d’appareil et des polices basées sur l’ordinateur à des fins d’affichage d’écran, bien que les deux types de polices soient sous-ensemble et que les pilotes d’imprimante puissent supprimer les polices d’appareil avant de transmettre le fichier à l’imprimante.
Pourboire
Vous pouvez également imprimer des fichiers XPS à l’aide de méthodes PrintQueue.AddJob. Pour plus d’informations, consultez Comment imprimer des fichiers XPS.
Voir aussi
.NET Desktop feedback