Existuje způsob, jak prohledávat soubory PDF pomocí funkce grep, aniž byste nejprve převedli na text v Ubuntu?

Komentáře

Odpovědět

Nainstalujte balíček pdfgrep a poté použijte příkaz:

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

—— ————

Nejjednodušší způsob, jak toho dosáhnout:

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

Komentáře

  • Toto funguje také v mac osx (Mavericks). Nainstalujte jej pomocí brew. Jednoduchý. Díky.
  • Ze zvědavosti jsem zkontroloval zdroj pdfgrep a používá poppler k extrahování řetězců z pdf. Téměř přesně jako odpověď @wag ‚ pouze na stránce, spíše než celý dokument.
  • pdfgrep má rekurzivní příznak. Tuto odpověď by tedy bylo možné zredukovat na: pdfgrep -R pattern /path/. I když to může být méně efektivní, pokud projde každým souborem, i když to není ‚ t PDF. Všiml jsem si, že má problémy s mezinárodními znaky, jako jsou å, ä a ö .
  • Možnost -n je ve skutečnosti pro pdfgrep, protože umožňuje zahrnout do výstupu číslo stránky (může být užitečné pro další zpracování).
  • Tato odpověď by byla snadnější, kdyby vysvětlila, které bity příkazu jsou určeny ke kopírování doslovně a které jsou zástupné symboly. Co ‚ s pattern? Co ‚ s {}? Co ‚ s „+`? Nemám tušení při prvním přečtení … takže na stránce, kterou jdu, předpokládám.

Odpověď

Pokud máte poppler-utils nainstalován (výchozí pro Ubuntu Desktop), můžete jej „převést“ za běhu a poslat jej potrubím na grep :

pdftotext my.pdf - | grep "pattern" 

Tím se nevytvoří soubor .txt.

Komentáře

  • takže .. extrahujete text před jeho pozdravem, což znamená, že odpověď je “ no „.
  • @akira OP pravděpodobně znamenalo “ bez otevření souboru PDF v prohlížeči a exportu do textu “
  • @akira Kde vidíte “ pouze grep „?
  • @akira Už jsem řekl, co si myslím pravděpodobně to myslel; před zpracováním nechce ‚ exportovat do textu. Velmi pochybuji, že má problém s jakýmkoli příkazem, který nverts na text jakýmkoli způsobem; ‚ není důvod ne
  • @sherrellbc Druhým argumentem pdftotext je název souboru, do kterého by měl zapisovat . Podle konvence však nástroje obvykle umožňují zapisovat do stdout místo do souboru tak, že místo toho zadáte -. Podobně by některé nástroje ve výchozím nastavení zapisovaly na stdout, pokud takový argument zcela vynecháte (ale bez vytvoření nejednoznačnosti to není vždy možné).

Odpověď

pdfgrep byl napsán přesně pro tento účel a je k dispozici v Ubuntu.

Snaží se být většinou kompatibilní s grep a poskytuje tak „sílu grepu“, specializovanou pouze na soubory PDF. To zahrnuje běžné možnosti grep, například --recursive, --ignore-case nebo --color.

Na rozdíl od pdftotext | grep může pdfgrep výkonným způsobem vygenerovat číslo stránky shody a je obecně rychlejší, když nemusí prohledávat celý dokument (např. --max-count nebo --quiet).

Základní použití je:

pdfgrep PATTERN FILE.. 

kde PATTERN je váš vyhledávací řetězec a FILE seznam názvů souborů (nebo zástupných znaků v shellu).

Další informace najdete na stránce .

Odpovědět

Ne.

Soubor PDF se skládá z kusů dat, z nichž některé jsou textové, jiné obrázky a některé opravdu kouzelné fantazie XYZ (např. soubory .u3d). bloky jsou většinou komprimovány (např. ploché, zaškrtněte http://www.verypdf.com/pdfinfoeditor/compression.htm ). Chcete-li „grep“ a . pdf máte pro zrušení komprese aka extrahování textu.

Můžete to udělat buď na soubor pomocí nástrojů, jako je pdf2text, a výsledek pozdravit, nebo spustit „indexer“ (podívejte se na xapian.org nebo lucene ), který vytvoří z vašich souborů .pdf prohledávatelný index a poté můžete použít nástroje vyhledávače tohoto indexeru pro získání obsahu pdf.

Ale ne, nemůžete grep soubory PDF a doufat ve spolehlivé odpovědi bez extrahování textu první.

Komentáře

  • Vzhledem k tomu, že pdfgrep existuje (viz výše), je plochý “ no “ není správný.
  • @JonathanCross, vzhledem k otázce “ pomocí síly grepu, aniž byste nejprve převedli na text „, plochý “ no “ je správné.

odpověď

Odvolání může vyhledávat soubory PDF. Nepodporuje regulární výrazy, ale má mnoho dalších možností vyhledávání, takže by to mohlo vyhovovat vašim potřebám.

Odpovědět

Na StackOverflow existuje duplicitní otázka. Lidé tam navrhují variaci harish.venkarts odpovědi:

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

Výhodou oproti podobné odpovědi zde je --with-filename příznak pro grep. To je také o něco lepší než pdfgrep, protože standardní grep má více funkcí.

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

Komentáře

  • Myslím, že by bylo lepší toto opustit jako komentář (nebo úpravu) v podobné odpovědi, na kterou odkazujete.

Odpověď

Podívejte se na běžném nástroji grep crgrep , který podporuje vyhledávání v souborech PDF.

Umožňuje také vyhledávat další zdroje, jako je obsah vnořený v archivech, databázi tabulky , metadata obrázků, závislosti souborů POM a webové zdroje – a jejich kombinace včetně rekurzivního vyhledávání.

Odpověď

Mohli byste nejdříve to projděte strings: –

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

Komentáře

  • Stačí použít strings file.pdf | grep <...>, ‚ nepotřebujete cat
  • Ano – zdá se, že moje mysl funguje lépe s proudy … 🙂
  • Nefunguje, pokud je text komprimován, což je většinou.
  • I když text je nekomprimovaný, ‚ s obecně malými kousky vět (dokonce ani ne nutně celými slovy!) jemně smíchanými s formátovacími informacemi. Není příliš přátelský pro strings nebo grep.
  • Napadá vás další důvod, proč by použití řetězců pro toto nebylo ‚ nefunguje? Zjistil jsem, že používání řetězců funguje na některých souborech PDF, ale na jiných ne.

Odpovědět

zkusit to

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

pro tisk řádků se vzor vyskytuje uvnitř souboru PDF

Odpověď

Zde je rychlý skript pro vyhledávání pdf v aktuálním adresáři:

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

Komentáře

  • To nemohu upravit kvůli tomu, že je málo: $1 v vyvolání nálezu by měl být citován, jinak by to ‚ nefungovalo s vyhledáváním výrazy s mezerami.
  • @ankon to opravil 🙂

odpověď

cd to složku obsahující soubor pdf a poté ..

pdfgrep "pattern" your.pdf 

nebo pokud chcete vyhledávat ve více než jednom souboru PDF (např. ve všech souborech pdf- soubory ve vaší složce)

pdfgrep "pattern" `ls *.pdf` 

nebo

pdfgrep "pattern" $(ls *.pdf) 

Komentáře

  • proč na Zemi používáte ls k tomu, abyste dali názvy souborů do parametrů? ‚ Je nejen pomalejší, ale i špatný nápad použít ls výstup jako vstup do dalších příkazů . Jen pdfgrep 'pattern' *.pdf stačí
  • @phuclv Vaše se mýlí. pdfgrep 'pattern' *.pdf nebude fungovat.
  • @ f0nzie se ‚ mýlíte. $(ls *.pdf) bude téměř přesně stejný jako *.pdf, jen horší, protože speciální soubory nejsou chráněny v uvozovkách

odpověď

Předpokládám, že tím myslíte, že to tp na disku nepřemění, je může převést na stdout a poté jej pozdravit pomocí pdftotext. Grepování pdf bez jakéhokoli převodu není praktický přístup, protože PDF je většinou binární formát.

V adresáři:

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

nebo v adresáři a jeho podadresářích:

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

Také proto, že některé pdf jsou skeny, je třeba je nejprve OCRovat. Napsal jsem docela jednoduchý způsob, jak prohledat všechny soubory PDF, které nelze grep upravit, a OCR je.

Všiml jsem si, zda je pdf nemá žádné písmo, které obvykle nelze prohledávat. Takže pokud to víme, můžeme použít pdffonts.

První 2 řádky pdffonts jsou záhlaví tabulky, takže když je soubor prohledávatelný, má více než dva řádkové výstupy, protože to můžeme vytvořit:

gedit check_pdf_searchable.sh 

vložte toto

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

a poté jej spusťte

chmod +x check_pdf_searchable.sh 

a poté uveďte všechny neprohledatelné soubory PDF v adresáři:

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

nebo v adresáři a jeho podadresářích:

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

Odpověď

Pokud chcete pouze hledat názvy / vlastnosti pdf … nebo jednoduché řetězce, které nejsou komprimovány ani kódovány, pak místo strings můžete použít níže

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

From 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 

and cat --help:

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

Odpověď

gpdf může být to, co potřebujete, pokud používáte Gnome ! Pokud nepoužíváte Gnome, zkontrolujte toto . Obsahuje seznam prohlížečů formátu CLI ve formátu PDF. Poté můžete pomocí grep najít nějaký vzor.

Odpovědět

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

Komentáře

  • Vítejte na webu a děkuji vám za váš příspěvek. Můžete přidat vysvětlení, co tyto možnosti znamenají? To by také mohlo pomoci vysvětlit, jak se váš přístup liší od ostatních odpovědí na tuto otázku, které také doporučují pdfgrep.

Odpověď

Nejrychlejší způsob je

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

Komentáře

  • Vítejte na stránkách. Vadilo by vám přidat další vysvětlení k navrhovanému řešení, aby bylo přístupnější pro neodborníky? Například váš grep příkazový řádek vyhledává rekurzivně v podadresářích, o kterých by někdo, kdo není grep, nevěděl. Zahrnuli jste také příznak -i, i když ignorování případu nemusí vždy být tím, co uživatel chce. Kromě toho prosím vysvětlete, v čem se váš přístup liší od odpovědi např. @phuclv a další.
  • Jak říká AdminBee, otázka nepožaduje vyhledávání bez ohledu na velikost písmen nebo rekurzivní vyhledávání v adresáři. Možnosti -n a -w nejsou touto otázkou odůvodněny. Ale co je důležitější, tato odpověď říká, jak prohledávat textové soubory, jejichž jména končí na .pdf – unikl vám smysl otázky.

Odpověď

less mypdf.pdf | grep "Hello, World" 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *