Fusionner plusieurs pdf par groupement. [Résolu]

Messages postés
79
Date d'inscription
lundi 28 mars 2005
Dernière intervention
4 juin 2012
- 3 juin 2012 à 22:35 - Dernière réponse :
Messages postés
79
Date d'inscription
lundi 28 mars 2005
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
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
- 4 juin 2012 à 17:08
3
Merci
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

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
Messages postés
79
Date d'inscription
lundi 28 mars 2005
Dernière intervention
4 juin 2012
- 4 juin 2012 à 19:29
0
Merci
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.
Commenter la réponse de cs_ab44
- 4 juin 2012 à 19:53
0
Merci
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'.
Commenter la réponse de Utilisateur anonyme
- 4 juin 2012 à 19:55
0
Merci
Ah et le 0 sert à ne garder que l'index 0 du tableau obtenu par le split.
Commenter la réponse de Utilisateur anonyme
Messages postés
79
Date d'inscription
lundi 28 mars 2005
Dernière intervention
4 juin 2012
- 4 juin 2012 à 22:57
0
Merci
Merci beaucoup banana32.

C'est super agréable d'avoir des personnes comme toi qui prenne du temps pour donné un code ultra commenté.
Commenter la réponse de cs_ab44

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.