Esiste un modo per cercare file PDF utilizzando la potenza di grep, senza prima convertirli in testo in Ubuntu?

Commenti

Risposta

Installa il pacchetto pdfgrep, quindi utilizza il comando:

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

—— ————

Il modo più semplice per farlo:

pdfgrep "pattern" *.pdf pdfgrep "pattern" file.pdf 

Commenti

  • Funziona anche in mac osx (Mavericks). Installalo usando brew. Semplice. Grazie.
  • Per curiosità ho controllato il sorgente di pdfgrep e utilizza poppler per estrarre le stringhe dal pdf. Quasi esattamente come @wag ‘ risponde solo a pagina anziché, presumibilmente, allintero documento.
  • pdfgrep anche ha un flag ricorsivo. Quindi questa risposta potrebbe forse essere ridotta a: pdfgrep -R pattern /path/. Anche se potrebbe essere meno efficace se analizza tutti i file anche se ‘ t un PDF. E ho notato che ha problemi con caratteri internazionali come å, ä e ö .
  • In realtà, lopzione -n è un vantaggio per pdfgrep in quanto consente di includere il numero di pagina nelloutput (potrebbe essere utile per ulteriori elaborazioni).
  • Questa risposta sarebbe più facile da usare se spiegasse quali bit del comando devono essere copiati letteralmente e quali sono segnaposto. Cosa ‘ è pattern? Cosa ‘ è {}? Che succede ‘ con il carattere “+”? Non ho idea della prima lettura … quindi vado alla pagina di manuale, suppongo.

Answer

Se hai poppler-utils installato (impostazione predefinita su Ubuntu Desktop), puoi “convertirlo” al volo e collegarlo a grep :

pdftotext my.pdf - | grep "pattern" 

Questo non creerà un file .txt.

Commenti

  • quindi .. estrai il testo prima di grep, il che significa che la risposta è ” no “.
  • @akira LOP probabilmente significava ” senza aprire il PDF in un visualizzatore ed esportarlo in testo ”
  • @akira Dove vedi ” solo grep “?
  • @akira Beh, ho già detto quello che penso probabilmente intendeva; non ‘ desidera esportare in testo prima di elaborarlo. Dubito fortemente che abbia un problema con qualsiasi comando che co si converte in testo in alcun modo; ‘ non cè motivo per non
  • @sherrellbc Il secondo argomento di pdftotext è il nome del file in cui scrivere . Tuttavia, per convenzione, gli strumenti in genere consentono di scrivere su stdout invece che su un file specificando invece un -. Allo stesso modo, alcuni strumenti scriverebbero in stdout per impostazione predefinita se si omette completamente un argomento del genere (ma ciò non è sempre possibile senza creare ambiguità).

Risposta

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

Cerca di essere per lo più compatibile con grep e quindi fornisce “la potenza di grep”, specializzato solo per i PDF. Ciò include le opzioni grep comuni, come --recursive, --ignore-case o --color.

A differenza di pdftotext | grep, pdfgrep può restituire il numero di pagina di una corrispondenza in modo efficiente ed è generalmente più veloce quando non deve cercare lintero documento (ad es. --max-count o --quiet).

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

Vedere la manpage per ulteriori informazioni.

Risposta

No.

Un pdf è costituito da blocchi di dati, alcuni di loro testo, alcuni di loro immagini e alcuni di loro XYZ di fantasia davvero magici (es. file .u3d). i blocchi sono il più delle volte compressi (ad es. flat, seleziona http://www.verypdf.com/pdfinfoeditor/compression.htm ). Per “grep” a . pdf hai hai per invertire la compressione, ovvero estrarre il testo.

Puoi farlo sia per file con strumenti come pdf2text e grep il risultato, oppure esegui un “indicizzatore” (guarda xapian.org o lucene ) che crea un indice ricercabile dai tuoi file .pdf e quindi puoi utilizzare il strumenti del motore di ricerca di quellindicizzatore per ottenere il contenuto del pdf.

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

Commenti

  • Considerando che pdfgrep esiste (vedi sopra), un ” no ” non è corretto.
  • @JonathanCross, considerando che la domanda dice ” utilizzando la potenza di grep, senza convertire prima in testo “, un piatto ” no ” è corretto.

Risposta

Recoll può eseguire ricerche nei PDF. Non supporta le espressioni regolari, ma ha molte altre opzioni di ricerca, quindi potrebbe soddisfare le tue esigenze.

Risposta

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 a una risposta simile qui è il --with-filename flag per grep. Anche questo è in qualche modo superiore a pdfgrep, perché lo standard grep ha più funzioni.

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

Commenti

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

Risposta

Dai unocchiata nello strumento grep delle risorse comuni crgrep che supporta la ricerca allinterno di file PDF.

Consente inoltre di cercare altre risorse come contenuti nidificati in archivi, database tavoli , metadati immagine, dipendenze da file POM e risorse web e combinazioni di questi, inclusa la ricerca ricorsiva.

Risposta

Potresti indirizzalo attraverso strings prima: –

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

Commenti

  • Utilizza strings file.pdf | grep <...>, ‘ non ti serve cat
  • Sì, la mia mente sembra funzionare meglio con i flussi … 🙂
  • non funzionerà se il testo è compresso, come nella maggior parte dei casi.
  • Anche se il testo non è compresso, è ‘ in genere piccoli pezzi di frasi (non necessariamente parole intere!) finemente mescolati con informazioni di formattazione. Non molto amichevole per strings o grep.
  • Ti viene in mente un altro motivo per cui usare le stringhe per questo non ‘ non funziona? Ho scoperto che luso delle stringhe funziona su alcuni PDF ma non su altri.

Risposta

prova questo

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

per stampare le righe il motivo si trova allinterno del pdf

Risposta

Ecco uno script veloce per la ricerca in 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" \; 

Commenti

  • Non posso modificarlo perché è troppo piccolo: il $1 nella chiamata di ricerca dovrebbe essere citato, altrimenti ‘ non funzionerà con la ricerca termini con spazi.
  • @ankon ha risolto il problema 🙂

Risposta

cd a la tua cartella contenente il tuo file pdf e poi ..

pdfgrep "pattern" your.pdf 

o se vuoi cercare in più di un solo file pdf (ad esempio in tutti i pdf- file nella cartella)

pdfgrep "pattern" `ls *.pdf` 

o

pdfgrep "pattern" $(ls *.pdf) 

Commenti

  • perché sulla terra usi ls per mettere i nomi dei file nei parametri? ‘ non solo è più lento, ma è anche una cattiva idea utilizzare ls output come linput ad altri comandi . Basta pdfgrep 'pattern' *.pdf è sufficiente
  • @phuclv Ti sbagli. pdfgrep 'pattern' *.pdf non funzionerà.
  • @ f0nzie ‘ ti sbagli. $(ls *.pdf) sarà quasi esattamente uguale a *.pdf, solo peggio perché speciale i file non sono protetti tra virgolette

Risposta

Presumo che tu intenda che tp non convertirlo sul disco, tu può convertirli in stdout e poi 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 pdf sono scansioni, devono prima essere sottoposte a OCR. Ho scritto un modo piuttosto semplice per cercare in tutti i PDF che non possono essere grep ed eseguire lOCR.

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

Le prime 2 righe del pdffonts sono lintestazione della tabella, quindi quando un file è ricercabile ha più di due righe di output, sapendo questo possiamo creare:

gedit check_pdf_searchable.sh 

quindi incolla questo

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

quindi rendilo eseguibile

chmod +x check_pdf_searchable.sh 

quindi elenca tutto 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 {} 

Risposta

Se vuoi solo cercare nomi / proprietà PDF … o stringhe semplici che non sono compresse o codificate, invece di strings puoi utilizzare il seguente

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 

Risposta

gpdf potrebbe essere ciò di cui hai bisogno se stai utilizzando Gnome ! Controlla questo nel caso in cui “non stai utilizzando Gnome. Ha un elenco di visualizzatori di pdf CLI. Quindi puoi utilizzare grep per trovare uno schema.

Risposta

 pdfgrep -r --include "*.pdf" -i "pattern"  

Commenti

  • Benvenuto nel sito e grazie per il tuo contributo. Potresti aggiungere qualche spiegazione su cosa significano queste opzioni? Questo potrebbe anche aiutare a spiegare in che modo il tuo approccio differisce da altre risposte a questa domanda che raccomandano anche pdfgrep.

Risposta

Il modo più veloce è

grep -rinw "pattern" --include \*.pdf * 

Commenti

  • Benvenuto nel sito. Ti dispiacerebbe aggiungere più spiegazioni alla tua soluzione proposta per renderla più accessibile ai non esperti? Ad esempio, la tua riga di comando grep esegue una ricerca ricorsiva in sottodirectory di cui qualcuno che non ha familiarità con grep potrebbe non essere a conoscenza. Inoltre, hai incluso il flag -i sebbene ignorare le maiuscole / minuscole potrebbe non essere sempre ciò che lutente desidera. Inoltre, spiega in che modo il tuo approccio differisce dalla risposta ad es. @phuclv e altri.
  • Come dice AdminBee, la domanda non richiede una ricerca senza distinzione tra maiuscole e minuscole o una ricerca di directory ricorsiva. Nemmeno le opzioni -n e -w sono giustificate dalla domanda. Ma, cosa più importante, questa risposta spiega come cercare nei file di testo i cui nomi terminano con .pdf: hai perso il punto della domanda.

Risposta

less mypdf.pdf | grep "Hello, World" 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *