Fusionner plusieurs pdf par groupement.

Résolu
cs_ab44 Messages postés 79 Date d'inscription lundi 28 mars 2005 Statut Membre Dernière intervention 4 juin 2012 - 3 juin 2012 à 22:35
cs_ab44 Messages postés 79 Date d'inscription lundi 28 mars 2005 Statut Membre Dernière intervention 4 juin 2012 - 4 juin 2012 à 22:57
Bonjour le forum,
J'ai mis mon topic dans les Algos mais ça utilise des fichiers donc a déplacer si besoin.
J'aimerai faire un exécutable avec Visual basic express 2010 qui fusionne tout les pdfs avec les mêmes début de nom du fichier.
Un exemple parce que c'est pas évident à expliquer.

J'ai dans un dossier contenant:
-AB_1.pdf
-AB_2.pdf
-AB_3.pdf
-AB_4.pdf
-CD_1.pdf
-CD_2.pdf
-CD_3.pdf
-XY_1.pdf
-XY_2.pdf

Je veux avoir dans la racine un dossier /fusionner/
-AB.pdf, fusion de AB_1.pdf, AB_2.pdf, AB_3.pdf, AB_4.pdf

-CD.pdf, fusion de CD_1.pdf, CD_2.pdf, CD_3.pdf

-XY.pdf, fusion de XY_1.pdf et XY_2.pdf

Le _ (underscore) ferait la séparation.


J'ai ce qu'il me faut pour le "fusionnage" avec un "ARRAY" tel que pour exemple:

Dim cible As String
        Dim N As Integer
        Dim listedePdfs(5) As String ' Je met 5 au début mais comme ça
        Dim tt As String = ""

        Dim i As Integer

        i = 0
' Je compte le nombre de fichier dans le dossier
        For Each Fichier In Directory.GetFileSystemEntries(Chemin, "*.pdf") 
            i = i + 1
            N = i - 1
        Next
       

        i = 0
        ReDim listedePdfs(N)
'Je répète sauf que j'ajoute la liste dans (listedePdfs(i))

        For Each Fichier In Directory.GetFileSystemEntries(Chemin, "*.pdf") 
            listedePdfs(i) = Fichier
            tt = tt + listedePdfs(i) + ControlChars.CrLf
            i = i + 1
        Next
         Array.Sort(listedePdfs)
        TextBox1.Text = tt
' Cible des fichiers fusionnés. "Final" sera remplacé par une variable 
'qui donnera le nom du fichier fusionné (dans mon exemple: AB.pdf, CD.pdf,XY.pdf.)       
         cible = Chemin & "\Fusionner" & "Final.pdf" 

'Je fusionne en utilisant itextSharp
        MergePdfFiles(listedePdfs, cible, )


Comme vous le voyez il faut que "listedePdfs" soit un array en string.
Ici le code fusionne tous les Pdfs du dossier "Chemin".
Je n'arrive pas a faire l'algorithme pour faire comme mon exemple.

J'ai effectivement besoin d'un petit coup de main.

Merci à vous

5 réponses

Utilisateur anonyme
4 juin 2012 à 17:08
Bonsoir,
Je me suis amusé à te faire le boulot mais avec un code commenté pour que tu comprennes bien ce qui se passe. J'utilise une SortedList qui permet de retrouver facilement un objet grâce à sa clé.
'détermination root
Dim chemin As String = "c:"
'déclaration d'une nouvelle liste
Dim Liste As New SortedList
'énumération des fichiers pdf
For Each fichier As IO.FileInfo In New IO.DirectoryInfo(chemin).GetFiles("*.pdf").ToArray
'détermination de la clé
Dim cle_liste As String = fichier.Name.Split("_"c)(0)
'si la clé n'existe pas ...
If Not Liste.ContainsKey(cle_liste) Then
'j'ajoute la clé avec une nouvelle List(Of .. comme objet
Liste.Add(cle_liste, New List(Of String))
End If
'je me sers de la clé pour trouver l'objet List(Of auquel ajouter le nom du fichier
'note : je dois juste caster l'item (de type object) de ma liste dans le type List(Of
'       pour pouvoir y ajouter le nom du fichier
DirectCast(Liste.Item(cle_liste), List(Of String)).Add(fichier.FullName)
Next

'ensuite, pour chaque clé de ma liste ...
For Each key As String In Liste.Keys
'je crée un tableau (array) de type string et j'y met le contenu de l'objet retrouvé
'grâce a la clé (on caste ici aussi)
Dim listedepdf() As String = DirectCast(Liste.Item(key), List(Of String)).ToArray
'détermination du fichier cible en me servant du nom de la clé pour le nom du fichier
'de fusion (tu avais mis Fusion.pdf mais ça n'irait pas vu qu'il y aura plusieurs fusions)
Dim cible As String = IO.Path.Combine(chemin, "Fusionner", key.ToString & ".pdf")
'merge avec itext
mergepdfsfiles(listedepdf, cible, )
Next
4
cs_ab44 Messages postés 79 Date d'inscription lundi 28 mars 2005 Statut Membre Dernière intervention 4 juin 2012
4 juin 2012 à 19:29
Bonsoir banana32,

Tu m'as fait un truc de fou !!
Merci beaucoup. En plus super avec les commentaires, j'ai pu comprendre ton code.

Juste pour qu'il fonctionne j'ai modifié cette ligne:
Dim cible As String = IO.Path.Combine(chemin, "Fusionner", key.ToString & ".pdf")

en
Dim cible As String 
cible = chemin & "Fusionner" & key.ToString & ".pdf"

Je ne comprend pas pourquoi le combine ne fonctionne pas.


Je n'ai pas très bien compris la ligne:
fichier.Name.Split("_"c)(0)

Je sais que l'on split au caractère "_" mais "c" et "(0) servent a quoi ?

Encore merci beaucoup.
0
Utilisateur anonyme
4 juin 2012 à 19:53
De rien avec plaisir
Je ne comprend pas pourquoi le combine ne fonctionne pas.
Mystère

Je n'ai pas très bien compris la ligne
Si tu actives Option Strict dans les propriétés de ton projet, tu constateras que Split("_") sera refusé. La méthode split attend un objet de type Char en paramètre. Il s'agit donc de le lui indiquer au moyen du 'c'.
0
Utilisateur anonyme
4 juin 2012 à 19:55
Ah et le 0 sert à ne garder que l'index 0 du tableau obtenu par le split.
0

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

Posez votre question
cs_ab44 Messages postés 79 Date d'inscription lundi 28 mars 2005 Statut Membre Dernière intervention 4 juin 2012
4 juin 2012 à 22:57
Merci beaucoup banana32.

C'est super agréable d'avoir des personnes comme toi qui prenne du temps pour donné un code ultra commenté.
0
Rejoignez-nous