web-dev-qa-db-fra.com

Comment rechercher le contenu de plusieurs fichiers pdf?

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

204
Jestin Joy

Votre distribution devrait 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 se produise sur stdout et non sur des fichiers. Les options --with-filename et --label= placent le nom du fichier dans la sortie de grep. Le drapeau facultatif --color est Nice et indique à grep de générer une sortie en utilisant les couleurs du terminal.

(Dans Ubuntu, pdftotext est fourni par le paquetage xpdf-utils ou poppler-utils.)

Cette méthode, utilisant pdftotext et grep, présente un avantage sur pdfgrep si vous souhaitez utiliser les fonctionnalités de GNU grep que pdfgrep ne supporte pas. Note: pdfgrep-1.3.x supporte l'option -C pour l'impression d'une ligne de contexte.

191
sjr

Il existe pdfgrep , qui fait exactement ce que son nom suggère.

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

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

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

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

195
Graeme

Recoll est une application de recherche en texte intégral fantastique pour Unix/Linux qui prend en charge des dizaines de formats différents, notamment 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, ce qui vous permet d'accéder directement au résultat directement depuis son interface graphique.

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

26
Glutanimate

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

pdfgrep -HiR 'pattern' /path

Lorsque vous faites pdfgrep --help:

  • H: Affiche le nom du fichier pour chaque correspondance.
  • i: Ignorer les distinctions de cas.
  • R: Recherche de répertoires de manière récursive.

Cela fonctionne bien sur mon Ubuntu.

12
arkhi

J'ai fait ce destructif petit script. 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
}
7
phil

J'aime la réponse de @ sjr, mais je préfère xargs vs -exec. Je trouve xargs plus polyvalent. Par exemple, avec -P, nous pouvons tirer parti de plusieurs processeurs lorsqu'il est logique de le faire.

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

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

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

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

Peut-être que cela vous sera utile.

Vous pouvez le télécharger ici

2
Paul Weibert

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

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

J'ai développé crgrep en tant qu'outil opensource.

1
Craig

Commencez par convertir tous vos fichiers pdf en fichiers texte:

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

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

1
Martin Thoma

Vous avez besoin d'outils tels que pdf2text pour convertir d'abord votre pdf en fichier texte, puis effectuer une recherche à l'intérieur du texte. (Vous manquerez probablement d'informations ou de 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
Nylon Smile

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

Il peut gérer plus que des PDF documents, tels que des documents Office et des vidéos, et l'auteur affirme , il est plus rapide que pdfgrep.

La syntaxe de la commande permet de rechercher de manière récursive le répertoire en cours. La seconde limite uniquement les fichiers PDF:

rga 'pattern' .
rga --type pdf 'pattern' .
0
oschoudhury