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 XPS Printer Driver (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 les pilotes d’imprimante XPSDrv.

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 et WriteAsync les Write méthodes de la XpsDocumentWriter classe convertissent 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.

Screenshot showing the XPS print system.

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 System.Windows.Controls.PrintDialog contrôle 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, PrintQueue et XpsDocumentWriter. Pour obtenir la liste complète des API de chemin d’impression XPS, consultez les espaces de noms et System.Printing les System.Windows.Xps espaces de noms.

PrintTicket et PrintCapabilities

Les PrintTicket classes et PrintCapabilities les classes 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. 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éé pour tirer pleinement parti des fonctionnalités prises en charge de l'imprimante. De la même manière, les fonctionnalités non prises en charge peuvent être évitées.

L’exemple suivant interroge l’imprimante PrintCapabilities et crée un PrintTicket code à l’aide.

/// <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 PrintServer classe représente un serveur d’impression réseau, et la PrintQueue classe 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. Un PrintServer ou l'une de ses classes dérivées est utilisé pour gérer un PrintQueue.

L’exemple suivant crée et LocalPrintServer accède au code de PrintQueueCollection l’ordinateur local.

/// <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 Write méthodes, WriteAsync est utilisé pour ajouter des documents XPS à un PrintQueue. Par exemple, la Write(FixedDocumentSequence, PrintTicket) méthode est utilisée pour ajouter de façon synchrone un document XPS avec un ticket d’impression à une file d’attente. La WriteAsync(FixedDocumentSequence, PrintTicket) méthode 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 et ajoute des XpsDocumentWriter documents XPS de manière synchrone et asynchrone à un PrintQueue code utilisant.

/// <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 Write des méthodes ou WriteAsync méthodes de la XpsDocumentWriter classe 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 les pilotes d’imprimantes MXDC (Microsoft XPS Document Converter) et XPSDrv.

Modèle de pilote XPSDrv

Le chemin d’impression XPS améliore l’efficacité du spouleur en utilisant XPS comme format de spouleur d’impression natif lors de l’impression sur 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-réinitialisation 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 en mode natif la transparence et les primitives de dégradé pour éviter la rastérisation du contenu XPS.
  • Identification des ressources courantes, telles qu’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.

Conseil

Vous pouvez également imprimer des fichiers XPS à l’aide PrintQueue.AddJob de méthodes. Pour plus d’informations, consultez Comment imprimer des fichiers XPS.

Voir aussi