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
- Voir aussi Existe-t-il une sorte de convertisseur PDF en texte? et Outil de ligne de commande pour rechercher des expressions dans un grand nombre de fichiers PDF .
- Pour les personnes qui viennent ici via la recherche: si vous souhaitez dabord le convertir en fichiers texte, regardez Comment rechercher le contenu de plusieurs fichiers pdf?
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 dansstdout
au lieu de dans un fichier en spécifiant un-
à la place. De même, certains outils écriraient dansstdout
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..
où 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 decat
- 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
ougrep
. - 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 avecgrep
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"