Existuje způsob, jak prohledávat soubory PDF pomocí funkce grep, aniž byste nejprve převedli na text v Ubuntu?
Komentáře
- Viz také Existuje nějaký formát PDF pro převádění textu? a Nástroj příkazového řádku pro vyhledávání frází ve velkém počtu souborů PDF .
- Pro lidi, kteří sem přicházejí pomocí vyhledávání: Pokud jste ochotni jej nejprve převést na textové soubory, připravte si podívejte se na Jak vyhledávat obsah více souborů PDF?
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 dostdout
místo do souboru tak, že místo toho zadáte-
. Podobně by některé nástroje ve výchozím nastavení zapisovaly nastdout
, 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řebujetecat
- 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
nebogrep
. - 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ů . Jenpdfgrep '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"