web-dev-qa-db-fra.com

Comment puis-je grep dans les fichiers PDF?

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

160
Dervin Thunk

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 
164
enzotib

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.

63
wag

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..

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.

16
hpdeifel

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.

7
akira

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.

6
user39336

Vous pouvez tout d'abord passer par strings: -

cat file.pdf | strings | grep <...etc...>
4
Andy Smith

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.

3
Craig

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

2
user7610

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

2
harish.venkat

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)
2
Rasmuss Rall

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 \;
0
Nico

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.

0
Dharmit

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 greped 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 {}
0
Eduard Florinescu

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
0
phuclv