XL 2016 VBA - Récupérer le texte d'un fichier PDF

Dudu2

XLDnaute Barbatruc
Bonjour,

Y a-t-il un moyen de chercher et récupérer du texte directement dans un PDF sans avoir à l'ouvrir / tout sélectionner / copier dans le clipboard texte ?

Merci pour toute information.

Edit: Titre modifié pour mieux refléter la solution de cette longue discussion.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Rien qu'avec un boucle de 1 à 10000 on peut trouver la puissance de la CPU en faisant l'hypothèse qu'il y a de le CPU disponible pour Excel.

Mon Desktop c'est 0.100 sec et mon Laptop c'est 0.600 (6 fois plus lent).

Je vais tenter un calcul pour le Sleep initial. Quant à faire de la bidouille 🤣
 

patricktoulon

XLDnaute Barbatruc
re
je viens de retrouver ma version 2017
avec le dataobject et les sendkeys
et ben crois moi si tu veux je gagne une seconde a peu près sur les deux fichiers

1° Important
j'ai constaté que la gestion d'erreur paralysait le clipboard et qu'il fallait la fermer avant de recomencer et non annuler l'erreur

2°et là aussi a ma grande surprise j'ai lancé des dizaines de fois
et mon pavé ne c'est jamais déactivé

3° comme j'ai adobe reader des plus basic d'installer
il s'ouvre avec une aisance incroyable y compris le gros

donc
adobe reader temps d'attente a mettre = 1 pour les deux
firefox 3 et 1 pour le petit pdf et 4 & 1 pour le 62 mega

sur 50 lancements 50 réussites sur adobe reader et firefox

sur chrome il faut remttre le clic dessus sinon ca copie bien mais le F4 n'est pas recu par chrome

ma conclusion
en voyant tout ca
je me dit que depuis 6 ans on a pas évolué d'un yotat quand a une vrai solution
toute nos bidoudouille restent autant approximative que celle qui suit
adapté pour l'occasion
VB:
Sub test()
    Dim tim1#, tim#, tmpload&, tmpToClip&, clip, T$, essai&
    T = ""
    tmpload = 3         'temps pour loader le pdf
    tmpToClip = 1       'temps pour le clipboard
    Set clip = New DataObject
    clip.SetText "": clip.PutInClipboard

    fichier = "C:\Users\patricktoulon\Desktop\trier un tableau avec la fonction sort d'excel 2023    ccccc.pdf"
    'fichier = "C:\Users\patricktoulon\Desktop\User Manual.pdf"

    With CreateObject("Wscript.Shell")
        tim1 = Timer
        .Run Chr(34) & fichier & Chr(34), 1, False

        tim = Timer: Do While Timer - tim < tmpload: DoEvents: Loop

re:
        essai = essai + 1
        .SendKeys ("^a")

        .SendKeys ("^c")

        tim = Timer: Do While Timer - tim < tmpToClip: DoEvents: Loop

        On Error Resume Next
        clip.GetFromClipboard: T = clip.GetText(1)
        If Err Then On Error GoTo 0: T = ""
        If Trim(T) = "" Then GoTo re

        .SendKeys ("^{F4}")

    End With
    tmp = Format(Timer - tim1, "#0.00 ""sec""")
    Sheets(1).Activate

    ActiveSheet.Range("A2").Select

    ActiveSheet.Paste
    [A1] = essai & " essai(s) en " & tmp
End Sub

je sais même pas si je vais le faire pour chrome
tout les users sont en train de l'abandonner progressivement
 

Dudu2

XLDnaute Barbatruc
Ton ancien code est cohérent avec le nouveau à la différence près que tu lances le lecteur PDF par défaut et comme chez moi c'est PDF-XChange Viewer et il n'est pas sensible aux touches Ctrl A et Ctrl C.
Il y a aussi un .putinclipboard qui est à risque sur des lancements répétés.
 

patricktoulon

XLDnaute Barbatruc
Ton ancien code est cohérent avec le nouveau à la différence près que tu lances le lecteur PDF par défaut et comme chez moi c'est PDF-XChange Viewer et il n'est pas sensible aux touches Ctrl A et Ctrl C.
Il y a aussi un .putinclipboard qui est à risque sur des lancements répétés.
re tu n'a pas ecouté
alors je vais le dire plus clairement
quand tu utilise le dataobject oui tu a des erreurs manipulables dans vba
par contre quand tu utilise les api tu a aussi des erreur mais c'est interne dans l'api et le sstr te renvoie rien c'est tout

je met l'application par defaut par ce que tout le monde n'a pas chrome ou FF

apprès si tu veux tu peux mettre le shell sur ce que tu veux

alors oui je gère l'erreur du clip boarc dans vba mais avec ce simple code j'ai moins d'eesais qu'avec les nôtres avec api

je réitère ma surprise que par rapport aux jours précédents le wscript.shell ne plante plus le pavé
ca veut dire quoi?
et bien qu'il y a certainement un rapport avec la pile du stack d'erreur

je viens de tester 50 fois 100% abouties

on error goto 0 c'est ça le secret on vide le stack error

et mes keys up sont fait automatiquement puisque j'ai toujours mon pavé
 

patricktoulon

XLDnaute Barbatruc
re
puré regarde celle là
0 pour chrome j'ai remis les api pour la souris
1 c'est un userform qui est a la fois la fonction et le msgbox
2 il gère chrome firefox ou l'application par defaut
3 à la fin il te dit si c'est bon ou pas et le bouton dit "coller sur la feuille" ou " fermer"

ho cé bo ! ça !!

change le nom des fichiers dans la sub de test c'est tout
a ouais ca me plait ça 🤣
 

Pièces jointes

  • pdf grabber V simplissime patricktoulon .xlsm
    37.7 KB · Affichages: 2

Dudu2

XLDnaute Barbatruc
re tu n'a pas ecouté
alors je vais le dire plus clairement
Arrête de jouer les maîtres d'école.
quand tu utilise le dataobject oui tu a des erreurs manipulables dans vba
par contre quand tu utilise les api tu a aussi des erreur mais c'est interne dans l'api et le sstr te renvoie rien c'est tout
Ça c'est toi qui le dit.
Entre un .putinclipboard (vbNullString) dont l'erreur est répertoriée et irrécupérable même si on boucle sur la création du DataObject (j'ai testé !) et un OpenClipboard 0 / EmptyClipboard / CloseClipboard y a une énorme différence

Concernant ton code, à part le fait que tu passes par UserForm, c'est quoi la différence ?
Firefox fonctionne mais Chrome ne fonctionne pas chez moi, ça renvoie ça:
1700588336936.png
 

Dudu2

XLDnaute Barbatruc
Sur le vidage du Clipboard je n'ai pas de On Error.
Mais bon ok, je veux bien te croire pour le DataObject.

De toutes façons, maintenant que j'ai les API du Clipboard qui fonctionnent en VBA7 (voir le post #156), je n'utiliserai plus le DataObject ni le Late Binding. Sauf pour des petits codes de test.

Sinon ça dit ça:
1700590993551.png
 

Pièces jointes

  • VBA Fonction dump Hexa.txt
    1.2 KB · Affichages: 0
Dernière édition:

patricktoulon

XLDnaute Barbatruc
je l'ai modifié len(10) pour le clipbord
si tu regarde nos premieres essais en video dans les pages précédentes tu verra que le sendkeys numlock est automatique
a aucun moment dans le code je la lance cette touche
et la seule chose qui a changé c'est cette gestion d'erreur
pourtant en bas de la vidéo on vois bien cette touche qui est activé
change les noms de fichier en colonne K

regarde bien les touches qui sont signalé en bas de la vidéo
ps :je pourrais fait le même avec le clipboard by api aussi
 

Pièces jointes

  • pdf grabber V simplissime patricktoulon .xlsm
    39.3 KB · Affichages: 1

Dudu2

XLDnaute Barbatruc
L'erreur que j'ai commise (car pas vérifié) c'est de croire que le GetActiveWindow me rendait le Handle du Browser. En fait c'est faux, GetActiveWindow retourne 0 quand Excel n'est plus la fenêtre active.

En utilisant GetForeGroundWindow, j'ai pu d'une part sécuriser les Ctrl+A et Ctrl+C sur la fenêtre du Browser et d'autre par sécuriser à la fois la destruction de la fenêtre du Browser par Shell TASKKILL /PID et l'attente de sa disparition.

Edit: En conséquence, un Application.hWnd remplace avantageusement un GetActiveWindow pour avoir le Handle d'Excel.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
a ben tu vois en 32 c'est différent
j'ai testé le handle retourné par getactivewindow avec getwindowtext et j'ai bien ma fenêtre google avec mon pdf

il y a trop de différence de fonctionnement entre 64 et 32 en terme de temps et de syncro je soupconne aussi l'accération materielle au niveau graphique
en gros de fois on a des résultats que l'on voit pas encore à l'écran et des fois c'est l'inverse

c'est pour cela que je m'en suis libéré de tout ça

GetForeGroundWindow je ne l'ai plus utilisé depuis LA FIN DE XP
d'ailleurs sur Msoft reshearch il déconseillaient de l'utiliser
elle avait des soucis avec W7
mais si elle fonctionne pourquoi pas
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 183
dernier inscrit
karelhu35