it-swarm.it

Come posso grep in PDF?

C'è un modo per cercare PDF usando la potenza di grep, senza prima convertirli in testo in Ubuntu?

160
Dervin Thunk

Installa il pacchetto pdfgrep, quindi usa il comando:

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

------

Il modo più semplice per farlo:

pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf 
164
enzotib

Se hai poppler-utils installato (impostazione predefinita su Ubuntu Desktop), è possibile "convertirlo" al volo e reindirizzarlo a grep:

pdftotext my.pdf - | grep 'pattern'

Questo non creerà un file .txt.

63
wag

pdfgrep è stato scritto proprio per questo scopo ed è disponibile in Ubuntu.

Cerca di essere per lo più compatibile con grep e quindi fornisce "il potere di grep", specializzato solo per i PDF. Ciò include opzioni grep comuni, come --recursive, --ignore-case o --color.

In contrasto con pdftotext | grep, pdfgrep può generare il numero di pagina di una corrispondenza in modo performante ed è generalmente più veloce quando non deve cercare l'intero documento (ad esempio --max-count o --quiet).

L'utilizzo di base è:

pdfgrep PATTERN FILE..

dove PATTERN è la stringa di ricerca e FILE un elenco di nomi di file (o caratteri jolly in una shell).

Vedi manpage per maggiori informazioni.

16
hpdeifel

No.

Un pdf è costituito da blocchi di dati, alcuni dei quali testo, alcuni dei quali immagini e alcuni dei quali davvero magici XYZ (es. File .u3d). Quei pezzi sono spesso compressi (es. Flat, check http://www.verypdf.com/pdfinfoeditor/compression.htm ). Per "grep" un .pdf devi avere per invertire la compressione o estrarre il testo.

Puoi farlo per file con strumenti come pdf2text e grep il risultato, oppure esegui un 'indicizzatore' (guarda xapian.org o lucene ) che costruisce un indice ricercabile dai tuoi file .pdf e poi puoi utilizzare gli strumenti del motore di ricerca di quell'indicizzatore per ottenere il contenuto del pdf.

Ma no, non puoi grep file pdf e sperare in risposte affidabili senza estrarre prima il testo.

7
akira

Recoll può cercare PDF. Non supporta le espressioni regolari, ma ha molte altre opzioni di ricerca, quindi potrebbe adattarsi alle tue esigenze.

6
user39336

È possibile reindirizzarlo prima tramite strings: -

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

Dai un'occhiata allo strumento grep delle risorse comuni crgrep che supporta la ricerca all'interno dei file PDF.

Consente inoltre la ricerca di altre risorse come contenuto nidificato in archivi, tabelle di database, metadati di immagini, dipendenze di file POM e risorse Web - e combinazioni di queste tra cui la ricerca ricorsiva.

3
Craig

C'è una domanda duplicata su StackOverflow. Le persone lì suggeriscono una variazione della risposta di harish.venkarts:

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

Il vantaggio rispetto alla risposta simile qui è il --with-filename flag per grep. Questo è in qualche modo superiore a pdfgrep, perché grep standard ha più funzionalità.

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

2
user7610

prova questo

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

per la stampa delle linee il motivo si presenta all'interno del pdf

2
harish.venkat

cd nella cartella contenente il file pdf e quindi ..

pdfgrep 'pattern' your.pdf

o se vuoi cercare in più di un solo file pdf (ad es. in tutti i file pdf nella tua cartella)

pdfgrep 'pattern'  `ls *.pdf`

o

pdfgrep 'pattern' $(ls *.pdf)
2
Rasmuss Rall

Ecco uno script veloce per la ricerca pdf nella directory corrente:

#!/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 potrebbe essere quello che ti serve se stai usando Gnome! Seleziona questo nel caso in cui non utilizzi Gnome. Ha un elenco di visualizzatori PDF CLI. Quindi puoi usare grep per trovare qualche motivo.

0
Dharmit

Suppongo che intendi tp non convertirlo sul disco, puoi convertirli in stdout e quindi grep con pdftotext. Greppare il pdf senza alcun tipo di conversione non è un approccio pratico poiché PDF è principalmente un formato binario.

Nella directory:

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

o nella directory e nelle sue sottodirectory:

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

Anche perché alcune pdf sono scansioni, devono prima essere OCR. Ho scritto un modo abbastanza semplice per cercare tutti i pdf che non possono essere greped e OCR.

Ho notato che se un file pdf non ha alcun carattere, di solito non è ricercabile. Quindi, sapendo questo, possiamo usare pdffonts.

Le prime 2 righe di pdffonts sono l'intestazione della tabella, quindi quando un file è ricercabile ha più di due righe di output, sapendo che possiamo creare:

gedit check_pdf_searchable.sh

quindi incollalo

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

quindi renderlo eseguibile

chmod +x check_pdf_searchable.sh

quindi elenca tutti i pdf non ricercabili nella directory:

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

o nella directory e nelle sue sottodirectory:

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

Se vuoi solo cercare nomi/proprietà pdf ... o semplici stringhe che non sono compresse o codificate, allora invece di strings puoi usare il seguente

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

A partire dal 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

e cat --help:

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