it-swarm-tr.com

PDF dosyalarında nasıl grep yapabilirim?

Ubuntu'da önce metne dönüştürmeden grep'in gücünü kullanarak PDF dosyalarında arama yapmanın bir yolu var mı?

160
Dervin Thunk

pdfgrep paketini kurun, ardından şu komutu kullanın:

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

------

Bunu yapmanın en basit yolu:

pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf 
164
enzotib

poppler-utils Yüklüyse (Ubuntu Masaüstünde varsayılan olarak), onu "dönüştürebilir" ve grep'e yönlendirebilirsiniz:

pdftotext my.pdf - | grep 'pattern'

Bu bir .txt dosyası oluşturmaz.

63
wag

pdfgrep tam olarak bu amaçla yazılmıştır ve Ubuntu'da mevcuttur.

Çoğunlukla grep ile uyumlu olmaya çalışır ve bu nedenle yalnızca PDF'ler için uzmanlaşmış "grep'in gücünü" sağlar. Buna --recursive, --ignore-case Veya --color Gibi yaygın grep seçenekleri dahildir.

pdftotext | grep İfadesinin aksine, pdfgrep, bir eşleşmenin sayfa numarasını verimli bir şekilde çıktılayabilir ve belgenin tamamını (ör. --max-count Veya --quiet).

Temel kullanım:

pdfgrep PATTERN FILE..

burada PATTERN arama dizenizdir ve FILE bir dosya adı listesi (veya bir Kabuktaki joker karakterler).

Daha fazla bilgi için manpage adresine bakın.

16
hpdeifel

Hayır.

Bir pdf, bazıları metin, bazıları resim ve bazıları gerçekten büyülü fantezi XYZ (örn. .U3d dosyaları) veri yığınlarından oluşur. Bu parçalar çoğu zaman sıkıştırılır (örn. Düz, kontrol http://www.verypdf.com/pdfinfoeditor/compression.htm ). Bir .pdf dosyasını 'grep' etmek için , sıkıştırmayı tersine çevirmek veya metni ayıklamak zorundasınız.

Bunu dosya başına pdf2text ve sonucu grep, ya da .pdf dosyalarınızdan aranabilir bir dizin oluşturan bir 'indexer' ( xapian.org veya lucene ) çalıştırın ve sonra pdf içeriğini almak için bu dizinleyicinin arama motoru araçlarını kullanabilirsiniz.

Ama hayır, grep pdf dosyalarını oluşturamazsınız ve önce metni çıkarmadan güvenilir cevaplar vermeyi umamazsınız.

7
akira

Recoll PDF'lerde arama yapabilir. Normal ifadeleri desteklemez, ancak başka birçok arama seçeneğine sahiptir, bu nedenle ihtiyaçlarınızı karşılayabilir.

6
user39336

İlk önce strings kanalından geçebilirsiniz: -

cat file.pdf | strings | grep <...etc...>
4
Andy Smith

PDF dosyalarında arama yapmayı destekleyen ortak kaynak grep aracına crgrep bir göz atın.

Ayrıca, arşivlerde bulunan içerik, veritabanı tabloları, görüntü meta verileri, POM dosya bağımlılıkları ve web kaynakları gibi diğer kaynakların ve özyinelemeli arama dahil bunların kombinasyonlarının aranmasına izin verir.

3
Craig

StackOverflow üzerinde yinelenen bir soru var. Oradaki insanlar harish varyasyonu öneriyorlar. Venkarts cevap veriyor:

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

Buradaki benzer cevabın avantajı --with-filename bayrak grep için. Standart grep'in daha fazla özelliği olduğu için bu, pdfgrep'den de biraz daha üstündür.

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

2
user7610

bunu dene

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

satırları yazdırmak için desen pdf içinde oluşur

2
harish.venkat

cd'yi pdf dosyanızı içeren klasöre ekleyin ve sonra ..

pdfgrep 'pattern' your.pdf

veya birden fazla pdf dosyasında (örneğin, klasörünüzdeki tüm pdf dosyalarında) arama yapmak istiyorsanız

pdfgrep 'pattern'  `ls *.pdf`

veya

pdfgrep 'pattern' $(ls *.pdf)
2
Rasmuss Rall

İşte mevcut dizinde arama pdf için hızlı bir komut dosyası:

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

gnome kullanıyorsanız gpdf ihtiyacınız olan şey olabilir! Gnome kullanmıyorsanız this öğesini kontrol edin. CLI pdf görüntüleyicilerinin bir listesi var. Ardından, bir desen bulmak için grep kullanabilirsiniz.

0
Dharmit

Diyelim ki tp disk üzerinde dönüştürmek değil, stdout dönüştürmek ve sonra pdftotext ile grep olabilir. PDF çoğunlukla ikili bir format olduğundan, pdf'yi herhangi bir dönüşüm olmadan selamlamak pratik bir yaklaşım değildir.

Dizinde:

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

veya dizinde ve alt dizinlerinde:

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

Ayrıca, bazı pdf taramalar olduğu için, önce OCR işlemi yapılması gerekir. greped ve tüm OCR olamaz tüm pdfs aramak için oldukça basit bir yol yazdı.

Bir pdf dosyasının herhangi bir yazı tipi yoksa, genellikle aranabilir olmadığını fark ettim. Bunu bilerek pdffonts kullanabiliriz.

pdffonts öğesinin ilk 2 satırı tablo başlığıdır, bu nedenle bir dosya aranabilir olduğunda ikiden fazla satır çıktısı oluşturabilir ve bunu oluşturabildiğimizi bilerek:

gedit check_pdf_searchable.sh

sonra bunu yapıştır

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

sonra çalıştırılabilir yap

chmod +x check_pdf_searchable.sh

sonra dizinde aranamayan tüm pdf'leri listeleyin:

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

veya dizinde ve alt dizinlerinde:

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

Sadece pdf adlarını/özelliklerini ... veya sıkıştırılmamış veya kodlanmamış basit dizeleri aramak istiyorsanız, strings yerine aşağıdakileri kullanabilirsiniz:

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

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

ve cat --help:

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