Existuje způsob, jak prohledávat PDF soubory pomocí síly grepu, bez převodu na text nejprve v Ubuntu?
Nainstalujte balíček pdfgrep
, pak 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
Pokud máte poppler-utils
nainstalován (výchozí na Ubuntu Desktop), můžete jej „převést“ za chodu a poslat do grep
:
pdftotext my.pdf - | grep 'pattern'
Tím se nevytvoří soubor TXT.
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 PDF. To zahrnuje běžné možnosti grepu, například --recursive
, --ignore-case
nebo --color
.
Na rozdíl od pdftotext | grep
, pdfgrep může vydat číslo stránky zápasu výkonným způsobem 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ů ve skořápce).
Více informací naleznete v manpage .
Ne.
PDF sestává z kousků dat, z nichž některé jsou textové, některé z nich obrázky a některé z nich opravdu kouzelné fantastické XYZ (např. Soubory .u3d). Tyto kousky jsou většinou zkomprimovány (např. Byt, zaškrtněte http://www.verypdf.com/pdfinfoeditor/compression.htm ). Aby bylo možné „grep“ a .pdf, musíte převrátit kompresi aka extrahovat text.
Můžete to udělat pro každý soubor pomocí nástrojů, jako je pdf2text
a grep výsledek, nebo spustíte 'indexer' (podívejte se na xapian.org nebo lucene ), který z vašich souborů PDF vytvoří vyhledávací index a poté můžete použít nástroje vyhledávače tohoto indexátoru k získání obsahu pdf.
Ale ne, nemůžete grep
pdf soubory a doufat v spolehlivé odpovědi, aniž byste nejprve extrahovali text.
Recoll umí prohledávat PDF. Nepodporuje regulární výrazy, ale má spoustu dalších možností vyhledávání, takže by vyhovovalo vašim potřebám.
Dalo by se to nejprve protlačit skrz strings
: -
cat file.pdf | strings | grep <...etc...>
Podívejte se na běžný nástroj grep zdrojů crgrep , který podporuje vyhledávání v PDF souborech).
Umožňuje také prohledávání dalších zdrojů, jako je obsah vnořený v archivech, databázových tabulkách, obrazových metadat, závislostí souborů POM a webových zdrojů - a jejich kombinací, včetně rekurzivního vyhledávání.
Na StackOverflow je duplicitní otázka. Lidé tam navrhují variantu odpovědi harish.venkarts:
find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;
Výhodou oproti podobné odpovědi je --with-filename
příznak grep. Toto je poněkud lepší než pdfgrep, protože standardní grep má více funkcí.
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
zkuste to
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
pdftotext "$i" - | grep pattern; done
pro tisk čar se vzor vyskytuje uvnitř pdf
cD do složky obsahující váš soubor PDF a poté ..
pdfgrep 'pattern' your.pdf
nebo pokud chcete hledat ve více než jednom souboru PDF (např. ve všech souborech PDF ve složce)
pdfgrep 'pattern' `ls *.pdf`
nebo
pdfgrep 'pattern' $(ls *.pdf)
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 \;
gpdf může být to, co potřebujete, pokud používáte Gnome! Zkontrolujte toto pro případ, že nepoužíváte Gnome. Má seznam prohlížečů CLI pdf. Potom můžete pomocí grep
najít nějaký vzor.
Předpokládám, že máte na mysli tp, že jej na disku nepřevedete, můžete je převést na stdout
a poté grep 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 skenování, musí být nejprve OCRed. Napsal jsem docela jednoduchý způsob, jak prohledávat všechny soubory PDF, které nelze grep
ed, a OCR je.
Všiml jsem si, že soubor pdf
nemá žádné písmo, které obvykle nelze prohledávat. S vědomím toho můžeme použít pdffonts
.
První 2 řádky pdffonts
jsou záhlaví tabulky, takže když je prohledávatelný soubor, má více než dva řádkové výstupy.
gedit check_pdf_searchable.sh
pak to vložte
#!/bin/bash
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1"
fi
pak je spustitelný
chmod +x check_pdf_searchable.sh
pak seznam všech nehledatelných souborů 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 {}
Pokud chcete hledat pouze pdf jména/vlastnosti ... nebo jednoduché řetězce, které nejsou komprimované nebo kódované, pak místo strings
můžete použít níže
grep -a STRING file.pdf
cat -v file.pdf | grep STRING
Z 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
a cat --help
:
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB