Is er een manier om PDF-bestanden te doorzoeken met de kracht van grep, zonder eerst naar tekst te converteren in Ubuntu?

Opmerkingen

Antwoord

Installeer het pakket pdfgrep en gebruik vervolgens het commando:

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

—— ————

Eenvoudigste manier om dat te doen:

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

Reacties

  • Dit werkt ook in mac osx (Mavericks). Installeer het met brouwsel. Gemakkelijk. Bedankt.
  • Uit nieuwsgierigheid heb ik de bron van pdfgrep gecontroleerd en het gebruikt poppler om strings uit de pdf te extraheren. Bijna precies zoals @wag ‘ s antwoord alleen paginagewijs in plaats van, vermoedelijk, het hele document.
  • pdfgrep ook heeft een recursieve vlag. Dus dit antwoord kan misschien worden teruggebracht tot: pdfgrep -R pattern /path/. Hoewel het misschien minder effectief is als het door elk bestand gaat, zelfs als het geen ‘ t een PDF is. En ik merk dat het problemen heeft met internationale tekens zoals å, ä en ö .
  • Eigenlijk is de optie -n een pro voor pdfgrep omdat het het mogelijk maakt om het paginanummer op te nemen in de uitvoer (kan handig zijn voor verdere verwerking).
  • Dit antwoord zou gemakkelijker te gebruiken zijn als het zou uitleggen welke bits van het commando letterlijk moeten worden gekopieerd en welke tijdelijke aanduidingen zijn. Welke ‘ s pattern? Welke ‘ s {}? Wat is ‘ aan de hand met de `+`? Ik heb geen idee bij de eerste lezing … dus ga naar de manpagina die ik ga, denk ik.

Antwoord

Als je poppler-utils hebt geïnstalleerd (standaard op Ubuntu Desktop), kun je het direct “converteren” en naar grep :

pdftotext my.pdf - | grep "pattern" 

Dit zal “geen .txt-bestand maken.

Reacties

  • dus .. je extraheert de tekst voordat je hem grept, wat betekent dat het antwoord ” nee ” is.
  • @akira Het OP betekende waarschijnlijk ” zonder de pdf te openen in een viewer en te exporteren naar tekst ”
  • @akira Waar zie je ” grep alleen “?
  • @akira Nou, ik heb al gezegd wat ik denk hij bedoelde waarschijnlijk; hij ‘ wil niet naar tekst exporteren voordat hij deze verwerkt. Ik betwijfel ten zeerste of hij een probleem heeft met enig commando dat co nverts naar tekst op enigerlei wijze; daar ‘ is er geen reden om het niet te doen
  • @sherrellbc Het tweede argument van pdftotext is de bestandsnaam waarnaar het moet schrijven . Volgens afspraak kunt u met tools echter meestal naar stdout schrijven in plaats van naar een bestand door in plaats daarvan een - op te geven. Op dezelfde manier schrijven sommige tools standaard naar stdout als je zon argument helemaal weglaat (maar dit is niet altijd mogelijk zonder dubbelzinnigheid te creëren).

Answer

pdfgrep is precies voor dit doel geschreven en is beschikbaar in Ubuntu.

Het probeert grotendeels compatibel te zijn met grep en biedt dus “de kracht van grep”, alleen gespecialiseerd voor PDFs. Dat omvat veelgebruikte grep-opties, zoals --recursive, --ignore-case of --color.

In tegenstelling tot pdftotext | grep, kan pdfgrep het paginanummer van een overeenkomst op een performante manier uitvoeren en is over het algemeen sneller wanneer het niet het hele document hoeft te doorzoeken (bijv. --max-count of --quiet).

Het basisgebruik is:

pdfgrep PATTERN FILE.. 

waarbij PATTERN uw zoekreeks is en FILE een lijst met bestandsnamen (of jokertekens in een shell).

Zie de manpage voor meer informatie.

Antwoord

Nee.

Een pdf bestaat uit stukjes gegevens, sommige uit tekst, sommige met afbeeldingen en sommige met echt magisch mooie XYZ (bijv. .u3d-bestanden). brokken zijn meestal gecomprimeerd (bijv. plat, vink http://www.verypdf.com/pdfinfoeditor/compression.htm aan). Om een . pdf die je hebt om de compressie om te keren oftewel de tekst te extraheren.

Je kunt dat ofwel per bestand doen met tools zoals pdf2text en grep het resultaat, of je voert een “indexer” uit (kijk naar xapian.org of lucene ) die een doorzoekbare index opbouwt uit uw .pdf-bestanden en dan kunt u de zoekmachine tools van die indexer om de inhoud van de pdf te krijgen.

Maar nee, je kunt geen grep pdf-bestanden en hopen op betrouwbare antwoorden zonder de tekst te extraheren eerste.

Reacties

  • Aangezien pdfgrep bestaat (zie hierboven), een platte ” nee ” is onjuist.
  • @JonathanCross, aangezien de vraag ” is met de kracht van grep, zonder eerst naar tekst te converteren “, een platte ” nee ” is correct.

Antwoord

Recoll kan PDFs doorzoeken. Het ondersteunt geen reguliere expressies, maar het heeft veel andere zoekopties, dus het kan aan uw behoeften voldoen.

Antwoord

Er is een dubbele vraag op StackOverflow. De mensen daar suggereren een variant van het antwoord van harish.venkarts:

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

Het voordeel ten opzichte van het vergelijkbare antwoord hier is het --with-filename vlag voor grep. Dit is ook enigszins superieur aan pdfgrep, omdat de standaard grep meer mogelijkheden heeft.

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

Reacties

  • Ik denk dat het beter was geweest om dit achter te laten als een opmerking (of bewerk) in het vergelijkbare antwoord waarnaar u verwijst.

Antwoord

Kijk eens op de algemene resource grep-tool crgrep die zoeken in PDF-bestanden ondersteunt.

Het maakt het ook mogelijk om andere bronnen te doorzoeken, zoals inhoud genest in archieven, database tafels , afbeeldingsmetagegevens, POM-bestandsafhankelijkheden en webbronnen – en combinaties hiervan inclusief recursief zoeken.

Antwoord

Je zou kunnen leid het door strings eerst: –

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

Reacties

  • Gebruik gewoon strings file.pdf | grep <...>, je hebt ‘ geen cat
  • nodig

  • Ja – mijn geest lijkt beter te werken met streams … 🙂
  • werkt niet als tekst is gecomprimeerd, wat meestal het geval is.
  • Zelfs als de tekst is niet gecomprimeerd, het ‘ is over het algemeen kleine stukjes zinnen (niet eens noodzakelijk hele woorden!) die fijn vermengd zijn met opmaakinformatie. Niet erg vriendelijk voor strings of grep.
  • Kun je een andere reden bedenken waarom het gebruik van strings hiervoor niet ‘ werkt het niet? Ik ontdekte dat het gebruik van strings op sommige pdfs werkt, maar niet op andere.

Answer

probeer dit

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

voor het afdrukken van de lijnen komt het patroon voor in de pdf

Antwoord

Hier is een snel script voor het zoeken naar pdf in de huidige directory:

#!/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" \; 

Reacties

  • Ik kan dit niet bewerken omdat ik te klein ben: de $1 in de aanroep voor zoeken moet worden geciteerd, anders zal ‘ niet werken met zoeken termen met spaties.
  • @ankon heeft het opgelost 🙂

Antwoord

cd naar uw map met uw pdf-bestand en dan ..

pdfgrep "pattern" your.pdf 

of als u in meer dan één pdf-bestand wilt zoeken (bijv. in alle pdf- bestanden in uw map)

pdfgrep "pattern" `ls *.pdf` 

of

pdfgrep "pattern" $(ls *.pdf) 

Reacties

  • waarom gebruik je in vredesnaam ls om bestandsnamen in parameters te plaatsen? Het ‘ is niet alleen langzamer, maar ook een slecht idee om ls uitvoer te gebruiken als de invoer van andere opdrachten . Alleen pdfgrep 'pattern' *.pdf is genoeg.
  • @phuclv Je hebt het mis. pdfgrep 'pattern' *.pdf zal niet werken.
  • @ f0nzie je ‘ heeft het mis. $(ls *.pdf) zal bijna exact hetzelfde zijn als *.pdf, alleen slechter omdat speciaal bestanden zijn niet beschermd tussen aanhalingstekens

Answer

Ik neem aan dat je bedoelt dat je het niet naar de schijf converteert, je kan ze converteren naar stdout en het vervolgens grepen met pdftotext. Grepping van de pdf zonder enige vorm van conversie is geen praktische benadering aangezien PDF meestal een binair formaat is.

In de map:

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

of in de map en zijn submappen:

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

Ook omdat sommige pdf scans zijn, moeten ze eerst worden herkend. Ik heb een vrij eenvoudige manier geschreven om alle pdfs te doorzoeken die niet grep ed kunnen zijn en ze te OCRen.

Ik merkte dat een pdf -bestand heeft geen lettertype, het is meestal niet doorzoekbaar. Dus wetende dat we pdffonts kunnen gebruiken.

Eerste 2 regels van de pdffonts zijn de tabelkop, dus als een bestand doorzoekbaar is, heeft het meer dan twee regels uitvoer, wetende dat we dit kunnen maken:

gedit check_pdf_searchable.sh 

plak dit dan

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

maak het dan uitvoerbaar

chmod +x check_pdf_searchable.sh 

en maak een lijst van alle niet-doorzoekbare pdfs in de directory:

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

of in de directory en zijn subdirectorys:

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

Antwoord

Als u alleen naar pdf-namen / -eigenschappen wilt zoeken … of eenvoudige strings die niet zijn gecomprimeerd of gecodeerd, in plaats van strings je kunt het onderstaande gebruiken

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

Van 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 

en cat --help:

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

Antwoord

gpdf is misschien wat je nodig hebt als je Gnome gebruikt ! Controleer dit voor het geval je “Gnome niet gebruikt. Het heeft een lijst met CLI pdf-viewers. Dan kun je grep gebruiken om een patroon te vinden.

Antwoord

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

Reacties

  • Welkom op de site en bedankt u voor uw bijdrage. Kunt u wat uitleg toevoegen over wat deze opties betekenen? Dit kan ook helpen verklaren hoe uw benadering verschilt van andere antwoorden op deze vraag die ook pdfgrep aanbevelen.

Antwoord

De snelste manier is

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

Reacties

  • Welkom op de site. Zou u het erg vinden om meer uitleg toe te voegen aan uw voorgestelde oplossing om deze toegankelijker te maken voor niet-experts? Uw grep opdrachtregel zoekt bijvoorbeeld recursief in submappen waarvan iemand die niet bekend is met grep wellicht niet weet. Je hebt ook de vlag -i toegevoegd, hoewel het negeren van de hoofdletter niet altijd is wat de gebruiker wil. Leg daarnaast uit op welke manier uw aanpak verschilt van de vraag van bijv. @phuclv en anderen.
  • Zoals AdminBee zegt, is de vraag niet hoofdlettergevoelig of recursief zoeken in de directory. De -n en -w opties worden ook niet gerechtvaardigd door de vraag. Maar wat nog belangrijker is, dit antwoord vertelt hoe je door tekstbestanden kunt zoeken waarvan de naam eindigt op .pdf – je hebt het punt van de vraag gemist.

Antwoord

less mypdf.pdf | grep "Hello, World" 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *