Come posso grep in file PDF?


136

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


1
Penso che devi analizzarlo tu pdf2text per ottenere alcuni risultati utilizzabili ...
Johan


1
Per le persone che vengono qui tramite la ricerca: se sei disposto a convertirlo prima in file di testo, dai un'occhiata a Come cercare i contenuti di più file pdf?
Martin Thoma,

Risposte:


135

Installa il pacchetto pdfgrep, quindi usa il comando:

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

------

Il modo più semplice è

pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf 

5
Funziona anche con mac osx (Mavericks). Installalo usando brew. Semplice. Grazie.
Mikiemorales,

7
Per curiosità ho controllato la fonte di pdfgrep e usa poppler per estrarre stringhe dal pdf. Quasi esattamente come la risposta di @ wag solo a pagine piuttosto che, presumibilmente, l'intero documento.
Andrew Martin,

4
pdfgrepha anche una bandiera ricorsiva. Quindi questa risposta potrebbe forse essere ridotto a: pdfgrep -R pattern /path/. Potrebbe essere meno efficace se attraversa tutti i file anche se non è un PDF. E noto che ha problemi con personaggi internazionali come å, ä e ö.
Rovanion,

1
In realtà, l' -nopzione è un pro per pdfgrep in quanto consente di includere il numero di pagina nell'output (potrebbe essere utile per ulteriori elaborazioni).
JepZ,

4
Questa risposta sarebbe più facile da usare se spiegasse quali bit del comando devono essere copiati letteralmente e quali sono i segnaposto. Cosa pattern? Cosa {}? Che succede con il `+`? Non ho idea in prima lettura ... quindi vado alla manpage che vado, suppongo.
Mark Amery,

56

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

pdftotext my.pdf - | grep 'pattern'

Questo non creerà un file .txt.


1
quindi .. estrai il testo prima di selezionarlo, il che significa che la risposta è "no".
Akira,

18
@akira L'OP probabilmente significa "senza aprire il PDF in un visualizzatore ed esportare in testo"
Michael Mrozek

5
@akira Dove vedi "solo grep"?
Michael Mrozek

6
@akira Beh, ho già detto cosa penso che probabilmente intendesse; non vuole esportare in testo prima di elaborarlo. Dubito fortemente che abbia un problema con qualsiasi comando che converta in testo in alcun modo; non c'è motivo di non farlo
Michael Mrozek

2
@sherrellbc Il secondo argomento di pdftotextè il nome del file su cui dovrebbe scrivere. Tuttavia, per convenzione, gli strumenti in genere consentono di scrivere stdoutinvece che in un file specificando un -invece. Allo stesso modo, alcuni strumenti scriveranno di stdoutdefault se si omette del tutto un tale argomento (ma questo non è sempre possibile senza creare ambiguità).
Joost,

12

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

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

Al contrario 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 es. --max-countO --quiet).

L'utilizzo di base è:

pdfgrep PATTERN FILE..

dove si PATTERNtrova la stringa di ricerca e FILEun elenco di nomi di file (o caratteri jolly in una shell).

Vedi la manpage per maggiori informazioni.


7

No.

Un pdf è costituito da blocchi di dati, alcuni dei quali testo, alcuni dei quali immagini e alcuni dei quali davvero magici XYZ (ad es. File .u3d). Quei pezzi sono spesso compressi (es. Flat, controlla http://www.verypdf.com/pdfinfoeditor/compression.htm ). Al fine di 'grep' un .pdf si deve invertire la compressione alias estrarre il testo.

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

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


5
Considerando che pdfgrepesiste (vedi sopra), un "no" piatto non è corretto.
Jonathan Cross,

6

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


5

Potresti stringsprima convogliarlo : -

cat file.pdf | strings | grep <...etc...>

8
Basta usare strings file.pdf | grep <...>, non è necessariocat
phunehehe

Sì, la mia mente sembra funzionare meglio con i flussi ... :-)
Andy Smith il

12
non funzionerà se il testo è compresso, che è il più delle volte.
Akira,

6
Anche se il testo non è compresso, si tratta generalmente di piccole frasi (nemmeno necessariamente parole intere!) Finemente mescolate con informazioni di formattazione. Non molto amichevole per stringso grep.
Jander

Riesci a pensare a un altro motivo per cui usare le stringhe per questo non funzionerebbe? Ho scoperto che l'uso delle stringhe funziona su alcuni PDF ma non su altri.
ora

3

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

Inoltre, consente di cercare 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.


2

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

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)

perché mai usi ls per inserire i nomi dei file nei parametri? Non è solo più lento ma anche una cattiva idea usare l' lsoutput come input per altri comandi . Appena pdfgrep 'pattern' *.pdfè sufficiente
phuclv

1

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 è la --with-filenamebandiera 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


Penso che sarebbe stato meglio lasciare questo come commento (o modifica) nella risposta simile a cui ti riferisci.
Bernhard

0

Ecco uno script rapido per la ricerca di 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

Suppongo che intendi tp non convertirlo sul disco, puoi convertirlo in stdoute quindi grep con pdftotext. Grepping del 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"

Inoltre, poiché alcune pdfsono scansioni, devono prima essere OCR. Ho scritto un modo abbastanza semplice per cercare tutti i pdf che non possono essere grepeditati e OCR.

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

Le prime 2 righe di pdffontssono 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, stringspuoi invece usare le seguenti

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

Da 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

gpdf potrebbe essere quello che ti serve se stai usando Gnome! Controlla questo nel caso in cui non stai usando Gnome. Ha un elenco di visualizzatori PDF CLI. Quindi puoi usare grepper trovare qualche motivo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.