Partager via


Comment : imprimer des fichiers XPS par programmation

Vous pouvez utiliser une surcharge de la AddJob méthode pour imprimer des fichiers XPS (XML Paper Specification) sans ouvrir ou PrintDialog , en principe, n’importe quelle interface utilisateur (INTERFACE utilisateur) du tout.

Vous pouvez également imprimer des fichiers XPS à l’aide des nombreuses XpsDocumentWriter.Write méthodes.XpsDocumentWriter.WriteAsync Pour plus d’informations, consultez Impression d’un document XPS.

Une autre façon d’imprimer XPS consiste à utiliser les méthodes ou PrintDialog.PrintVisual les PrintDialog.PrintDocument méthodes. Consultez l’article Appeler une boîte de dialogue Imprimer.

Exemple

Les principales étapes d’utilisation de la méthode à trois paramètres AddJob(String, String, Boolean) sont les suivantes. L’exemple ci-dessous donne des détails.

  1. Déterminez si l’imprimante est une imprimante XPSDrv. Pour plus d’informations sur XPSDrv, consultez Vue d’ensemble de l’impression.

  2. Si l’imprimante n’est pas une imprimante XPSDrv, définissez l’état de cloisonnement du thread sur Thread unique.

  3. Instanciez un serveur d’impression et un objet de file d’attente à l’impression.

  4. Appelez la méthode, en spécifiant un nom de travail, le fichier à imprimer et un Boolean indicateur indiquant si l’imprimante est une imprimante XPSDrv.

L’exemple ci-dessous montre comment imprimer par lots tous les fichiers XPS dans un répertoire. Bien que l’application invite l’utilisateur à spécifier le répertoire, la méthode à trois paramètres AddJob(String, String, Boolean) ne nécessite pas d’interface utilisateur (UI). Il peut être utilisé dans n’importe quel chemin de code où vous disposez d’un nom de fichier XPS et d’un chemin que vous pouvez lui transmettre.

La surcharge à trois paramètres AddJob(String, String, Boolean) de AddJob doit s’exécuter dans un seul appartement de threads chaque fois que le Boolean paramètre est false, ce qui doit être lorsqu’une imprimante non-XPSDrv est utilisée. Toutefois, l’état d’appartement par défaut pour .NET est de plusieurs threads. Cette valeur par défaut doit être modifiée puisque l’exemple utilise une imprimante non-XPSDrv.

Il existe deux moyens de modifier la valeur par défaut. Une façon consiste simplement à ajouter le STAThreadAttribute (autrement dit, «[System.STAThreadAttribute()] ») juste au-dessus de la première ligne de la méthode de Main l’application (généralement «static void Main(string[] args) »). Toutefois, de nombreuses applications nécessitent que la méthode ait un état d’appartement multithread. Il existe donc une deuxième méthode : placer l’appel dans AddJob(String, String, Boolean) un thread distinct dont l’état Main d’appartement est défini STA avec SetApartmentState. L’exemple suivant utilise cette deuxième technique.

En conséquence, l’exemple commence par instancier un Thread objet et lui transmettre une méthode PrintXPS en tant que ThreadStart paramètre. (Le La méthode PrintXPS est définie plus loin dans l’exemple.) Ensuite, le thread est défini sur un seul appartement de threads. Le seul code restant de la méthode Main démarre le nouveau thread.

L’exemple se base principalement sur la méthode staticBatchXPSPrinter.PrintXPS. Après avoir créé un serveur d’impression et une file d’attente, la méthode invite l’utilisateur à entrer un répertoire contenant des fichiers XPS. Après avoir vérifié que le répertoire existe bien et qu’il contient les fichiers *.xps, la méthode ajoute chacun de ces fichiers à la file d’attente à l’impression. L’exemple suppose que l’imprimante n’est pas XPSDrv. Nous transmettons false donc le dernier paramètre de AddJob(String, String, Boolean) méthode. Pour cette raison, la méthode valide le balisage XPS dans le fichier avant de tenter de le convertir en langue de description de page de l’imprimante. Si la validation échoue, une exception est générée. L’exemple de code intercepte l’exception, notifie l’utilisateur, puis traite le fichier XPS suivant.

class Program
{
    [System.MTAThreadAttribute()] // Added for clarity, but this line is redundant because MTA is the default.
    static void Main(string[] args)
    {
        // Create the secondary thread and pass the printing method for
        // the constructor's ThreadStart delegate parameter. The BatchXPSPrinter
        // class is defined below.
        Thread printingThread = new Thread(BatchXPSPrinter.PrintXPS);

        // Set the thread that will use PrintQueue.AddJob to single threading.
        printingThread.SetApartmentState(ApartmentState.STA);

        // Start the printing thread. The method passed to the Thread
        // constructor will execute.
        printingThread.Start();
    }//end Main
}//end Program class

public class BatchXPSPrinter
{
    public static void PrintXPS()
    {
        // Create print server and print queue.
        LocalPrintServer localPrintServer = new LocalPrintServer();
        PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue();

        // Prompt user to identify the directory, and then create the directory object.
        Console.Write("Enter the directory containing the XPS files: ");
        String directoryPath = Console.ReadLine();
        DirectoryInfo dir = new DirectoryInfo(directoryPath);

        // If the user mistyped, end the thread and return to the Main thread.
        if (!dir.Exists)
        {
            Console.WriteLine("There is no such directory.");
        }
        else
        {
            // If there are no XPS files in the directory, end the thread
            // and return to the Main thread.
            if (dir.GetFiles("*.xps").Length == 0)
            {
                Console.WriteLine("There are no XPS files in the directory.");
            }
            else
            {
                Console.WriteLine("\nJobs will now be added to the print queue.");
                Console.WriteLine("If the queue is not paused and the printer is working, jobs will begin printing.");

                // Batch process all XPS files in the directory.
                foreach (FileInfo f in dir.GetFiles("*.xps"))
                {
                    String nextFile = directoryPath + "\\" + f.Name;
                    Console.WriteLine("Adding {0} to queue.", nextFile);

                    try
                    {
                        // Print the Xps file while providing XPS validation and progress notifications.
                        PrintSystemJobInfo xpsPrintJob = defaultPrintQueue.AddJob(f.Name, nextFile, false);
                    }
                    catch (PrintJobException e)
                    {
                        Console.WriteLine("\n\t{0} could not be added to the print queue.", f.Name);
                        if (e.InnerException.Message == "File contains corrupted data.")
                        {
                            Console.WriteLine("\tIt is not a valid XPS file. Use the isXPS Conformance Tool to debug it.");
                        }
                        Console.WriteLine("\tContinuing with next XPS file.\n");
                    }
                }// end for each XPS file
            }//end if there are no XPS files in the directory
        }//end if the directory does not exist

        Console.WriteLine("Press Enter to end program.");
        Console.ReadLine();
    }// end PrintXPS method
}// end BatchXPSPrinter class
Friend Class Program
    <System.MTAThreadAttribute()>
    Shared Sub Main(ByVal args() As String) ' Added for clarity, but this line is redundant because MTA is the default.
        ' Create the secondary thread and pass the printing method for 
        ' the constructor's ThreadStart delegate parameter. The BatchXPSPrinter
        ' class is defined below.
        Dim printingThread As New Thread(AddressOf BatchXPSPrinter.PrintXPS)

        ' Set the thread that will use PrintQueue.AddJob to single threading.
        printingThread.SetApartmentState(ApartmentState.STA)

        ' Start the printing thread. The method passed to the Thread 
        ' constructor will execute.
        printingThread.Start()

    End Sub

End Class

Public Class BatchXPSPrinter
    Public Shared Sub PrintXPS()
        ' Create print server and print queue.
        Dim localPrintServer As New LocalPrintServer()
        Dim defaultPrintQueue As PrintQueue = LocalPrintServer.GetDefaultPrintQueue()

        ' Prompt user to identify the directory, and then create the directory object.
        Console.Write("Enter the directory containing the XPS files: ")
        Dim directoryPath As String = Console.ReadLine()
        Dim dir As New DirectoryInfo(directoryPath)

        ' If the user mistyped, end the thread and return to the Main thread.
        If Not dir.Exists Then
            Console.WriteLine("There is no such directory.")
        Else
            ' If there are no XPS files in the directory, end the thread 
            ' and return to the Main thread.
            If dir.GetFiles("*.xps").Length = 0 Then
                Console.WriteLine("There are no XPS files in the directory.")
            Else
                Console.WriteLine(vbLf & "Jobs will now be added to the print queue.")
                Console.WriteLine("If the queue is not paused and the printer is working, jobs will begin printing.")

                ' Batch process all XPS files in the directory.
                For Each f As FileInfo In dir.GetFiles("*.xps")
                    Dim nextFile As String = directoryPath & "\" & f.Name
                    Console.WriteLine("Adding {0} to queue.", nextFile)

                    Try
                        ' Print the Xps file while providing XPS validation and progress notifications.
                        Dim xpsPrintJob As PrintSystemJobInfo = defaultPrintQueue.AddJob(f.Name, nextFile, False)
                    Catch e As PrintJobException
                        Console.WriteLine(vbLf & vbTab & "{0} could not be added to the print queue.", f.Name)
                        If e.InnerException.Message = "File contains corrupted data." Then
                            Console.WriteLine(vbTab & "It is not a valid XPS file. Use the isXPS Conformance Tool to debug it.")
                        End If
                        Console.WriteLine(vbTab & "Continuing with next XPS file." & vbLf)
                    End Try

                Next f ' end for each XPS file

            End If 'end if there are no XPS files in the directory

        End If 'end if the directory does not exist

        Console.WriteLine("Press Enter to end program.")
        Console.ReadLine()

    End Sub

End Class

Si vous utilisez une imprimante XPSDrv, vous pouvez définir le paramètre final sur true. Dans ce cas, étant donné que XPS est la langue de description de page de l’imprimante, la méthode envoie le fichier à l’imprimante sans la valider ni la convertir en autre langue de description de page. Si vous ne savez pas au moment du design si l’application utilise une imprimante XPSDrv, vous pouvez modifier l’application pour qu’elle lise la propriété et la IsXpsDevice branche en fonction de ce qu’elle trouve.

Étant donné qu’il y aura initialement quelques imprimantes XPSDrv disponibles immédiatement après la publication de Windows Vista et de Microsoft .NET Framework, vous devrez peut-être déguiser une imprimante non XPSDrv en tant qu’imprimante XPSDrv. Pour ce faire, ajoutez le fichier Pipelineconfig.xml à la liste des fichiers dans la clé de Registre suivante de l’ordinateur qui exécute votre application :

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Environments\Windows NT x86\Drivers\Version-3\<PseudoXPSPrinter>\DependentFiles

<PseudoXPSPrinter> est une file d’attente d’impression. L’ordinateur doit ensuite être redémarré.

Ce déguisement true vous permet de passer comme paramètre final de AddJob(String, String, Boolean) sans provoquer d’exception, mais étant donné que <PseudoXPSPrinter> n’est pas vraiment une imprimante XPSDrv, seule la mémoire est imprimée.

Remarque

Par souci de simplicité, l’exemple ci-dessus utilise la présence d’une extension *.xps comme test qu’un fichier est XPS. Toutefois, les fichiers XPS n’ont pas besoin de cette extension. L’outil isXPS.exe (isXPS Conformance Tool) est un moyen de tester un fichier pour la validité XPS.

Voir aussi