Existe-t-il un moyen de rechercher des fichiers PDF en utilisant la puissance de grep, sans convertir d'abord en texte dans Ubuntu?
Installez le package pdfgrep
, puis utilisez la commande:
find /path -iname '*.pdf' -exec pdfgrep pattern {} +
——————
Le moyen le plus simple de le faire:
pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf
Si tu as poppler-utils
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.
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 d'une correspondance de manière performante et est généralement plus rapide lorsqu'il n'a pas à rechercher tout le document (par exemple --max-count
ou --quiet
).
L'utilisation de base est:
pdfgrep PATTERN FILE..
où PATTERN
est votre chaîne de recherche et FILE
une liste de noms de fichiers (ou caractères génériques dans un shell).
Voir manpage pour plus d'informations.
Non.
Un pdf se compose de morceaux de données, certains d'entre eux du texte, des images et d'autres vraiment fantastiques XYZ (par exemple des fichiers .u3d). Ces morceaux sont la plupart du temps compressés (par exemple, flat, check 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, ou vous exécutez un 'indexeur' (regardez xapian.org ou lucene ) qui construit un index consultable à partir de vos fichiers .pdf puis vous pouvez utiliser les outils du moteur 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 au préalable.
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.
Vous pouvez tout d'abord passer par strings
: -
cat file.pdf | strings | grep <...etc...>
Jetez un œil à l'outil grep des ressources communes crgrep qui prend en charge la recherche dans les fichiers PDF.
Il permet également de rechercher d'autres ressources telles que 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 des combinaisons de celles-ci, y compris la recherche récursive.
Il y a une question en double sur StackOverflow. Les gens là-bas suggèrent une variante de la réponse de harish.venkarts:
find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;
L'avantage par rapport à la réponse similaire ici est le --with-filename
drapeau pour grep. C'est aussi quelque 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
essaye ça
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
pdftotext "$i" - | grep pattern; done
pour l'impression des lignes, le motif se produit à l'intérieur du pdf
cd dans votre dossier contenant votre fichier pdf et puis ..
pdfgrep 'pattern' your.pdf
ou si vous souhaitez rechercher dans plusieurs fichiers PDF (par exemple dans tous les fichiers PDF de votre dossier)
pdfgrep 'pattern' `ls *.pdf`
ou
pdfgrep 'pattern' $(ls *.pdf)
Voici un script rapide pour rechercher un 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 \;
gpdf pourrait être ce dont vous avez besoin si vous utilisez Gnome! Vérifiez ceci au cas où vous n'utilisez pas Gnome. Il contient une liste de visualiseurs PDF CLI. Ensuite, vous pouvez utiliser grep
pour trouver un modèle.
Je suppose que vous voulez dire que tp ne le convertit pas sur le disque, vous pouvez les convertir en stdout
puis le grep avec pdftotext
. Grabper le pdf sans aucune sorte de conversion n'est pas une approche pratique car PDF
est principalement un format binaire.
Dans l'annuaire:
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, comme certains pdf
sont des analyses, ils doivent d'abord être OCR. J'ai écrit un moyen assez simple de rechercher tous les fichiers PDF qui ne peuvent pas être grep
ed et de les OCR.
J'ai remarqué que si un fichier pdf
n'a pas de police, il n'est généralement pas consultable. Donc, sachant cela, nous pouvons utiliser pdffonts
.
Les 2 premières lignes du pdffonts
sont l'en-tête du tableau, donc quand un fichier est consultable 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 le rendre exécutable
chmod +x check_pdf_searchable.sh
puis répertoriez tous les 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 {}
Si vous souhaitez simplement rechercher des noms/propriétés de pdf ... ou des chaînes simples qui ne sont pas compressées ou encodées, 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