Comment rechercher le contenu de plusieurs fichiers PDF?


227

Comment puis-je rechercher le contenu de fichiers PDF dans un répertoire / sous-répertoire? Je recherche des outils en ligne de commande. Il semble que grepvous ne puissiez pas rechercher de fichiers PDF.


5
Grep ne fonctionnera pas car le PDF est un format binaire et le texte est souvent compressé ou encodé de différentes manières.
Mark Stephens

4
Voici une solution graphique: Adobe Reader, voir wikispaces.psu.edu/display/training/…
Martin Thoma


3
Adobe Reader fonctionne bien, mais il n'indexe pas; donc si vous avez beaucoup de fichiers, ce sera lent. Une solution d'indexation?
Ruby

Réponses:


211

Votre distribution doit fournir un utilitaire appelé pdftotext:

find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;

Le "-" est nécessaire pour que la sortie de pdftotext soit vers stdout, pas vers les fichiers. Les options --with-filenameet --label=mettront le nom du fichier dans la sortie de grep. Le --colordrapeau optionnel est agréable et indique à grep de sortir en utilisant des couleurs sur le terminal.

(Dans Ubuntu, pdftotextest fourni par le package xpdf-utilsou poppler-utils.)

Cette méthode, utilisant pdftotextet grep, a un avantage sur pdfgrepsi vous voulez utiliser des fonctionnalités de GNU grepqui pdfgrepne prennent pas en charge. Remarque : pdfgrep-1.3.x prend en charge l' -Coption d'impression de la ligne de contexte.


1
@Kurt Pfeifle L'édition "(Edit by -kp-)" que vous avez effectuée ne fonctionne pas car grepfiltre les noms des fichiers imprimés.
Raphael Ahrens

@sjr no, bien que la pdfgrepsolution soit bonne pour des recherches très rapides et simples, souvent je veux obtenir un peu de contexte, car une seule ligne ne sera pas assez utile - donc comme j'ai ajouté à cette réponse: Par exemple, vous pouvez ajouter l'option -C5 avant "votre modèle" pour inclure 5 lignes de contexte à la sortie - pdfgrep ne prend pas en charge cela
Colin D Bennett

oh c'est cool, heureux de savoir qu'il y a des avantages à cela même si c'est beaucoup moins évident pour la plupart des gens que ça fait
sjr

2
@sjr Juste pour mémoire: j'utilise Ubuntu 12.10 et pdfgrepest inutile, il signale une énorme quantité de déchets sur les fichiers qu'il ne peut pas gérer. Votre solution a en revanche aidé. Alors, ne le supprimez pas, même après 3 ans, c'est toujours utile!
Ali

J'ai pu l'utiliser également dans cygwin, mais pour en faire une fonction avec un paramètre, j'ai dû faire en sorte que "your_pattern" devienne '$ 1'
Koshmaar

215

Il y a pdfgrep , qui fait exactement ce que son nom l'indique.

pdfgrep -R 'a pattern to search recursively from path' /some/path

Je l'ai utilisé pour de simples recherches et cela a bien fonctionné.

(Il existe des paquets dans Debian, Ubuntu et Fedora.)

Depuis la version 1.3.0, pdfgrep prend en charge la recherche récursive. Cette version est disponible dans Ubuntu depuis Ubuntu 12.10 (Quantal).


1
De Natty (Ubuntu 11.04) vers le haut (Voir packages.ubuntu.com/… )
Martin Thoma

2
@pavon a pdfgrepmaintenant cette option de récursivité, y compris -Rpour suivre également les liens symboliques
Tobias Kienzler

30

Recoll est une fantastique application de recherche GUI en texte intégral pour Unix / Linux qui prend en charge des dizaines de formats différents, y compris PDF. Il peut même transmettre le numéro de page exact et le terme de recherche d'une requête à la visionneuse de documents et vous permet ainsi d'accéder directement au résultat depuis son interface graphique.

Recoll est également livré avec une interface de ligne de commande viable et une interface de navigateur Web .


1
@Glutanimate Cela aiderait (moi et peut-être d'autres aussi) si vous pouviez ajouter un exemple se rapportant à la question d'origine (outil de ligne de commande pour la recherche de plusieurs fichiers PDF): j'aimerais aussi voir comment effectuer une recherche générique et comment rechercher le répertoire courant, y compris tous les sous-répertoires . À quoi cela ressemblerait-il recoll / xapiandans la ligne de commande (non GUI)? Merci!
noisette sur natty

@ LeszekŻarna Peut-être pourriez-vous publier l'exemple que vous avez testé?
fou sur natty

Le recoll manuel de l'utilisateur peut contenir quelques pointeurs, mais offre une lecture plutôt technique et "hors sujet" ...
nutty about natty

1
@nutty: recoll -t -q dir: pwdext: pdf 'neuro *' - stackoverflow a mangé les astuces autour de pwd.
medoc

13

Ma version actuelle de pdfgrep (1.3.0) permet ce qui suit:

pdfgrep -HiR 'pattern' /path

En faisant pdfgrep --help:

  • H: Imprime le nom du fichier pour chaque correspondance.
  • i: Ignorez les distinctions de casse.
  • R: Recherche récursivement dans les répertoires.

Cela fonctionne bien sur mon Ubuntu.


7

J'ai fait ce petit script destructeur . Aie du plaisir avec ça.

function pdfsearch()
{
    find . -iname '*.pdf' | while read filename
    do
        #echo -e "\033[34;1m// === PDF Document:\033[33;1m $filename\033[0m"
        pdftotext -q -enc ASCII7 "$filename" "$filename."; grep -s -H --color=always -i $1 "$filename."
        # remove it!  rm -f "$filename."
    done
}

2
+1. Mais au lieu de cela, $filename.vous devriez le canaliser grep.
Raphael Ahrens

3

J'aime la réponse de @ sjr mais je préfère xargs vs -exec. Je trouve les xargs plus polyvalents. Par exemple, avec -P, nous pouvons profiter de plusieurs processeurs lorsque cela est logique de le faire.

find . -name '*.pdf' | xargs -P 5 -I % pdftotext % - | grep --with-filename --label="{}" --color "pattern"

point intéressant sur la xargs«capacité de traitement parallèle. Notez que votre --labelargument-option sera littéralement {} , car la grepcommande n'est plus exécutée dans le contexte de find's exec.
mklement0

2

J'ai eu le même problème et j'ai donc écrit un script qui recherche tous les fichiers pdf dans le dossier spécifié pour une chaîne et imprime les fichiers PDF qui correspondent à la chaîne de requête.

Peut-être que cela vous sera utile.

Vous pouvez le télécharger ici


peut-être utile de mettre le script dans le commentaire?
baxx

j'ai essayé votre script et il s'avère beaucoup plus lent que la pdfgrepsolution ou le one-liner de sjr, et cela m'a laissé avec un processus en cours utilisant 100% d'un thread CPU même après avoir appuyé sur Ctrl-C pour le terminer.
Jason

2

Si vous voulez voir les noms de fichiers avec pdftotext, utilisez la commande suivante:

find . -name '*.pdf' -exec echo {} \; -exec pdftotext {} - \; | grep "pattern\|pdf" 

2

Il existe un autre utilitaire appelé ripgrep-all , qui est basé sur ripgrep .

Il peut gérer plus que des documents PDF, comme des documents Office et des films, et l'auteur affirme qu'il est plus rapide que pdfgrep.

Syntaxe de commande pour la recherche récursive du répertoire courant, et la seconde limite aux fichiers PDF uniquement:

rga 'pattern' .
rga --type pdf 'pattern' .

1

Il existe un outil de grep de ressources communes open source crgrep qui recherche dans les fichiers PDF mais aussi d'autres ressources comme le contenu imbriqué dans des archives, des tables de base de données, des métadonnées d'image, des dépendances de fichiers POM et des ressources Web - et leurs combinaisons, y compris la recherche récursive.

La description complète sous l'onglet Fichiers couvre à peu près ce que l'outil prend en charge.

J'ai développé crgrep comme un outil open source.


Craig - avez-vous un lien avec ce projet? Si oui, vous devez l'indiquer dans votre réponse. Je dis cela parce que vous venez de poster une réponse pratiquement identique à deux autres anciennes questions ...
Stephen C

Article mis à jour pour préciser que je suis l'auteur de crgrep
Craig

1

Convertissez d'abord tous vos fichiers pdf en fichiers texte:

for file in *.pdf;do pdftotext "$file"; done

Ensuite, utilisez grepcomme d'habitude. Ceci est particulièrement bon car il est rapide lorsque vous avez plusieurs requêtes et beaucoup de fichiers PDF.


Ceci, une fois effectué en combinaison avec ag github.com/ggreer/the_silver_searcher . Capable d'analyser à psychedeliks Gb par microsecondes. Fichiers plats pour la vie
NVRM

0

Vous avez besoin d'outils comme pdf2text pour convertir d'abord votre pdf en fichier texte, puis rechercher à l'intérieur du texte. (Vous allez probablement manquer des informations ou des symboles).

Si vous utilisez un langage de programmation, il existe probablement des bibliothèques pdf écrites à cet effet. par exemple http://search.cpan.org/dist/CAM-PDF/ pour Perl


0

essayez d'utiliser 'acroread' dans un script simple comme celui ci-dessus

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.