[R] Fonction de recherche dans un PDF

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

[R] Fonction de recherche dans un PDF

#1

Message par aulus »

Bonjour,

Pourriez-vous me renseigner sur les fonctions d'autoit concernant le traitement des fichiers PDF ?
Je serais surtout intéressé par une fonction de recherche dans ce type de fichier avec affichage de la page contenant l'objet de la recherche. Existe-t-elle ?

Je vous remercie.
Modifié en dernier par aulus le dim. 08 déc. 2013 13:10, modifié 1 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] fonction de recherche dans un PDF

#2

Message par mikell »

A ma connaissance il n'existe pas de fonctions Autoit dédiées, du moins les udf existantes sur le sujet ne sont pas franchement convaincantes
Le plus simple est d'utiliser un soft externe libre en ligne de commande depuis Autoit pour convertir le pdf en txt - on fait ensuite la recherche dans le txt
Personnellement j'utilise pdftotext, dans celui-là les options permettent de traiter une page après l'autre (ce qui permet de mettre un n° de page sur un résultat de recherche), de respecter la mise en forme initiale (donc avoir un index de ligne)... autre option possible (pas testé) la sortie du texte en stdout plutôt qu'en fichier txt
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2514
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] fonction de recherche dans un PDF

#3

Message par jguinch »

Ca à l'air excellent XPDF, Mikell ! J'avais déjà vu passer 2-3 liens, mais je pensais que c'était que sous Linux. :roll:
Du coup, pour m'amuser, j'ai essayé de faire deux petites fonctions qui pourraient être sympa.

@aulus : si ça te convient, il te restera à gérer l'ouverture du PDF à la page souhaité. Perso, j'utiliserais Sumatra PDF qui te permettra de faire ça super-facilement.
► Afficher le texteLe petit exemple

► Afficher le texteXPDF.au3
Modifié en dernier par jguinch le sam. 07 déc. 2013 21:59, modifié 1 fois.
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] fonction de recherche dans un PDF

#4

Message par aulus »

Bonjour et merci à tous deux pour vos pistes et vos codes. Je vais tester tout ça ce week-end.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Fonction de recherche dans un PDF

#5

Message par mikell »

@jguinch :mrgreen:

Code : Tout sélectionner

; Name...........: _XFDF_Info
; Description....: Disables the specified network adapter.
; Remark.........: Doesn't make the coffee
Cela dit ces outils sont super, le seul truc dommage c'est que le viewer ne fonctionne pas sous Windows ...

Sans création de fichier txt :
► Afficher le texte
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Fonction de recherche dans un PDF

#6

Message par aulus »

J'ai testé les 2 codes, après avoir installé pdftotext.exe , pdfinfo.exe et xpdf.au3. Je n'obtiens rien à l'exécution.

Cette ligne est-elle correcte (code de jguinch) :

Code : Tout sélectionner

$sMyPDF = @ScriptDir & "\mon_fichier.pdf"

$sTextToSearch = "mot_a_trouver"
Et (code de mikell) :

Code : Tout sélectionner

$run = Run( "pdftotext.exe mon_fichier.pdf", "", @SW_HIDE, $STDOUT_CHILD)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Fonction de recherche dans un PDF

#7

Message par mikell »

Il faut indiquer comment sortir le texte
syntaxe : "pdftotext.exe -options entrée.pdf sortie.txt"
Pour mon code :

Code : Tout sélectionner

$run = Run( "pdftotext.exe [color=#FF0000]-layout[/color] mon_fichier.pdf [color=#FF0000][size=150][b]-[/b][/size][/color]", "", @SW_HIDE, $STDOUT_CHILD)
-layout : option pour respecter la mise en forme
- : impose une sortie en stdout
A tester en mettant tout dans le même dossier
Voilà mon test (XP 32 bits)
pdftotxt.zip
(396.37 Kio) Téléchargé 293 fois
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Fonction de recherche dans un PDF

#8

Message par aulus »

Effectivement, mon code n'était pas bon. Le test a réussi. Toutefois, la recherche s'effectue uniquement sur la page 1.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Fonction de recherche dans un PDF

#9

Message par mikell »

Si le test dans mon zip t'affiche 2 msgbox c'est que dans le principe ça fonctionne
Ensuite tu peux y remplacer mon pdf par le tien, pour voir
Si ça fonctionne encore c'est probablement dans ton code que ça se passe mais difficile de dire quoi que ce soit sans le voir...
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Fonction de recherche dans un PDF

#10

Message par aulus »

J'utilise votre code tel quel, ne modifiant que le nom du fichier pdf à ouvrir et ajoutant le nom du fichier txt à créer. Avec votre fichier pdf, j'obtiens bien 2 msgbox. Mais avec mon propre fichier pdf, ne s'ouvre qu'une seule msgbox nommée page 1, alors que mon pdf en compte pas mal.
Je me demande si tous les fichiers pdf sont structurés de la même manière.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Fonction de recherche dans un PDF

#11

Message par mikell »

Aucune idée... faut faire des tests
Ce code est censé retourner l'intégralité du pdf dans le txt

Code : Tout sélectionner

Run("pdftotext.exe mon_fichier.pdf sortie.txt")
Si ça ne retourne que la page 1, faut essayer de forcer la lecture de la page 2

Code : Tout sélectionner

Run("pdftotext.exe -f 2 -l 2  page_2.txt")
Pas moyen de voir le pdf en question ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Fonction de recherche dans un PDF

#12

Message par aulus »

Le fichier txt contient bien tout le contenu du pdf. Mais une seule msgbox s'affiche, et non une par page.
Fichier pdf : ftp://ftp.bnf.fr/582/N5821613_PDF_1_-1DM.pdf
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2514
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Fonction de recherche dans un PDF

#13

Message par jguinch »

@mikell : oui, j'ai fais un copié-collé depuis une des mes fonctions... un peu trop vite, je vais corriger :roll:

aulus, j'ai testé avec mon code et ton PDF, ça marche plutôt bien...
► Afficher le texte
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Fonction de recherche dans un PDF

#14

Message par mikell »

@jguinch
j'avais compris - it was a joque Image

Sinon je sais pas trop quoi dire...
Je viens de tester ce script (en renommant le pdf en '3.pdf')

Code : Tout sélectionner

#include <Constants.au3>
$run = Run( "pdftotext.exe -layout 3.pdf -", "", @SW_HIDE, $STDOUT_CHILD)

Local $txt
While 1
    $txt &= StdoutRead($run)
    If @error Then ExitLoop
WEnd
$txt = StringRegExpReplace($txt, '(\s*$)', "")

Local $aPages = StringSplit($txt, chr(12) )
For $i = 1 to $aPages[0]
   ; MsgBox(0, "page " & $i, $aPages[$i])
    FileWrite(StringFormat("%02i", $i) & ".txt", $aPages[$i])
Next
qui m'a bien retourné 85 fichiers txt
Et aussi 85 msgbox (donc une recherche par page sans création de fichier est possible)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Fonction de recherche dans un PDF

#15

Message par aulus »

Bonjour,

Ca fonctionne aussi chez moi. Merci encore pour tout ce travail. Je pense que les dysfonctionnements provenaient du nom de fichier long du pdf qui me servait de test.
Afin que la page contenant le ou les mots cherchés s'ouvre dans le lecteur pdf, j'ai codé comme ceci :

Code : Tout sélectionner

#include <Constants.au3>

$run = Run("pdftotext32.exe -layout 3.pdf -", "", @SW_HIDE, $STDOUT_CHILD)

Local $txt
Local $sTextToSearch = "desinat in piscem"

While 1
    $txt &= StdoutRead($run)
    If @error Then ExitLoop
WEnd
$txt = StringRegExpReplace($txt, '(\s*$)', "")

Local $aPages = StringSplit($txt, chr(12) )
For $i = 1 to $aPages[0]
    If StringInStr($aPages[$i], $sTextToSearch) Then
            Local $pdf = ' "' & @ScriptDir & '\3.pdf' & '"'
            Run("C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe /A page=" & $i & $pdf)
    EndIf

Next
 
Grand merci pour votre temps de réflexion, de codage et de tests.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] Fonction de recherche dans un PDF

#16

Message par mikell »

Cette recherche ça ferait une belle fonction à rajouter au XPDF.au3 de jguinch
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2514
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [R] Fonction de recherche dans un PDF

#17

Message par jguinch »

C'est vrai mikell, on pourrait l'intégrer et proposer ça dans la section UDF, ça peut être utile.
Mais comment tu vois ça, toi ?
La fonction de recherche va faire la conversion en txt (directement dans stdout), ça c'est OK. Mais qu'est-ce qu'elle va retourner ?
- 1 si le mot a été trouvé et 0 si pas trouvé ?
- le nombre d’occurrences trouvées ?
- un tableau à 2 dimensions avec le numéro de page et le nombre d'occurrences dans la page ?
- ... ?

On peut faire ça :
► Afficher le texte
T'en penses quoi ?
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] Fonction de recherche dans un PDF

#18

Message par mikell »

Hem ça me rappelle quelque chose ce flag... :mrgreen:

Code : Tout sélectionner

Flag - Values 
0 - Returns 1 (matched) or 0 (no match) 
1 - Return array of matches.
Le flag 3 est-il vraiment utile ?
Par contre peut-être une array 2D avec [0] n° de page - [1] nb d'occurences dedans ? et
$result[0][0] = number of matching pages
$result[0][1] = global number of occurrences found in ze whole pdf (un peu comme dans les FileList*) faut voir
Peut-être aussi (puisque les options de pdftotxt le permettent)

Code : Tout sélectionner

; start - Page number to start searching at (default is 1)
; end - Page number to stop searching (default is 0 = eof)
Et préciser que la recherche est case insensitive par défaut

Mais c'est que des idées comme ça, globally en fait je te fais la plus entière confiance :wink:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Répondre