PDF dosyalarını nasıl grep edebilirim?


135

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


1
Sanırım bazı kullanışlı sonuçlar elde etmek için pdf2text'i çözümlemeniz gerekiyor ...
Johan


1
Buraya arama yoluyla gelen insanlar için: Önce onu metin dosyalarına dönüştürmeye istekliysen , Birden fazla pdf dosyasının içeriğini nasıl arayabilirsin?
Martin Thoma

Yanıtlar:


135

Paketi kurun ve pdfgrepsonra şu komutu kullanın:

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

------

En basit yol

pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf 

5
Bu mac osx'ta da (Mavericks) çalışır. Demlemek kullanarak yükleyin. Basit. Teşekkürler.
Ocak'ta mikiemorales

7
Merakım dışında pdfgrep kaynağını kontrol ettim ve pdf'den string çıkarmak için poppler kullanıyor. Neredeyse tam olarak @ wag'ın cevabı, muhtemelen tüm belgeyi değil, sadece pagewise cevap veriyor.
Andrew Martin

4
pdfgrepAyrıca özyinelemeli bir bayrak var. Yani bu cevabı belki düşürüldü olabilir: pdfgrep -R pattern /path/. Her ne kadar bir PDF olmasa da her dosyadan geçerse daha az etkili olabilir. Ve å, ä ve ö gibi uluslararası karakterlerle ilgili sorunları olduğunu fark ettim.
Rovanion

1
Aslında, -nseçenek pdfgrep için bir profesyoneldir, çünkü sayfa numarasını çıktıya dahil etmeyi sağlar (daha fazla işlem için yardımcı olabilir).
JepZ

4
Bu cevabın, komutun hangi bitlerinin gerçek anlamıyla kopyalanması ve hangilerinin yer tutucu olduğu açıklanırsa kullanımı daha kolay olacaktır. Nedir pattern? Nedir {}? + 'Nın nesi var? İlk okuma hakkında hiçbir fikrim yok ... öyleyse gitmiş olduğum manpage'e, sanırım.
Mark Amery

56

Eğer poppler-utilsyüklediyseniz (Ubuntu Desktop’a varsayılan olarak), anında "dönüştürebilir" ve aşağıdakilere yönlendirebilirsiniz grep:

pdftotext my.pdf - | grep 'pattern'

Bu bir .txt dosyası oluşturmaz.


1
öyleyse .. metni grep etmeden önce ayıklayın, bu da cevabın "hayır" olduğu anlamına gelir.
akira

18
@akira OP muhtemelen "PDF'yi bir görüntüleyicide açmadan ve metne dışa aktarmadan" anlamına geliyordu.
Michael Mrozek

5
@akira Nerede "sadece grep" görüyorsun?
Michael Mrozek

6
@akira Eh, muhtemelen ne demek istediğini düşündüğümü söyledim; işlemeden önce metne dışa aktarmak istemiyor. Herhangi bir şekilde metne dönüştüren herhangi bir komutla ilgili bir sorunu olduğundan şüpheliyim ; yapmamak için bir sebep yok
Michael Mrozek

2
@sherrellbc İkinci argüman pdftotextyazması gereken dosya adıdır . Ancak, kurallara göre, araçlar genellikle stdoutbir dosyaya yazarak dosya yerine yazmanıza olanak tanır -. Benzer şekilde, stdoutböyle bir argümanı tamamen atlarsanız , bazı araçlar varsayılan olarak yazacaktır (ancak belirsizlik oluşturmadan bu her zaman mümkün değildir).
Joost

11

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

Çoğunlukla uyumlu olmaya çalışır grepve bu nedenle yalnızca PDF'ler için uzmanlaşmış olan "grep'in gücünü" sağlar. Bu --recursive, --ignore-caseveya gibi genel grep seçeneklerini içerir --color.

Bunun aksine pdftotext | grep, pdfgrep bir eşleşmenin sayfa numarasını performansla gösterir ve genellikle tüm dokümanı aramak zorunda olmadığında daha hızlı olur (örneğin --max-countveya --quiet).

Temel kullanım:

pdfgrep PATTERN FILE..

nerede PATTERNarama dizesi ve bir FILE(bir kabuk veya joker) dosya adları listesi.

Daha fazla bilgi için man sayfasına bakınız .


7

Hayır.

Bir pdf veri bölümlerinden, bazıları metinlerden, bazıları resimlerden ve bazıları gerçekten büyülü fantezi XYZ'den (örneğin .u3d dosyaları) oluşur. Bu topaklar çoğu zaman sıkıştırılmıştır (örneğin, düz, http://www.verypdf.com/pdfinfoeditor/compression.htm adresini kontrol edin ). 'Grep' .pdf için size sahip sıkıştırma aka ters metin ayıklayın.

Bunu dosya başına ya pdf2textda sonuç gibi grep araçlarıyla yapabilirsiniz ya da .pdf dosyalarınızdan aranabilir bir dizin oluşturan bir 'indexer' ( xapian.org veya lucene'ye bakın ) çalıştırıp aramayı kullanabilirsiniz. Bu indeksleyicinin motor araçları pdf içeriğini almak için.

Ancak hayır, greppdf dosyalarını düzenleyemez ve önce metni çıkarmadan güvenilir cevaplar elde edemezsiniz .


5
Var pdfgrepolduğu düşünüldüğünde (yukarıya bakın), düz bir "hayır" yanlıştır.
Jonathan Cross,

6

Recoll , PDF'lerde arama yapabilir. Düzenli ifadeleri desteklemiyor, ancak pek çok başka arama seçeneği var, bu nedenle ihtiyaçlarınıza uygun olabilir.


5

stringsİlk önce içinden geçirebilirsin : -

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

8
Sadece kullanın strings file.pdf | grep <...>, ihtiyacınız yokcat
phunehehe

Evet - aklım akışlarla daha iyi çalışıyor gibi görünüyor ... :-)
Andy Smith

12
Metin sıkıştırılmışsa, çoğu zaman olduğu gibi çalışmayacaktır.
akira

6
Metin sıkıştırılmamış olsa bile, genellikle biçimlendirme bilgisi ile iyice karıştırılan küçük cümle parçalarıdır (zorunlu olarak tam anlamıyla bile değil!). stringsYa da çok kolay değil grep.
Jander

Bunun için dize kullanmanın işe yaramayacağına dair başka bir neden düşünebiliyor musunuz? Dizeleri kullanmanın bazı PDF'lerde işe yaradığını, ancak diğerlerinin olmadığını gördüm.
hourback

3

PDF dosyalarında arama yapmayı destekleyen genel kaynak grep aracı crgrep'e bakı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ı ve yinelemeli arama dahil bunların kombinasyonlarını da aramanıza izin verir.


2

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 gerçekleşir


2

pdf dosyanızı içeren klasöre cd ve sonra

pdfgrep 'pattern' your.pdf

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

pdfgrep 'pattern'  `ls *.pdf`

veya

pdfgrep 'pattern' $(ls *.pdf)

Neden dünyada dosya isimlerini parametrelere koymak için ls kullanıyorsunuz? Çıkışı diğer komutlara girdi olarak kullanmakls sadece yavaş değil, aynı zamanda kötü bir fikirdir . Sadece pdfgrep 'pattern' *.pdfyeter
phuclv

1

StackOverflow'ta yinelenen bir soru var. Orada insanlar harish.venkarts'ın bir türevini önerdi:

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

Buradaki benzer cevaba göre avantaj --with-filenamegrep'in bayrağı. Standart grep daha fazla özelliğe sahip olduğundan, bu da pdfgrep'den daha üstündür.

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


Bunu, atıfta bulunduğunuz benzer cevapta bir yorum (veya düzenleme) olarak bırakmanın daha iyi olacağını düşünüyorum.
Bernhard

0

Geçerli 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

Diyelim ki tp'yi diske dönüştürmüyorsunuz, onları dönüştürebilir stdoutve sonra onu grep edebilirsiniz pdftotext. PDF'yi herhangi bir dönüşüm olmadan yapmak PDF, çoğunlukla ikili bir format olduğu için 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ı pdftaramalar nedeniyle , önce OCR yapılması gerekir. grepEd edilemeyen tüm pdfs'leri ve OCR'ları aramak için oldukça basit bir yol yazdım .

Bir pdfdosya herhangi bir yazı tipine sahip değilse, genellikle aranamadığını fark ettim . Yani bunu bilerek kullanabiliriz pdffonts.

İlk 2 satır pdffontstablo başlığıdır, yani bir dosya aranabilir olduğunda ikiden fazla satır çıktısı varsa, bunu yaratabileceğimizi bilerek:

gedit check_pdf_searchable.sh

sonra bunu yapıştırın

#!/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 aranamayan tüm pdfs'leri dizinde listele:

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

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

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

Kimden 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

Gnome kullanıyorsanız, gpdf ihtiyacınız olan şey olabilir! Kontrol Bu Gnome kullanmadığınız durumda. CLI pdf görüntüleyicilerinin bir listesi var. Sonra bir grepkalıp bulmak için kullanabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.