IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Manipulation de fichier PDF


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 137
    Points : 69
    Points
    69
    Par défaut Manipulation de fichier PDF
    Bonjour,

    Je développe actuellement un progiciel pour l'entreprise dans laquel je travaille.
    Dans l'objectif de remplir des formulaires PDF (préalablement contenu dans un fichier ZIP), a l'aide de la dll iTextSharp je peux écrire sans problème sans dans mon fichier PDF. Je doit ensuite nommé le fichier avec son numéro de série, et l'entreprise pour laquelle est destiné ce fichier PDF, sachant que je récupère le nom de l'entreprise dans le fichier PDF qui doit se remplir. De plus, il y a dans la très grande majorité des cas, plusieurs fichier PDF a remplir dans le fichier zip.

    Voila le code que j'emploie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            'Bouton qui va récuperer le chemin du fichier ZIP'
            Dim res As DialogResult
            res = OpenFileDialog1.ShowDialog()
            If res = Windows.Forms.DialogResult.OK Then
                txtPath.Text = OpenFileDialog1.FileName
            End If
        End Sub
     
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            'Bouton qui va lancer la procédure pour completer les fichier PDF'
            Dim GeneralName As String 'GeneralName corespond au numéro de série du dossier'
            GeneralName = System.IO.Path.GetFileName(Replace(txtPath.Text, ".zip", ""))
     
            ExtractPath = Replace(txtPath.Text, ".zip", "\ ") 'Chemin d extraction, extrait dans un dossier ou le nom est le numéro de série'
            ExtractArchive(txtPath.Text, ExtractPath)
            'Nettoyage de 2 fichiers extrait'
            System.IO.File.Delete(ExtractPath & "notice.pdf")
            System.IO.File.Delete(ExtractPath & System.IO.Path.GetFileName(Replace(txtPath.Text, ".zip", "") & "_description.zip"))
     
            Dim strFileSize As String = ""
            Dim di As New IO.DirectoryInfo(ExtractPath)
            Dim aryFi As IO.FileInfo() = di.GetFiles("*.pdf")
            Dim fi As IO.FileInfo
            Dim Entreprise As String
            Dim NomFinal As String
     
            'Pour tous les fichiers présent dans le dossier d extraction et qui doivent etre remplie'
            For Each fi In aryFi
                'Validation du fichier'
                If fi.Name <> System.IO.Path.GetFileName(Replace(txtPath.Text, ".zip", "")) & "_resume.pdf" And fi.Name <> System.IO.Path.GetFileName(Replace(txtPath.Text, ".zip", "")) & "_emprise.pdf" Then
                    'Recuperation du nom de l entreprise'
                    Entreprise = GetEntreprise(fi.FullName)
                    'Formatage du nom du futur fichier'
                    NomFinal = Replace(fi.FullName, fi.Name, "")
                    NomFinal = GeneralName & "_" & Entreprise & ".pdf"
                    'Appel de la procédure qui complete le fichier PDF'
                    FillForm(fi.FullName, NomFinal)
                End If
            Next
     
        End Sub
     
        Private Function GetEntreprise(ByVal Fichier As String)
            Dim Ent As String
            Dim pdfTemplate As String = Fichier
            Dim pdfReader As New PdfReader(pdfTemplate)
            'La fermeture du reader a été ajouté, si cette ligne n est pas présente, la ligne suivante refuse de s executer avec le message d erreur suivant :
            "Le processus ne peut pas accéder au fichier, car il est en cours d utilisation par un autre processus."'
            pdfReader.Close()
            Dim pdfStamper As New PdfStamper(pdfReader, New FileStream( _
            Fichier, FileMode.Open))
            Dim pdfFormFields As AcroFields = pdfStamper.AcroFields
            Ent = pdfFormFields.GetField("Exploitant")
            Try
                pdfStamper.FormFlattening = True
                pdfStamper.Reader.Close()
                'Les deux lignes suivantes refuse de s executer avec le message d erreur :
                "Impossible d accéder à un fichier fermé."'       
                pdfStamper.Dispose()
                pdfStamper.close()
            Catch ex As Exception
     
            End Try
            pdfReader.Close()
            Return Ent
        End Function
     
     
        Private Sub FillForm(ByVal PDFPath As String, ByVal NewPDFPath As String)
            'Ligne qui plante systématiquement avec le message d erreur :
            "Le processus ne peut pas accéder au fichier, car il est en cours d utilisation par un autre processus."'
            Dim pdfReader As New PdfReader(PDFPath)
            Dim pdfStamper As New PdfStamper(pdfReader, New FileStream( _
                System.IO.Path.GetFileName(NewPDFPath), FileMode.Create))
            Dim pdfFormFields As AcroFields = pdfStamper.AcroFields
     
            pdfFormFields.SetField("N° affaire executant", txtNumAff.Text)
            [...]
            pdfFormFields.SetField("NombrePJ_DICT", txtNbPJ.Text)
     
            pdfStamper.FormFlattening = True
            pdfStamper.Close()
            pdfReader.Close()
     
            My.Computer.FileSystem.CopyFile(PDFPath, NewPDFPath)
            My.Computer.FileSystem.DeleteFile(PDFPath)
        End Sub
     
        Public Sub ExtractArchive(ByVal zipFilename As String, ByVal ExtractDir As String)
            'Procédure d extraction'
            Dim Redo As Integer = 1
            Dim MyZipInputStream As ZipInputStream
            Dim MyFileStream As FileStream
            MyZipInputStream = New ZipInputStream(New FileStream(zipFilename, FileMode.Open, FileAccess.Read))
            Dim MyZipEntry As ZipEntry = MyZipInputStream.GetNextEntry
            Directory.CreateDirectory(ExtractDir)
            While Not MyZipEntry Is Nothing
                If (MyZipEntry.IsDirectory) Then
                    Directory.CreateDirectory(ExtractDir & "\" & MyZipEntry.Name)
                Else
                    If Not Directory.Exists(ExtractDir & "\" & _
                    Path.GetDirectoryName(MyZipEntry.Name)) Then
                        Directory.CreateDirectory(ExtractDir & "\" & _
                        Path.GetDirectoryName(MyZipEntry.Name))
                    End If
                    MyFileStream = New FileStream(ExtractDir & "\" & _
                      MyZipEntry.Name, FileMode.OpenOrCreate, FileAccess.Write)
                    Dim count As Integer
                    Dim buffer(4096) As Byte
                    count = MyZipInputStream.Read(buffer, 0, 4096)
                    While count > 0
                        MyFileStream.Write(buffer, 0, count)
                        count = MyZipInputStream.Read(buffer, 0, 4096)
                    End While
                    MyFileStream.Close()
                End If
                Try
                    MyZipEntry = MyZipInputStream.GetNextEntry
                Catch ex As Exception
                    MyZipEntry = Nothing
                End Try
            End While
            If Not (MyZipInputStream Is Nothing) Then MyZipInputStream.Close()
            If Not (MyFileStream Is Nothing) Then MyFileStream.Close()
        End Sub
    Comme noté dans les commentaires, certaines ligne bug. J'ai essayer d'arranger certaines choses avec des .close et autres .dispose, malheureusement je me trouve coincé a tous les coups, a cause de l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Le processus ne peut pas accéder au fichier, car il est en cours d utilisation par un autre processus.
    Si je commente l'appel de la procédure GetEntreprise(), je n'obtiens pas d'erreur. J'en ai déduit que le probleme se situais a la fin de la procédure GetEntreprise, au moment de fermer l'acces au fichier. Ça plante car je suis obliger (du moin, je crois) d'effectué ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Private Function GetEntreprise(ByVal Fichier As String)
            Dim Ent As String
            Dim pdfTemplate As String = Fichier
            Dim pdfReader As New PdfReader(pdfTemplate)
            'La fermeture du reader a été ajouté, si cette ligne n est pas présente, la ligne suivante refuse de s executer avec le message d erreur suivant :
            "Le processus ne peut pas accéder au fichier, car il est en cours d utilisation par un autre processus."'
            pdfReader.Close()
            Dim pdfStamper As New PdfStamper(pdfReader, New FileStream( _
            Fichier, FileMode.Open))
    Et comme je ferme (trop) tot ce fichier, je ne peux plus le fermer apres, et malgré cette fermeture, il y a toujours un accès de mon application au fichier. Ce qui m’empêche d'effectuer une quelquonque opération apres cela, a cause de justement du souci du processus qui est deja attaché au fichier.

    Je m'en remet a vous, je suis un peu a court d'idée !

    D'avance merci a tous !

  2. #2
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Peut-être commencer par mettre un try catch dans la fonction suspecte ???

    Sinon ceci me semble bizarre, un close sur l'objet qui est utiliser comme paramètre dans un constructeur juste la ligne après ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
             .....
            pdfReader.Close()
            Dim pdfStamper As New PdfStamper(pdfReader, New FileStream( _
            Fichier, FileMode.Open))
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 137
    Points : 69
    Points
    69
    Par défaut
    Peut-être commencer par mettre un try catch dans la fonction suspecte ???
    Le souci est que si je mets le try catch autour de ce qui peux potentiellement bugger ne DOIT pas bugger, puisque c'est la ligne qui relache l'acces au fichier. Et que si cette ligne plante, la suite de la fonction est systematiquement en erreur.

    Sinon ceci me semble bizarre, un close sur l'objet qui est utiliser comme paramètre dans un constructeur juste la ligne après ?
    Eh bien, cela me paraissait bizare a moi aussi, j'ai récuperer une fonction sur internet qui ne fonctionnais pas, la ligne d'erreur etait la declaration qui suit le .close, sans ce .close, la déclaration affichais l'erreur comme quoi le fichier etait deja utiliser par un autre processus.

  4. #4
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Eh bien, cela me paraissait bizare a moi aussi, j'ai récuperer une fonction sur internet qui ne fonctionnais pas, la ligne d'erreur etait la declaration qui suit le .close, sans ce .close, la déclaration affichais l'erreur comme quoi le fichier etait deja utiliser par un autre processus.
    J'ai pas testé le code, mais à la lecture cela me semblait bizarre d’où mon interrogation ;-)

    Sinon pour le try catch même si logiquement cela ne doit pas bugger cela ne coute rien de le mettre.
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 137
    Points : 69
    Points
    69
    Par défaut
    Sinon pour le try catch même si logiquement cela ne doit pas bugger cela ne coute rien de le mettre.
    Justement si ! Ca me coute la validité de ma fonction, puisque si le .close ne fonctionne pas, les fonction suivante ne sont plus valide, et plantent systématiquement, c'est pour cela que je ne peux m'en passer, toute les lignes doivent être exécuté correctement et spécialement les lignes qui libère le fichier du processus.

  6. #6
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    On est bien d'accord. Mais justement si ta fonction se retrouve invalide dans le cas d'une erreur notamment si le close plante, cela te permettrait d'afficher un message d'erreur explicite (qui dans ton cas pourrait peut-être t'aider) et ensuite d'empêcher la suite de l'exécution du programme vu que si ta fonction a planter, logiquement les suivantes qui en dépendent ne devraient pas s'exécutées.
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 137
    Points : 69
    Points
    69
    Par défaut
    Bon ... Probleme résolu, merci de t'etre penché sur mon souci.
    Je n'ai pas tout compris de la résolution, mais a force d'essayer, de changer, ca a finit par fonctionner !

    Le code pour ceux qui serais eventuellement interesser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
     
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim GeneralName As String
            GeneralName = System.IO.Path.GetFileName(Replace(txtPath.Text, ".zip", ""))
     
            ExtractPath = Replace(txtPath.Text, ".zip", "\")
            ExtractArchive(txtPath.Text, ExtractPath)
            System.IO.File.Delete(ExtractPath & "notice.pdf")
            System.IO.File.Delete(ExtractPath & System.IO.Path.GetFileName(Replace(txtPath.Text, ".zip", "") & "_description.zip"))
     
            Dim strFileSize As String = ""
            Dim di As New IO.DirectoryInfo(ExtractPath)
            Dim aryFi As IO.FileInfo() = di.GetFiles("*.pdf")
            Dim fi As IO.FileInfo
            Dim Entreprise As String
            Dim NomFinal As String
     
            My.Computer.FileSystem.CreateDirectory(Replace(txtPath.Text, _
                                System.IO.Path.GetFileName(txtPath.Text), _
                                "" & txtCommune.Text & " " & txtNumAff.Text))
     
            For Each fi In aryFi
                If fi.Name <> System.IO.Path.GetFileName(Replace(txtPath.Text, ".zip", "")) & "_resume.pdf" And fi.Name <> System.IO.Path.GetFileName(Replace(txtPath.Text, ".zip", "")) & "_emprise.pdf" Then
                    Entreprise = GetEntreprise(fi.FullName)
                    NomFinal = Replace(fi.FullName, fi.Name, "")
                    NomFinal = txtCommune.Text & " " & txtNumAff.Text & "\" & GeneralName & "_" & Entreprise & ".pdf"
                    FillForm(fi.FullName, NomFinal)
                End If
            Next
     
            My.Computer.FileSystem.DeleteDirectory(ExtractPath, FileIO.DeleteDirectoryOption.DeleteAllContents)
     
        End Sub
     
        Private Function GetEntreprise(ByVal Fichier As String)
            Dim Ent As String
            Dim pdfTemplate As String = Fichier
            Dim pdfReader As New PdfReader(pdfTemplate)
            My.Computer.FileSystem.CopyFile(Fichier, Replace(Fichier, ".pdf", "bis.pdf"), True)
            Dim pdfStamper As New PdfStamper(pdfReader, New FileStream(Replace(Fichier, ".pdf", "bis.pdf"), FileMode.Open))
            Dim pdfFormFields As AcroFields = pdfStamper.AcroFields
            Ent = pdfFormFields.GetField("Exploitant")
            pdfStamper.FormFlattening = True
            pdfReader.Close()
            Return Ent
        End Function
     
     
        Private Sub FillForm(ByVal PDFPath As String, ByVal NewPDFPath As String)
            Dim pdfReader As New PdfReader(PDFPath)
            Dim pdfStamper As New PdfStamper(pdfReader, New FileStream(NewPDFPath, FileMode.Create))
            Dim pdfFormFields As AcroFields = pdfStamper.AcroFields
     
            pdfFormFields.SetField("N° affaire executant", txtNumAff.Text)
            [...]
            pdfFormFields.SetField("NombrePJ_DICT", txtNbPJ.Text)
     
            pdfStamper.FormFlattening = True
            pdfStamper.Close()
            pdfReader.Close()
        End Sub
    Merci infosam de t'etre penché sur mon souci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Manipulation de fichier PDF
    Par ridan dans le forum Langage
    Réponses: 1
    Dernier message: 08/04/2013, 15h39
  2. manipuler les fichiers pdf
    Par abram1988 dans le forum Débuter
    Réponses: 1
    Dernier message: 01/11/2012, 17h23
  3. [WD12] manipulation de fichiers pdf
    Par wd_newbie dans le forum WinDev
    Réponses: 3
    Dernier message: 14/04/2010, 00h18
  4. Ouvrir et manipuler un fichier PDF
    Par Imakandis dans le forum C#
    Réponses: 0
    Dernier message: 15/03/2010, 01h17
  5. pbm de manipulation de fichier pdf
    Par CodeurNé dans le forum Langage
    Réponses: 0
    Dernier message: 13/03/2008, 15h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo