Imprimer des fichiers pdf dans l'ordre

chaps25 Messages postés 4 Date d'inscription jeudi 7 décembre 2000 Statut Membre Dernière intervention 22 novembre 2011 - 15 nov. 2011 à 16:01
chaps25 Messages postés 4 Date d'inscription jeudi 7 décembre 2000 Statut Membre Dernière intervention 22 novembre 2011 - 22 nov. 2011 à 15:39
bonjour,

je débute en programmation et je rencontre un problème pour l'impression de fichier.
Je suis en train de faire une application, en Visual Basic Express 2008, qui va me permettre d'imprimer des fichier pdf dans un ordre précis.
Sur le pc sur lequel je programme ça sort bien dans l'ordre mais quand je mes le programme sur un autre pc l'impression ne se fait pas dans l'ordre.

Mon pc est un peu vieux il a comme processeur une AMD 2800+ et sur lequel le programme doit être installer c'est pc neuf avec un processeur multi-coeurs (je me demande si mon problème ne viens pas de cette différence).

Pour imprimer les fichier pdf j'utilise le code suivant sur lequel je fais une boucle :

Dim proc As New Process()

With proc.StartInfo
.FileName = "c:\fichier1.pdf"
.UseShellExecute = True
.CreateNoWindow = True
.Verb = "print"
End With
proc.Start()
System.Threading.Thread.Sleep(1000)


Pour info la première ligne avec "Dim proc as New Process()" ne se trouve pas dans la boucle et mes fichier pdf non pas tous le même poids(de 10Ko à 2,7Mo).

Je voudrais savoir s'il existe un moyen de faire attendre l'impression du fichier suivant tant que le premier ne se trouve pas dans la file d'attente d'impression ou bien qu'il est commencé à être imprimé. A moins qu'il y est une autre méthode.

Merci d'avance pour vos réponse.

6 réponses

radcur Messages postés 282 Date d'inscription lundi 29 septembre 2003 Statut Membre Dernière intervention 15 août 2012 2
15 nov. 2011 à 19:04
salut

Pour imprimer les fichier pdf j'utilise le code suivant sur lequel je fais une boucle :

Dim proc As New Process()

With proc.StartInfo
.FileName = "c:\fichier1.pdf"
.UseShellExecute = True
.CreateNoWindow = True
.Verb = "print"
End With
proc.Start()
System.Threading.Thread.Sleep(1000)


peux-tu montrer le vrai code? Car si je comprend bien en ce moment, tu boucles sur fichier1.pdf
si tu veux de l'aide montre les vrais choses.

oublies la différence des PC.

regardes du côté de la méthode "WaitForExit". Ton process va attendre que l'exécutable lui signale sa fermeture.
0
Utilisateur anonyme
15 nov. 2011 à 19:15
Bonsoir,

Voici un petit code que j'ai retrouvé, commenté et adapté à ton cas :
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'thread pour éviter le freeze de ton application
        Dim Thread1 As New Threading.Thread(AddressOf Impression)
        'démarrage du thread
        Thread1.Start()
    End Sub

    Private Sub Impression()
        'collecte de tous les pdf dans un dossier (éviter les chemins en dur comme c:\)
        Dim Fichiers() As IO.FileInfo = New IO.DirectoryInfo("c:").GetFiles("*.pdf")
        'boucle sur chaque fichier
        For Each fichier As IO.FileInfo In Fichiers
            'nouveau process
            Dim proc As New Process()
            With proc.StartInfo
                .FileName = fichier.FullName
                .UseShellExecute = True
                .CreateNoWindow = True
                .Verb = "print"
            End With
            'lancement de l'impression
            proc.Start()
            'boucle d'attente de fin de process
            Do
                'avec une pause de 5 secondes pour soulager l'uc
                Threading.Thread.Sleep(5000)
                'bouclage tant que le process n'a pas terminé l'impression
            Loop Until proc.HasExited
        Next
    End Sub
End Class


Bonne prog.
0
Utilisateur anonyme
15 nov. 2011 à 23:48
A la relecture je viens de m'apercevoir qu'il te faut trier tes fichiers dans un ordre précis mais tu ne mentionne aucun critère de tri.
Voici un exemple pour trier une liste de fichiers par ordre de date de création.

Le début du code est donc à changer comme ceci :
'collecte de tous les pdf d'un dossier (éviter les chemins en dur comme c:\) et tri selon date de création
Dim Fichiers As IEnumerable(Of IO.FileSystemInfo) = (From fichier As IO.FileSystemInfo _
                                                             In New IO.DirectoryInfo("c:").GetFiles("*.pdf") _
                                                             Order By fichier.CreationTime _
                                                             Descending)

'boucle sur chaque fichier
For Each fichier As IO.FileSystemInfo In Fichiers
'reste du code inchangé .......


Bonne nuit.
0
chaps25 Messages postés 4 Date d'inscription jeudi 7 décembre 2000 Statut Membre Dernière intervention 22 novembre 2011
16 nov. 2011 à 13:50
merci pour vos réponse

désolé radcur, c'est vrai que je n'ai pas donné le vrai code car celui ci fait partie d'un programme un peu complexe qui gère en même un fichier Excel que je doit traiter et imprimer. Comme je n'arrivais pas à résoudre le problème d'impression dans l'ordre directement dans mon programme j'ai décidé de créer un autre avec juste la partie du code qui me pose problème et de travailler dessus. L'ordre est défini dans un tableau excel dont je récupère le nom des fichiers.


banana32, j'ai bien utiliser ton code mais j'ai un problème : le premier fichier s'imprime bien mais pas le deuxième. Le process attend que je ferme acrobat manuellement pour imprimer le suivant, le même problème se pose quand j'utilise le "WaitforExit". J'ai essayer le "WaitForInputIdle()" mais sa sort quand même dans le désordre. Est ce qu'il y aurait pas un moyen pour que cela se fasse automatiquement ?

j'ai oublié de vous signaler que j'utilise Acrobat reader 10.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
16 nov. 2011 à 19:13
Bonsoir,
L'ordre est défini dans un tableau excel dont je récupère le nom des fichiers.
Je ne suis pas madame soleil et ne peux donc pas deviner le format d'écriture des noms de tes fichiers pour le tri. Un peu plus de précisions merci.

Le process attend que je ferme acrobat manuellement pour imprimer le suivant
Je n'ai pas d'imprimante sur mon poste et ne peux pas tester de code mais ça ne te coûte rien d'essayer ce qui suit.

Il te faut importer System.Printing dans les propriétés du projet, onglet références.
Rajouter ces 2 lignes au début de la sub Impression :
'recherche de l'imprimante par défaut
Dim Printer As String = New System.Drawing.Printing.PrinterSettings().PrinterName
'file d'attente de l'imprimante
Dim PrintQueue As New PrintQueue(New PrintServer, Printer)

Ensuite, sur la dernière boucle, modifier la condition de sortie comme ceci :
'bouclage tant que le dispositif d'impression est occupé
Loop Until Not PrintQueue.IsProcessing
'destruction du processus
proc.Kill()


Bien entendu, tu peux changer la condition de sortie de la boucle en modifiant la propriété de PrintQueue (IsBusy, IsPaused, IsPrinting etc...) pour faire tes essais.
Si tous tes essais ne fonctionnent toujours pas, il faudra me pardonner de t'avoir fait perdre ton temps

Bonne chance
0
chaps25 Messages postés 4 Date d'inscription jeudi 7 décembre 2000 Statut Membre Dernière intervention 22 novembre 2011
22 nov. 2011 à 15:39
bonjour,

merci banana32, avec ces ligne ça marche correctement.

c'est pas une perte de temps de faire les essais et de suivre les conseils, en tant que débutant ça me permet d'apprendre de nouvelle méthode.
0
Rejoignez-nous