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
Merci pour vos retours.
J'essaie en lançant Chrome (je dois l'utiliser) et faire Ctrl+A et Ctrl+C.

Mais d'une part j'ai du mal à savoir quand Chrome est prêt:
- Ça ne marche pas avec les Handle, il est présent avant l'affichage de la page
- Je dois faire une pause mais ça reste peu précis

D'autre part Chrome, contrairement à Firefox, ne prend pas le Ctrl+C après le Ctrl+A, même avec des tempos entre les 2, je sais pas pourquoi et ça m'énerve bien !
 

danielco

XLDnaute Accro
... Sinon, c'est comme dans Firefox, quand la page est chargée, tu as le petit cercle :

Capture d'écran 2023-10-24 160048.png
 

Lolote83

XLDnaute Barbatruc
Bonjour à tous,
@Dudu2
Mais d'une part j'ai du mal à savoir quand Chrome est prêt:
Grace à ce petit code, on récupère une liste de toutes les applications ouvertes (visibles et non visibles)
Un fois la liste générée, tu peux rechercher le mot CHROME et s'il y est, c'est que chrome est ouvert
Peux être cela pourra t'aider

VB:
Private Declare Function GetWindowTextLength Lib "user32.dll" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Private Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal nMaxCount As Long) As Long
Private Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long
Private x&

Private Function EnumWindowsProc&(ByVal hwnd&, ByVal lParam&)
    Dim SLength&, Buffer As String, RetVal&
    SLength = GetWindowTextLength(hwnd) + 1
    If SLength > 1 Then
    Buffer = Space(SLength)
    RetVal = GetWindowText(hwnd, Buffer, SLength)
    x = x + 1
    Cells(x, 1) = Left(Buffer, SLength - 1)
    Cells(x, 2) = CBool(IsWindowVisible(hwnd))
    End If
    EnumWindowsProc = 1
End Function

Sub WinList()
    Application.ScreenUpdating = False
    Cells.ClearContents
    Cells(1, 1) = "CAPTION"
    Cells(1, 2) = "VISIBLE"
    Range("A1:B1").Font.Bold = True
    Range("A2").Select
    ActiveWindow.FreezePanes = True
    x = 1
    EnumWindows AddressOf EnumWindowsProc, 0
    Cells.Columns.AutoFit
End Sub

oups, pas rafraichi assez tôt

Ici par exemple on voit bien que le fichier PDF est ouvert das Chrome
1698157725287.png


@+ Lolote83
 

Dudu2

XLDnaute Barbatruc
Bonjour @Cousinhub,
Je n'y connais strictement rien en Power Query, raison pour laquelle je n'y ai même pas pensé.
Par contre j'ai ramé pour arriver à cette fonction en essayant des tas de trucs API inopérants.
VB:
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'-----------------------------------------
'Open a PDF and copy the text in the sheet
'-----------------------------------------
Function GetPDFText(FichierPDF As String) As String
    Dim Clipboard As Object

    'Chrome exe file
    Const Chrome = "C:\Program Files\Google\Chrome\Application\chrome.exe"
    
    'DataObject late binding
    Set Clipboard = CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    
    'Run Chrome
    Call Shell(Chrome & " --new-window -url " & """" & FichierPDF & """", vbNormalFocus)
    Sleep 2000
     
    'Send keys to Select All / Copy / Kill the application
    CreateObject("wscript.shell").SendKeys "^a"
    Temporisation 100
    CreateObject("wscript.shell").SendKeys "{TAB}"
    Temporisation 100
    CreateObject("wscript.shell").SendKeys "^c"
    Temporisation 100
    CreateObject("wscript.shell").SendKeys "%{F4}"
    Temporisation 10000
    
    'Get the text from the Clipboard
    With Clipboard
        .GetFromClipboard
        GetPDFText = .GetText(1)
        .SetText ""
        .PutInClipboard
    End With
End Function

'-------------
'Temporisation
'-------------
Private Sub Temporisation(NbDoEvents As Integer)
    Dim k As Integer
    
    For k = 1 To NbDoEvents
        DoEvents
    Next k
End Sub
 
Dernière édition:

Cousinhub

XLDnaute Barbatruc
Bonjour @Cousinhub,
Je n'y connais strictement rien en Power Query, raison pour laquelle je n'y ai même pas pensé.
Par contre j'ai ramé pour arriver à cette fonction en essayant des tas de trucs API inopérants.
Re-,
Moi non plus, il y a à peu près un an, je n'y connaissais rien...
Et tout ton code d'ouverture du fichier pdf se résumerait à ceci : (et le fichier pdf reste en mémoire, non inscrit dans le fichier xlxs)

PowerQuery:
let
    Source = Pdf.Tables(File.Contents("C:\Users\cousi\Documents\essai.pdf"), [Implementation="1.3"]),
    Expand = Table.ExpandTableColumn(Source, "Data", {"Column1", "Column2"}, {"Data.Column1", "Data.Column2"})
in
    Expand

L'essentiel est bien d'obtenir le résultat voulu, quelle que soit la méthode
Bonne soirée
 

Dudu2

XLDnaute Barbatruc
L'essentiel est bien d'obtenir le résultat voulu, quelle que soit la méthode
Certes, mais si ton Power Query fait quelque chose:
- je ne sais absolument pas quoi
- ni comment l'exécuter
- ni comment en récupérer le résultat
Mais si ça récupère le texte d'un fichier PDF en presse-papier ou en feuille, alors c'est parfait👍
 

Cousinhub

XLDnaute Barbatruc
Re-,
Oui, (ps, ce n'est pas à moi, PQ;) )
La manip est très simple
Dans le menu "Données", tu cliques sur :

1698171957579.png


Puis tu te laisses guider..
Le mode de fonctionnement de base de PQ est totalement similaire à l'enregistreur de macro.
Tout ce que tu vas faire va être enregistré.
Et tout comme dans le VBE, tu as accès à l'éditeur avancé de PQ qui te permet de modifier, optimiser, adapter la requête.
Si cela t'intéresse, demain, on peut faire une extraction "Pdf" en direct-live (ce soir, c'est "Au Nord, c'était les corons")
@ toi de voir
Bonne soirée (et bon match, du moins, pour ma part):)
 

Pièces jointes

  • 1698171902832.png
    1698171902832.png
    58.3 KB · Affichages: 7

Dudu2

XLDnaute Barbatruc
Si cela t'intéresse, demain, on peut faire une extraction "Pdf" en direct-live
Merci pour ta proposition? Je ne sais pas comment tu comptes faire ça.
Mais en premier lieu, est-il possible d'interagir entre PQ et VBA ?
Je code des fonctionnalités + / - complexes avec VBA donc je ne peux me satisfaire uniquement de PQ.
 

Discussions similaires

Statistiques des forums

Discussions
312 207
Messages
2 086 250
Membres
103 165
dernier inscrit
thithithi78