XL 2013 Extraction d'images contenu dans un PDF

Flown720

XLDnaute Nouveau
Bonjour à tous,

J'aimerai pouvoir extraire les images de fichiers PDF en VBA ?
Actuellement, je converti les pdf par des solutions en ligne, mais dans le développement de mon activité, j'aimerai le faire par VBA pour automatisation et forcément gain de temps pour moi. J'aurai environ 5000 fichiers PDF à convertir...

J'ai déjà rechercher des solutions mais je n'arrive pas à trouver une solution qui fonctionne. C'est pour ça que je m'adresse à vous.

Merci d'avance, bonne journée
 

Flown720

XLDnaute Nouveau
....

Quand à cette extraction d'images de PDF, je cherche encore à comprendre pourquoi la question a atterri sur un forum dédié à Excel
Et quel est le contexte d'utilisation dans la vraie vie?

Oui, je sais, cela fait beaucoup de questions ;)
Bonjour à tous,

Alors PowerpointImageExtractor marche très bien chez moi encore un windows 7 64bits

Sinon, pour répondre à vos questions (enfin si j'arrive à être clair dans mes réponses), je voudrais utilisé un moyen sous excel pour extraire les pdf dans des dossiers et sous-dossier, la plupart sont des scans en PDF mais aussi des multipages de photos, répartis dans environ 10000 dossier, et représentant 5000 fichiers à récupérer les images dans les PDF. Sauf que je doit extraire en fonction de certaines conditions (certaines numérotation de fichier, certaines plages de données, etc...) et c'est pour ça que pour moi un macro en vba serai plus approprié pour faire ça. Actuellement, j’utilise des sites pour le faire manuellement, mais c'est fastidieux...
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil

Je devrais ouvrir un cabinet de voyance ;)
Re
Pour le reste, je te conseille de chercher dans les archives du forum les messages rédigés par kiki29.
Ou d'attendre qu'il passe dans ta discussion.
(Tu as une chance sur deux qu'il y passe ;), vu qu'il a une forte inclination pour le traitement des PDF en VBA)
=> cf message#31
 

zebanx

XLDnaute Accro
Re


:eek:
Qui peut humainement gérer dix mille dossiers ?
Bonjour Staple1600, Flown720, DD,...le forum

@Staple1600
Un sous-traitant (non ?)

@Flown720
Un code VBA (en fait deux macros et la première appelle la deuxième) qui fonctionne bien pour extraire les images dans un PDF (testé ok) en les renommant image 1, image 2.... :
- avec son chemin complet
- avec le répertoire d'affectation (à remplacer car app.Path n'est pas reconnu, j'ai testé avec ActiveWorkbook.Path et cela a bien fonctionné)

Après, pour les boucles, pour les paramétrages.... c'est une usine à gaz à monter.
Bon courage !

Xl-ment
zebanx
 

Staple1600

XLDnaute Barbatruc
Re, Bonjour zebanx

=>zebanx
10 000 dossiers= 10 000 clic-droit dans l'explorateur Windows->Nouveau dossier
:eek:
Ce que je voulais dire c'est des yeux humains ne peuvent pas parcourir 10 000 répertoires à la main, non ?
(ou alors sous speed ;))
Quoique...
Je viens de m'apercevoir que sur ce PC, j'ai plus de 13 000 répertoires (dont certains où je n'ai jamais mis les pieds) ;)
Mais assurément, je ne suis pas en mesure de les ouvrir un à un avec ma souris ;)
(C'est un PC qui a plus de 12 ans)
 

Flown720

XLDnaute Nouveau
@Staple1600
Un sous-traitant (non ?)
Bonjour à tous,

@zebanx
alors moi j'aurai dit aussi un stagiaire, ou un alternant ça coûte moins cher !!! 😜

En tout cas, blague mise à part, les dossiers ont été créés au fil du temps, mais aussi par macro, pour le rangement et l'arborescence. Sauf comme toute base de données de cette taille, ça implique que n'importe qq choix fait à un moment donnée, implique que pour revenir en arrière, ou son traitement c'est un peu lourd !!!

J'ai pas encore eu le temps de tester ce que propose @zebanx, je vais m'y coller juste après 😉

Par contre, pour la solution @kiki29, j'avais déjà tenter la version PDF Creator 1.7.3 et ça fonctionne pas chez moi, pourtant j'ai coché la référence PDF creator (J'avais une version supérieur que j'ai désinstaller pour mettre celle-ci)
1609246123141.png

Voici l'erreur
1609246192477.png

et plante sur cette ligne là
1609246217939.png


Donc, est-ce qu'il faut cocher d'autre référence? ou autre chose ?
Merci à tous
 

Flown720

XLDnaute Nouveau
....
@Flown720
Un code VBA (en fait deux macros et la première appelle la deuxième) qui fonctionne bien pour extraire les images dans un PDF (testé ok) en les renommant image 1, image 2.... :
- avec son chemin complet
- avec le répertoire d'affectation (à remplacer car app.Path n'est pas reconnu, j'ai testé avec ActiveWorkbook.Path et cela a bien fonctionné)

Après, pour les boucles, pour les paramétrages.... c'est une usine à gaz à monter.
Bon courage !

Xl-ment
zebanx

Re
@zebanx Alors oui, en corrigeant le "app.Path" par un nom de chemin correct, ça fonctionne.
Par contre, dans le code il y a tellement de chose qui me dépasse. comme le "ÿØÿ"
1609260878224.png


Je pensai que ça fonctionnerai pas et que c'était beug de caractère mais non !!
Il faut que je test sur les autres ordinateurs si ça fonctionne aussi.
 

Flown720

XLDnaute Nouveau
Re
@zebanx Alors oui, en corrigeant le "app.Path" par un nom de chemin correct, ça fonctionne.
Par contre, dans le code il y a tellement de chose qui me dépasse. comme le "ÿØÿ" Regarde la pièce jointe 1090138

Je pensai que ça fonctionnerai pas et que c'était beug de caractère mais non !!
Il faut que je test sur les autres ordinateurs si ça fonctionne aussi.
Bonjour à tous,
Ce code marche bien sur un premier PC sous windows 7 64bits et office 2013.
Par contre, je n'arrive pas à le faire marcher sous windows 10 64bits et office 2013

D'où peux venir le problème ?

Pour rappel le code utilisé pour extraire les images contenu dans un PDF
VB:
Option Explicit

Sub Form_Load()
     ExtractImgPDF "D:\Test\600974 photos.pdf", ActiveWorkbook.Path
End Sub


Private Sub ExtractImgPDF(ByVal PathPDF As String, ByVal DestPath As String)
    Dim i As Long, lRet As Long, j As Long
    Dim FF As Integer
    Dim sBuff As String
    Dim ArrStream() As String
    Dim sStream As String
    Dim lCount As Long
   
    lCount = 1
   
    FF = FreeFile
   
    Open PathPDF For Binary As #FF
        sBuff = Space(LOF(FF))
        Get #FF, , sBuff
    Close #FF
   
    If Right$(DestPath, 1) <> "\" Then DestPath = DestPath & "\"

    For j = 0 To 2
       
        If j = 0 Then
            ArrStream = Split(sBuff, ">>" & "stream" & vbLf)
        ElseIf j = 1 Then
            ArrStream = Split(sBuff, ">>" & vbLf & "stream" & vbLf)
        Else
            ArrStream = Split(sBuff, ">>" & vbCrLf & "stream" & vbCrLf)
        End If
       
        For i = 1 To UBound(ArrStream)
            If j = 0 Or j = 1 Then
                lRet = InStr(ArrStream(i), "endstream" & vbLf & "endobj" & vbLf)
            Else
                lRet = InStr(ArrStream(i), "endstream" & vbCrLf & "endobj" & vbCrLf)
            End If
           
            If lRet Then
                sStream = Left$(ArrStream(i), lRet - 1)
           
                If Left$(sStream, 3) = "ÿØÿ" Then
                    FF = FreeFile
                    Open DestPath & "Image " & lCount & ".jpg" For Binary As #FF
                        Put #FF, , sStream
                    Close #FF
                   
                    lCount = lCount + 1
                'Else
                '    Debug.Print Left$(sStream, 4)
                End If
            End If
        Next
    Next
End Sub

Merci de votre aide
 

patricktoulon

XLDnaute Barbatruc
bonsoir
je suis le premier surpris après test qu'un split sur une chaine dans un tableau de bit fonctionne
normalement une lecture ou un stream en binaire(binary) te sort un tableau de bits
mais contre toute attente ca fonctionne chez moi W7 2013
faut dire que j'ai plus l’habitude de streamer des images sur le web que de streamer un pdf

en ce qui concerne W10 avec 2013 je ne vois pas trop de raison car tu n'utilise pas de librairie particulière

en tout cas chapo pour l'extraction des images ça fonctionne a merveille sans librairie avec un code aussi simple perso j’adhère 👍 et c'est rapide en plus
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil,

Est-ce ces modifs (qui n'émanent pas de ma cabessa) fonctionne mieux?
VB:
Sub mTest()
Dim strPath$
strPath = ActiveWorkbook.Path
ExtractImgPDF "C:\Users\Documents\test.pdf", strPath
End Sub
Private Sub ExtractImgPDF(ByVal PathPDF As String, ByVal DestPath As String)
Dim i&, lRet&, j&, lCount&, FF%, sBuff$, sStream$, imgstrt$
Dim ArrStream() As String
lCount = 1
FF = FreeFile
Open PathPDF For Binary As #FF
    sBuff = Space(LOF(FF))
    Get #FF, , sBuff
Close #FF
If Right$(DestPath, 1) <> "\" Then DestPath = DestPath & "\"
    imgstrt = "ÿØÿ"
    ArrStream = Split(sBuff, imgstrt)
    For i = 1 To UBound(ArrStream)
        lRet = InStr(ArrStream(i), "endstream")
        If lRet Then
            sStream = imgstrt & Left$(ArrStream(i), lRet - 1)
                  FF = FreeFile
                Open DestPath & "Image " & lCount & ".jpg" For Binary As #FF
                    Put #FF, , sStream
                Close #FF
                lCount = lCount + 1
            Else
                Debug.Print Left$(sStream, 6)
        End If
    Next
End Sub
NB: Fonctionne sur W10 64 bits / XL2K13 32bits
(je n'ai fait le test que sur un seul PDF, j'ai pas bouclé sur un répertoire contenant 50 000 PDF ;) )

PS: Petite bizarerrie, faites le test suivant
Insérer des images (*.jpg ou *.png) sur une feuille
Insérer également quelques formes (AutoShapes)
Enregistrer sous en test.pdf
Puis à partir d'un autre classeur, essayez d'extraire les "images" avec la macro et observez ce qui se passe ;)
 

Staple1600

XLDnaute Barbatruc
Re, Bonsoir patricktoulon (et mes vœux les meilleurs)

Je n'ai pas dit que ce n'était pas normal ;)
Mais donc si dans les 50 000 pdfs et plus, il y en a qui contiennent autre autre chose que du jpg, alors l'image reste au chaud dans le PDF et personne ne connaitra alors jamais l'histoire de l'image qui n'en était pas vraiment une et qui pourtant était jolie comme une image.
;)
 
Haut Bas