Cela fonctionne aussi dans mac osx (Mavericks). Installez-le en utilisant une infusion. Facile. Merci.
mikiemorales
7
Par curiosité, j'ai vérifié la source de pdfgrep et il utilise poppler pour extraire les chaînes du fichier pdf. Presque exactement comme @ wag, la réponse ne concerne que le contenu d'une page à l'autre.
Andrew Martin
4
pdfgrepa également un drapeau récursif. Donc , cette réponse pourrait peut-être réduite à: pdfgrep -R pattern /path/. Bien que cela puisse être moins efficace s'il parcourt tous les fichiers, même s'il ne s'agit pas d'un PDF. Et je remarque qu’il a des problèmes avec les caractères internationaux tels que å, ä et ö.
Rovanion
1
En fait, l' -noption est un pro pour pdfgrep car elle permet d'inclure le numéro de page dans la sortie (peut être utile pour un traitement ultérieur).
JepZ
4
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. C'est quoi pattern? C'est quoi {}? Qu'est-ce qui se passe avec le `+`? Je n'en ai aucune idée en première lecture ... donc je pars pour la page de manuel, je suppose.
Mark Amery
56
Si vous avez poppler-utilsinstallé (par défaut sur Ubuntu Desktop), vous pouvez le "convertir" à la volée et le rediriger vers grep:
alors .. vous extrayez le texte avant de le grep, ce qui signifie que la réponse est "non".
Akira
18
@akira Le PO voulait probablement dire "sans ouvrir le fichier PDF dans un visualiseur ni exporter au format texte"
Michael Mrozek
5
@akira Où voyez-vous "grep only"?
Michael Mrozek
6
@akira Eh bien, j'ai déjà dit ce que je pense qu'il voulait probablement dire; il ne veut pas exporter en texte avant de le traiter. Je doute fort qu'il ait un problème avec toute commande qui convertit en texte de quelque manière que ce soit; il n'y a aucune raison de ne pas
Michael Mrozek
2
@sherrellbc Le deuxième argument de pdftotextest le nom du fichier dans lequel il doit écrire. Cependant, par convention, les outils vous permettent généralement d’écrire au stdoutlieu de dans un fichier en spécifiant un -. De même, certains outils écrivent stdoutpar défaut si vous omettez complètement un tel argument (mais cela n’est pas toujours possible sans créer d’ambiguïté).
Joost
12
pdfgrep a été écrit exactement à cette fin et est disponible dans Ubuntu.
Il essaie d'être principalement compatible avec grepet fournit ainsi "la puissance de grep", spécialisé uniquement pour les PDF. Cela inclut les options communes de grep, telles que --recursive, --ignore-caseou --color.
À la différence de pdftotext | grep, pdfgrep peut afficher le numéro de page d'une correspondance de manière performante et est généralement plus rapide lorsqu'il n'est pas nécessaire de chercher dans tout le document (par exemple --max-countou --quiet).
L'utilisation de base est:
pdfgrep PATTERN FILE..
où PATTERNest votre chaîne de recherche et FILEune liste de noms de fichiers (ou des caractères génériques dans un shell).
Un fichier PDF est constitué de blocs de données, dont certains sous forme de texte, certaines d’images, et certains d’entre eux très magiques comme XYZ (par exemple, des fichiers .u3d). Ces morceaux sont la plupart du temps compressés (par exemple, à plat, consultez http://www.verypdf.com/pdfinfoeditor/compression.htm ). Afin de "grep" un .pdf, vous devez inverser la compression ou extraire le texte.
Vous pouvez le faire par fichier avec des outils tels que pdf2textet grep le résultat, ou vous exécutez un 'indexeur' (regardez xapian.org ou lucene ) qui construit un index interrogeable à partir de vos fichiers .pdf et vous pouvez ensuite utiliser la recherche. outils de moteur de cet indexeur pour obtenir le contenu du pdf.
Mais non, vous ne pouvez pas grepcréer de fichiers pdf et espérer des réponses fiables sans extraire le texte au préalable.
Considérant qu'il pdfgrepexiste (voir ci-dessus), un "non" plat est incorrect.
Jonathan Cross
6
Recoll peut rechercher des PDF. Il ne prend pas en charge les expressions régulières, mais il possède de nombreuses autres options de recherche, il peut donc répondre à vos besoins.
Il suffit d'utiliser strings file.pdf | grep <...>, vous n'avez pas besoincat
phunehehe
Ouais - mon esprit semble mieux fonctionner avec les flux ... :-)
Andy Smith Le
12
ne fonctionnera pas si le texte est compressé, ce qui est le cas la plupart du temps.
Akira
6
Même si le texte n'est pas compressé, il s'agit généralement de petits morceaux de phrases (pas même de mots entiers!) Finement mélangés avec des informations de formatage. Pas très sympa pour stringsou grep.
Jander
Pouvez-vous penser à une autre raison pour laquelle l'utilisation de chaînes pour cela ne fonctionnerait pas? J'ai constaté que l'utilisation de chaînes de caractères fonctionne sur certains PDF mais pas sur d'autres.
heure de retour
3
Jetez un coup d'œil à l'outil de ressources communes grep crgrep, qui prend en charge la recherche dans les fichiers PDF.
Il permet également de rechercher d'autres ressources telles que du contenu imbriqué dans des archives, des tables de base de données, des métadonnées de l'image, des dépendances de fichiers POM et des ressources Web, ainsi que des combinaisons de celles-ci, notamment la recherche récursive.
pourquoi diable 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 lssortie comme entrée pour d’autres commandes . Juste pdfgrep 'pattern' *.pdfest suffisant
phuclv
1
Il y a une question en double sur StackOverflow. Les gens là-bas suggèrent une variante de harish.venkarts répondent:
L'avantage sur la réponse similaire ici est le --with-filenamedrapeau pour grep. Ceci est également un peu supérieur à pdfgrep, car le grep standard a plus de fonctionnalités.
Je pense qu'il aurait été préférable de laisser cela comme un commentaire (ou une modification) dans la réponse similaire à laquelle vous faites référence.
Bernhard
0
Voici un script rapide pour la recherche pdf dans le répertoire actuel:
#!/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 \;
Je suppose que vous voulez dire que vous ne voulez pas le convertir sur le disque, vous pouvez les convertir stdoutpuis le grep pdftotext. Grepping le pdf sans aucune sorte de conversion n'est pas une approche pratique puisqu'il PDFs'agit principalement d'un format binaire.
De plus, comme certaines pdfnumérisations sont numérisées, elles doivent d'abord faire l'objet d'une reconnaissance optique. J'ai écrit un moyen assez simple de rechercher tous les fichiers PDF qui ne peuvent pas être édités grepet OCR.
J'ai remarqué que si un pdffichier n'a aucune police, il est généralement impossible de le rechercher. Donc, sachant cela, nous pouvons utiliser pdffonts.
L'en pdffonts-tête de la table est composé des deux premières lignes . Ainsi, lorsqu'un fichier est interrogeable, il produit une sortie de plus de deux lignes. Sachant cela, nous pouvons créer:
gedit check_pdf_searchable.sh
puis coller ceci
#!/bin/bash
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1"
fi
puis le rendre exécutable
chmod +x check_pdf_searchable.sh
puis répertoriez tous les fichiers PDF non interrogeables dans le répertoire:
ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}
Si vous souhaitez simplement rechercher des noms / propriétés au format PDF ... ou des chaînes simples qui ne sont ni compressées ni codées, stringsvous pouvez utiliser la liste ci-dessous à la place de
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
gpdf pourrait être ce dont vous avez besoin si vous utilisez Gnome! Cochez cette case si vous n'utilisez pas Gnome. Il contient une liste de lecteurs PDF CLI. Ensuite, vous pouvez utiliser greppour trouver un motif.
Réponses:
Installez le paquet
pdfgrep
, puis utilisez la commande:——————
Le plus simple est
la source
pdfgrep
a également un drapeau récursif. Donc , cette réponse pourrait peut-être réduite à:pdfgrep -R pattern /path/
. Bien que cela puisse être moins efficace s'il parcourt tous les fichiers, même s'il ne s'agit pas d'un PDF. Et je remarque qu’il a des problèmes avec les caractères internationaux tels que å, ä et ö.-n
option est un pro pour pdfgrep car elle permet d'inclure le numéro de page dans la sortie (peut être utile pour un traitement ultérieur).pattern
? C'est quoi{}
? Qu'est-ce qui se passe avec le `+`? Je n'en ai aucune idée en première lecture ... donc je pars pour la page de manuel, je suppose.Si vous avez
poppler-utils
installé (par défaut sur Ubuntu Desktop), vous pouvez le "convertir" à la volée et le rediriger versgrep
:Cela ne créera pas de fichier .txt.
la source
pdftotext
est le nom du fichier dans lequel il doit écrire. Cependant, par convention, les outils vous permettent généralement d’écrire austdout
lieu de dans un fichier en spécifiant un-
. De même, certains outils écriventstdout
par défaut si vous omettez complètement un tel argument (mais cela n’est pas toujours possible sans créer d’ambiguïté).pdfgrep a été écrit exactement à cette fin et est disponible dans Ubuntu.
Il essaie d'être principalement compatible avec
grep
et fournit ainsi "la puissance de grep", spécialisé uniquement pour les PDF. Cela inclut les options communes de grep, telles que--recursive
,--ignore-case
ou--color
.À la différence de
pdftotext | grep
, pdfgrep peut afficher le numéro de page d'une correspondance de manière performante et est généralement plus rapide lorsqu'il n'est pas nécessaire de chercher dans tout le document (par exemple--max-count
ou--quiet
).L'utilisation de base est:
où
PATTERN
est votre chaîne de recherche etFILE
une liste de noms de fichiers (ou des caractères génériques dans un shell).Voir la page de manuel pour plus d'infos.
la source
Non.
Un fichier PDF est constitué de blocs de données, dont certains sous forme de texte, certaines d’images, et certains d’entre eux très magiques comme XYZ (par exemple, des fichiers .u3d). Ces morceaux sont la plupart du temps compressés (par exemple, à plat, consultez http://www.verypdf.com/pdfinfoeditor/compression.htm ). Afin de "grep" un .pdf, vous devez inverser la compression ou extraire le texte.
Vous pouvez le faire par fichier avec des outils tels que
pdf2text
et grep le résultat, ou vous exécutez un 'indexeur' (regardez xapian.org ou lucene ) qui construit un index interrogeable à partir de vos fichiers .pdf et vous pouvez ensuite utiliser la recherche. outils de moteur de cet indexeur pour obtenir le contenu du pdf.Mais non, vous ne pouvez pas
grep
créer de fichiers pdf et espérer des réponses fiables sans extraire le texte au préalable.la source
pdfgrep
existe (voir ci-dessus), un "non" plat est incorrect.Recoll peut rechercher des PDF. Il ne prend pas en charge les expressions régulières, mais il possède de nombreuses autres options de recherche, il peut donc répondre à vos besoins.
la source
Vous pouvez le faire passer en
strings
premier: -la source
strings file.pdf | grep <...>
, vous n'avez pas besoincat
strings
ougrep
.Jetez un coup d'œil à l'outil de ressources communes grep crgrep, qui prend en charge la recherche dans les fichiers PDF.
Il permet également de rechercher d'autres ressources telles que du contenu imbriqué dans des archives, des tables de base de données, des métadonnées de l'image, des dépendances de fichiers POM et des ressources Web, ainsi que des combinaisons de celles-ci, notamment la recherche récursive.
la source
essaye ça
pour l'impression des lignes, le motif apparaît à l'intérieur du pdf
la source
Allez dans votre dossier contenant votre fichier pdf et ensuite ..
ou si vous voulez chercher dans plus d'un fichier pdf (par exemple dans tous les fichiers pdf de votre dossier)
ou
la source
ls
sortie comme entrée pour d’autres commandes . Justepdfgrep 'pattern' *.pdf
est suffisantIl y a une question en double sur StackOverflow. Les gens là-bas suggèrent une variante de harish.venkarts répondent:
L'avantage sur la réponse similaire ici est le
--with-filename
drapeau pour grep. Ceci est également un peu supérieur à pdfgrep, car le grep standard a plus de fonctionnalités.https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
la source
Voici un script rapide pour la recherche pdf dans le répertoire actuel:
la source
Je suppose que vous voulez dire que vous ne voulez pas le convertir sur le disque, vous pouvez les convertir
stdout
puis le greppdftotext
. Grepping le pdf sans aucune sorte de conversion n'est pas une approche pratique puisqu'ilPDF
s'agit principalement d'un format binaire.Dans le répertoire:
ou dans le répertoire et ses sous-répertoires:
De plus, comme certaines
pdf
numérisations sont numérisées, elles doivent d'abord faire l'objet d'une reconnaissance optique. J'ai écrit un moyen assez simple de rechercher tous les fichiers PDF qui ne peuvent pas être éditésgrep
et OCR.J'ai remarqué que si un
pdf
fichier n'a aucune police, il est généralement impossible de le rechercher. Donc, sachant cela, nous pouvons utiliserpdffonts
.L'en
pdffonts
-tête de la table est composé des deux premières lignes . Ainsi, lorsqu'un fichier est interrogeable, il produit une sortie de plus de deux lignes. Sachant cela, nous pouvons créer:puis coller ceci
puis le rendre exécutable
puis répertoriez tous les fichiers PDF non interrogeables dans le répertoire:
ou dans le répertoire et ses sous-répertoires:
la source
Si vous souhaitez simplement rechercher des noms / propriétés au format PDF ... ou des chaînes simples qui ne sont ni compressées ni codées,
strings
vous pouvez utiliser la liste ci-dessous à la place deDe
grep --help
:et
cat --help
:la source
gpdf pourrait être ce dont vous avez besoin si vous utilisez Gnome! Cochez cette case si vous n'utilisez pas Gnome. Il contient une liste de lecteurs PDF CLI. Ensuite, vous pouvez utiliser
grep
pour trouver un motif.la source