Partager via


Vue d’ensemble de l’impression

Avec Microsoft .NET Framework, les développeurs d’applications utilisant Windows Presentation Foundation (WPF) disposent d’un nouvel ensemble complet d’API d’impression et de gestion du système d’impression. Avec Windows Vista, certaines de ces améliorations du système d’impression sont également disponibles pour les développeurs qui créent des applications Windows Forms et des développeurs utilisant du code non managé. Au cœur de cette nouvelle fonctionnalité, il s’agit du nouveau format de fichier XPS (XML Paper Specification) et du chemin d’impression XPS.

Cette rubrique contient les sections suivantes.

À propos de XPS

XPS est un format de document électronique, un format de fichier depool et une langue de description de page. Il s’agit d’un format de document ouvert qui utilise XML, Open Packaging Conventions (OPC) et d’autres normes industrielles 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.

Plusieurs techniques d’impression de contenu XPS à l’aide de WPF sont illustrées par programmation dans Imprimer des fichiers XPS par programmation. Il peut vous être utile de vous reporter à ces exemples pendant l'examen du contenu de cette rubrique. (Les développeurs de code non managés doivent consulter la documentation relative à la MXDC_ESCAPE fonction. Les développeurs Windows Forms doivent utiliser l’API dans l’espace System.Drawing.Printing de noms qui ne prend pas en charge le chemin d’impression XPS complet, mais prend en charge un chemin d’impression GDI-à-XPS hybride. Voir l’architecture du chemin d’impression ci-dessous.)

Chemin d'impression XPS

Le chemin d’impression XPS (XML Paper Specification) est une nouvelle fonctionnalité Windows qui redéfinit la façon dont l’impression est gérée dans les applications Windows. Étant donné que XPS peut remplacer un langage de présentation de document (tel que RTF), un format de spouleur d’impression (tel que WMF) et un langage de description de page (tel que PCL ou Postscript) ; le nouveau chemin d’impression conserve le format XPS de la publication de l’application au traitement final dans le pilote ou le périphérique d’impression.

Le chemin d’impression XPS est basé sur le modèle de pilote d’imprimante XPS (XPSDrv), qui offre plusieurs avantages aux développeurs tels que « ce que vous voyez est ce que vous obtenez » (WYSIWYG), une prise en charge améliorée des couleurs et des performances d’impression considérablement améliorées. (Pour plus d’informations sur XPSDrv, consultez la page Documentation du Kit de pilotes Windows.)

L’opération du spouleur d’impression pour les documents XPS est essentiellement la même que dans les versions précédentes de Windows. Toutefois, il a été amélioré pour prendre en charge le chemin d’impression XPS en plus du chemin d’impression GDI existant. Le nouveau chemin d’impression utilise en mode natif un fichier de pool XPS. Bien que les pilotes d’imprimante en mode utilisateur écrits pour les versions précédentes de Windows continuent de fonctionner, un pilote d’imprimante XPS (XPSDrv) est nécessaire pour utiliser le chemin d’impression XPS.

Les avantages du chemin d’impression XPS sont significatifs et incluent :

  • Prise en charge de l’impression WYSIWYG

  • prise en charge native de profils de couleurs avancés, qui incluent 32 bits par canal (bpc), CMJN, les couleurs nommées, les encres n et prise en charge native de la transparence et des dégradés ;

  • Amélioration des performances d’impression pour les applications .NET Framework et Win32.

  • Format XPS standard du secteur.

Pour les scénarios d’impression de base, une API simple et intuitive est disponible avec un point d’entrée unique pour l’interface utilisateur, la configuration et la soumission de travaux. Pour les scénarios avancés, une prise en charge supplémentaire est ajoutée pour l’interface utilisateur, l’impression synchrone ou asynchrone et les fonctionnalités d’impression par lots. Les deux options assurent une prise en charge de l'impression en mode confiance totale ou partielle.

XPS a été conçu avec extensibilité à l’esprit. En utilisant l’infrastructure d’extensibilité, les fonctionnalités et les fonctionnalités peuvent être ajoutées à XPS de manière modulaire. Les fonctionnalités d'extensibilité sont les suivantes :

  • Schéma d'impression. Le schéma public est mis à jour régulièrement et permet l’extension rapide des fonctions des appareils. (Consultez PrintTicket et PrintCapabilities ci-dessous.)

  • Pipeline de filtres extensible. Le pipeline de filtre du pilote d’imprimante XPS (XPSDrv) a été conçu pour permettre l’impression directe et évolutive de documents XPS. Pour plus d’informations, consultez Les pilotes d’imprimante XPSDrv.

Bien que les applications Win32 et .NET Framework prennent en charge XPS, les applications Win32 et Windows Forms utilisent une conversion GDI vers XPS afin de créer du contenu mis en forme XPS pour le pilote d’imprimante XPS (XPSDrv). Ces applications ne sont pas requises pour utiliser le chemin d’impression XPS et peuvent continuer à utiliser l’impression basée sur emF (Enhanced Metafile). Toutefois, la plupart des fonctionnalités et améliorations XPS sont uniquement disponibles pour les applications qui ciblent le chemin d’impression XPS.

Pour activer l’utilisation d’imprimantes BASÉEs sur XPSDrv par les applications Win32 et Windows Forms, le pilote d’imprimante XPS (XPSDrv) prend en charge la conversion de GDI au format XPS. Le modèle XPSDrv fournit également un convertisseur pour le format XPS vers GDI afin que les applications Win32 puissent imprimer des documents XPS. Pour les applications WPF, la conversion de XPS au format GDI est effectuée automatiquement par les Write méthodes de WriteAsync la XpsDocumentWriter classe chaque fois que la file d’attente d’impression cible de l’opération d’écriture n’a pas de pilote XPSDrv. (Les applications Windows Forms ne peuvent pas imprimer des documents XPS.)

L’illustration suivante illustre le sous-système d’impression et définit les parties fournies par Microsoft, ainsi que les parties définies par les fournisseurs de logiciels et de matériel :

Screenshot shows the XPS print system.

Impression XPS de base

WPF définit à la fois une API de base et avancée. 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 est disponible. La prise en charge de base de l’impression est exposée via un contrôle de boîte de dialogue d’impression qui nécessite une configuration minimale et des fonctionnalités familières de l’interface utilisateur. De nombreuses fonctionnalités XPS sont disponibles à l’aide de ce modèle d’impression simplifié.

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 plus d'informations sur l'instanciation et l'utilisation du contrôle, consultez Appeler une boîte de dialogue d'impression.

Impression XPS avancée

Pour accéder à l’ensemble complet de fonctionnalités XPS, l’API d’impression avancée doit être utilisée. Plusieurs API pertinentes sont décrites plus en détail ci-dessous. Pour obtenir la liste complète des API de chemin d’impression XPS, consultez les références d’espace de noms et System.Printing les System.Windows.Xps références.

PrintTicket et PrintCapabilities

Les PrintTicket classes et PrintCapabilities les classes sont les bases des fonctionnalités XPS avancées. Les deux types d’objets sont des structures au format XML de caractéristiques orientées impression telles que le classement, l’impression à deux côtés, l’enregistrement, etc. Ces structures sont définies par le schéma d’impression. 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 montre comment interroger l'élément PrintCapabilities d'une imprimante et créer un PrintTicket à l'aide de code.

// ---------------------- 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()
// ---------------------- 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>
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()

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 des travaux de sortie qui lui est associée. Ensemble, ces API permettent une gestion avancée des travaux d’impression d’un serveur. Un PrintServer ou l'une de ses classes dérivées est utilisé pour gérer un PrintQueue. La méthode AddJob est utilisée pour insérer un nouveau travail d'impression dans la file d'attente.

L'exemple suivant montre comment créer un LocalPrintServer et comment accéder au PrintQueue par défaut associé avec du code.

// -------------------- 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()
' -------------------- 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()

XpsDocumentWriter

Un XpsDocumentWriter, avec ses nombreux et WriteWriteAsync méthodes, est utilisé pour écrire des documents XPS dans un PrintQueue. Par exemple, la Write(FixedPage, PrintTicket) méthode est utilisée pour générer un document XPS et PrintTicket de manière synchrone. La WriteAsync(FixedDocument, PrintTicket) méthode est utilisée pour générer un document XPS et PrintTicket de manière asynchrone.

L'exemple suivant montre comment créer un XpsDocumentWriter avec du code.

// -------------------- 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()
' -------------------- 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()

Le méthodes AddJob permettent aussi d'imprimer. Consultez Imprimer des fichiers XPS par programmation. pour plus d’informations.

Chemin d'impression GDI

Bien que les applications WPF prennent en charge en mode natif le chemin d’impression XPS, les applications Win32 et Windows Forms peuvent également tirer parti de certaines fonctionnalités XPS. Le pilote d’imprimante XPS (XPSDrv) peut convertir la sortie basée sur GDI au format XPS. Pour les scénarios avancés, la conversion personnalisée du contenu est prise en charge à l’aide du convertisseur de documents Microsoft XPS (MXDC). De même, les applications WPF peuvent également générer un résultat vers le chemin d’impression GDI en appelant l’une WriteWriteAsync des méthodes de la XpsDocumentWriter classe et en désignant une imprimante non XpsDrv comme file d’attente d’impression cible.

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é.

Modèle de pilote XPSDrv

Le chemin d’impression XPS améliore l’efficacité du spouleur à l’aide de XPS comme format de spouleur d’impression natif lors de l’impression sur une imprimante ou un pilote XPS. 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. Grâce à des tailles de fichiers plus petites, le chemin d’impression XPS peut réduire le trafic réseau et améliorer les performances d’impression.

EMF est un format fermé qui représente la sortie de l’application sous la forme d’une série d’appels dans GDI pour les services de rendu. Contrairement à EMF, le format de pool XPS représente le document réel sans nécessiter d’interprétation supplémentaire lors de la sortie d’un pilote d’imprimante XPS (XPSDrv). Les pilotes peuvent fonctionner directement sur les données dans le format concerné. Cette fonctionnalité élimine les conversions d’espace de données et d’espace de couleur requises lorsque vous utilisez des fichiers EMF et des pilotes d’impression basés sur GDI.

Les tailles de fichier de spool sont généralement réduites lorsque vous utilisez des documents XPS qui ciblent un pilote d’imprimante XPS (XPSDrv) par rapport à leurs équivalents EMF ; toutefois, il existe des exceptions :

  • Un graphique vectoriel très complexe, superposé en plusieurs couches ou mal écrit peut être plus grand qu'une version bitmap du même graphique.

  • À des fins d'affichage sur écran, les fichiers XPS incorporent des polices de périphérique, ainsi que des polices basées sur ordinateur, alors que les fichiers spool GDI n'incorporent pas de polices de périphérique. Mais les deux types de polices sont des sous-ensembles (voir ci-dessous) et les pilotes d'imprimante peuvent supprimer les polices de périphérique avant de transmettre le fichier à l'imprimante.

La réduction de la taille des fichiers spool est exécutée via plusieurs mécanismes :

  • Création de sous-ensembles de polices : Seuls les caractères utilisés dans le document réel sont stockés dans le fichier XPS.

  • Prise en charge avancée des graphiques : La prise en charge native des primitives de transparence et de dégradé évite la rastérisation du contenu dans le document XPS.

  • Identification des ressources communes : les ressources utilisées plusieurs fois (comme une image qui représente un logo d'entreprise) sont traitées comme des ressources partagées et sont chargées une seule fois.

  • Compression ZIP : Tous les documents XPS utilisent la compression ZIP.

Voir aussi