Existe-t-il un moyen de rechercher des fichiers PDF en utilisant la puissance de grep, sans dabord les convertir en texte dans Ubuntu?

Commentaires

Réponse

Installez le package pdfgrep, puis utilisez la commande:

find /path -iname "*.pdf" -exec pdfgrep pattern {} + 

—— ————

La manière la plus simple de faire cela:

pdfgrep "pattern" *.pdf pdfgrep "pattern" file.pdf 

Commentaires

  • Cela fonctionne également sous mac osx (Mavericks). Installez-le en utilisant une infusion. Simple. Merci.
  • Par curiosité, jai vérifié la source de pdfgrep et il utilise poppler pour extraire les chaînes du pdf. Presque exactement comme @wag ‘ ne répond que page par page plutôt que, vraisemblablement, le document entier.
  • pdfgrep aussi a un indicateur récursif. Donc cette réponse pourrait peut-être être réduite à: pdfgrep -R pattern /path/. Bien que cela puisse être moins efficace sil parcourt tous les fichiers, même sil ne sagit pas dun ‘ dun PDF. Et je remarque quil a des problèmes avec les caractères internationaux tels que å, ä et ö .
  • En fait, loption -n est un avantage pour pdfgrep car elle permet dinclure le numéro de page dans la sortie (peut être utile pour un traitement ultérieur).
  • Cette réponse serait plus facile à utiliser si elle expliquait quels bits de la commande sont censés être copiés littéralement et lesquels sont des espaces réservés. Quest-ce que ‘ s pattern? Quest-ce que ‘ s {}? Que se passe ‘ avec le `+`? Je nai aucune idée à la première lecture … alors je vais à la page de manuel, je suppose.

Réponse

Si poppler-utils est installé (par défaut sur Ubuntu Desktop), vous pouvez le «convertir» à la volée et le diriger vers grep :

pdftotext my.pdf - | grep "pattern" 

Cela ne créera « pas de fichier .txt.

Commentaires

  • donc .. vous extrayez le texte avant de le grep, ce qui signifie que la réponse est  » no « .
  • @akira LOP signifiait probablement  » sans ouvrir le PDF dans une visionneuse et exporter vers le texte  »
  • @akira Où voyez-vous  » grep uniquement « ?
  • @akira Eh bien, jai déjà dit ce que je pense il voulait probablement dire; il ne ‘ t veut exporter vers du texte avant de le traiter. Je doute fort quil ait un problème avec toute commande qui co se transforme en texte de quelque manière que ce soit; il ny a ‘ aucune raison de ne pas
  • @sherrellbc Le deuxième argument de pdftotext est le nom de fichier dans lequel il doit écrire . Cependant, par convention, les outils vous permettent généralement décrire dans stdout au lieu de dans un fichier en spécifiant un - à la place. De même, certains outils écriraient dans stdout par défaut si vous omettez complètement un tel argument (mais ce nest pas toujours possible sans créer dambiguïté).

Answer

pdfgrep a été écrit exactement dans ce but et est disponible dans Ubuntu.

Il essaie dêtre principalement compatible avec grep et fournit ainsi « la puissance de grep », uniquement spécialisé pour les PDF. Cela inclut les options grep courantes, telles que --recursive, --ignore-case ou --color.

Contrairement à pdftotext | grep, pdfgrep peut afficher le numéro de page dune correspondance de manière performante et est généralement plus rapide lorsquil na pas à rechercher dans tout le document (par exemple --max-count ou --quiet).

Lutilisation de base est:

pdfgrep PATTERN FILE.. 

PATTERN est votre chaîne de recherche et FILE une liste de noms de fichiers (ou de caractères génériques dans un shell).

Consultez la page de manuel pour plus dinformations.

Réponse

Non.

Un pdf se compose de morceaux de données, certains dentre eux du texte, certains dentre eux des images et certains dentre eux vraiment magique de fantaisie XYZ (par exemple des fichiers .u3d). les morceaux sont la plupart du temps compressés (par exemple, à plat, vérifiez http://www.verypdf.com/pdfinfoeditor/compression.htm ). Afin de « grep » un . pdf vous avez pour inverser la compression aka extraire le texte.

Vous pouvez le faire soit par fichier avec des outils tels que pdf2text et grep le résultat, soit vous exécutez un « indexeur » (regardez xapian.org ou lucene ) qui construit un index de recherche à partir de vos fichiers .pdf et vous pouvez ensuite utiliser le les outils des moteurs de recherche de cet indexeur pour obtenir le contenu du pdf.

Mais non, vous ne pouvez pas grep fichiers pdf et espérer des réponses fiables sans extraire le texte dabord.

Commentaires

  • Considérant que pdfgrep existe (voir ci-dessus), un plat  » no  » est incorrect.
  • @JonathanCross, étant donné que la question dit  » en utilisant la puissance de grep, sans convertir dabord en texte « , un plat  » non  » est correcte.

Réponse

Recoll peut rechercher des PDF. Il ne prend pas en charge les expressions régulières, mais il dispose de nombreuses autres options de recherche, il peut donc répondre à vos besoins.

Réponse

Il y a une question en double sur StackOverflow. Les personnes présentes suggèrent une variante de la réponse harish.venkarts:

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

Lavantage par rapport à la réponse similaire ici est le --with-filename pour grep. Ceci est quelque peu supérieur à pdfgrep aussi, car le grep standard a plus de fonctionnalités.

https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files

Commentaires

  • Je pense quil aurait été préférable de laisser ceci en tant que commentaire (ou modification) dans la réponse similaire à laquelle vous faites référence.

Réponse

Jetez un œil à loutil de grep de ressources communes crgrep qui prend en charge la recherche dans les fichiers PDF.

Il permet également de rechercher dautres ressources comme le contenu imbriqué dans les archives, la base de données les tables , des métadonnées dimage, des dépendances de fichiers POM et des ressources Web – et des combinaisons de celles-ci, y compris la recherche récursive.

Réponse

Vous pourriez redirigez-le dabord vers strings: –

cat file.pdf | strings | grep <...etc...> 

Commentaires

  • Utilisez simplement strings file.pdf | grep <...>, vous navez ‘ pas besoin de cat
  • Ouais – mon esprit semble mieux fonctionner avec les flux … 🙂
  • ne fonctionnera pas si le texte est compressé, ce qui est la plupart du temps.
  • Même si le texte est décompressé, il ‘ est généralement de petits morceaux de phrases (pas même nécessairement des mots entiers!) finement mélangés avec des informations de formatage. Pas très convivial pour strings ou grep.
  • Pouvez-vous penser à une autre raison pour laquelle utiliser des chaînes pour cela ne ‘ t fonctionne? Jai trouvé que lutilisation de chaînes fonctionne sur certains PDF mais pas sur dautres.

Réponse

essayez ceci

find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \ pdftotext "$i" - | grep pattern; done 

pour imprimer les lignes, le motif apparaît dans le pdf

Réponse

Voici un script rapide de recherche de pdf dans le répertoire courant:

#!/bin/bash if [ $# -ne 1 ]; then echo "usage $0 VALUE" 1>&2 exit 1 fi echo "SEARCH IS CASE SENSITIVE" 1>&2 find . -name "*.pdf" -exec /bin/bash -c "pdftotext "{}" - | grep --with-filename --label="{}" --color "$0"" "$1" \; 

Commentaires

  • Je ne peux pas modifier ceci parce que je suis trop petit: le $1 dans linvocation de recherche doit être cité, sinon cela ne fonctionnera pas ‘ avec la recherche termes avec des espaces.
  • @ankon la corrigé 🙂

Answer

cd to votre dossier contenant votre fichier pdf et ensuite ..

pdfgrep "pattern" your.pdf 

ou si vous souhaitez rechercher dans plusieurs fichiers pdf (par exemple dans tous les pdf- fichiers dans votre dossier)

pdfgrep "pattern" `ls *.pdf` 

ou

pdfgrep "pattern" $(ls *.pdf) 

Commentaires

  • pourquoi sur terre utilisez-vous ls pour mettre les noms de fichiers dans les paramètres? Il est ‘ non seulement plus lent, mais aussi une mauvaise idée d ’ utiliser la sortie ls comme lentrée à dautres commandes . pdfgrep 'pattern' *.pdf suffit
  • @phuclv Vous vous trompez. pdfgrep 'pattern' *.pdf ne fonctionnera pas.
  • @ f0nzie vous ‘ vous avez tort. $(ls *.pdf) sera presque exactement identique à *.pdf, mais pire car spécial les fichiers ne sont pas protégés entre guillemets

Réponse

Je suppose que vous voulez dire tp ne pas le convertir sur le disque, vous peut les convertir en stdout puis le grep avec pdftotext. Greffer le pdf sans aucune sorte de conversion nest pas une approche pratique car PDF est principalement un format binaire.

Dans le répertoire:

ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword" 

ou dans le répertoire et ses sous-répertoires:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword" 

De plus, parce que certains pdf sont des scans, ils doivent dabord être OCR. Jai écrit une manière assez simple de rechercher tous les fichiers PDF qui ne peuvent pas être grep et les OCR.

Jai remarqué si un pdf ne contient aucune police, il ne peut généralement pas faire lobjet dune recherche. Donc, sachant cela, nous pouvons utiliser pdffonts.

Les 2 premières lignes de pdffonts sont len-tête de la table, donc lorsquun fichier peut être recherché a plus de deux lignes de sortie, sachant cela, nous pouvons créer:

gedit check_pdf_searchable.sh 

puis collez ceci

#!/bin/bash #set -vx if ((`pdffonts "$1" | wc -l` < 3 )); then echo $1 pypdfocr "$1" fi 

puis rendez-le exécutable

chmod +x check_pdf_searchable.sh 

puis listez tout fichiers PDF non consultables dans le répertoire:

ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {} 

ou dans le répertoire et ses sous-répertoires:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {} 

Réponse

Si vous voulez simplement rechercher des noms / propriétés PDF … ou des chaînes simples qui ne sont pas compressées ou encodées alors au lieu de strings vous pouvez utiliser ce qui suit

grep -a STRING file.pdf cat -v file.pdf | grep STRING 

De grep --help:

 --binary-files=TYPE assume that binary files are TYPE; TYPE is "binary", "text", or "without-match" -a, --text equivalent to --binary-files=text 

et cat --help:

 -v, --show-nonprinting use ^ and M- notation, except for LFD and TAB 

Réponse

gpdf peut être ce dont vous avez besoin si vous utilisez Gnome ! Vérifiez ceci au cas où vous « nutilisez pas Gnome. Il ya une liste de lecteurs de pdf CLI. Ensuite, vous pouvez utiliser grep pour trouver un modèle.

Réponse

 pdfgrep -r --include "*.pdf" -i "pattern"  

Commentaires

  • Bienvenue sur le site, et merci vous pour votre contribution. Pouvez-vous ajouter quelques explications sur la signification de ces options? Cela pourrait également aider à expliquer en quoi votre approche diffère des autres réponses à cette question qui recommandent également pdfgrep.

Réponse

Le moyen le plus rapide est de

grep -rinw "pattern" --include \*.pdf * 

Commentaires

  • Bienvenue sur le site. Pourriez-vous ajouter plus dexplications à votre solution proposée pour la rendre plus accessible aux non-experts? Par exemple, vos recherches de ligne de commande grep de manière récursive dans des sous-répertoires dont une personne non familière avec grep pourrait ne pas être au courant. De plus, vous avez inclus lindicateur -i bien que le fait dignorer la casse ne soit pas toujours ce que lutilisateur souhaite. De plus, veuillez expliquer en quoi votre approche diffère de la réponse par ex. @phuclv et autres.
  • Comme le dit AdminBee, la question ne demande pas de recherche insensible à la casse ni de recherche récursive dans lannuaire. Les options -n et -w ne sont pas non plus justifiées par la question. Mais, plus important encore, cette réponse explique comment rechercher dans les fichiers texte dont les noms se terminent par .pdf – vous avez manqué le point de la question.

Réponse

less mypdf.pdf | grep "Hello, World" 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *