Bagaimana saya bisa grep dalam file PDF?

136

Apakah ada cara untuk mencari file pdf menggunakan kekuatan grep, tanpa mengkonversi ke teks terlebih dahulu di Ubuntu?

Dervin Thunk
sumber
1
Saya pikir Anda perlu menguraikannya pdf2text untuk mendapatkan beberapa hasil yang dapat digunakan kembali ...
Johan
1
Untuk orang-orang yang datang ke sini melalui pencarian: Jika Anda ingin mengonversinya terlebih dahulu ke file teks, lihat Bagaimana cara mencari konten beberapa file pdf?
Martin Thoma

Jawaban:

135

Instal paket pdfgrep, lalu gunakan perintah:

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

——————

Cara paling sederhana adalah

pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf 
enzotib
sumber
5
Ini berfungsi di mac osx (Mavericks) juga. Instal menggunakan minuman. Sederhana. Terima kasih.
mikiemorales
7
Karena penasaran saya memeriksa sumber pdfgrep dan menggunakan poppler untuk mengekstraksi string dari pdf. Hampir persis seperti jawaban @ mengibaskan hanya mengoceh bukan, mungkin, seluruh dokumen.
Andrew Martin
4
pdfgrepjuga memiliki bendera rekursif. Jadi jawaban ini mungkin dapat dikurangi menjadi: pdfgrep -R pattern /path/. Meskipun mungkin kurang efektif jika melewati setiap file bahkan jika itu bukan PDF. Dan saya perhatikan ada masalah dengan karakter internasional seperti å, ä dan ö.
Rovanion
1
Sebenarnya, -nopsi ini adalah pro untuk pdfgrep karena memungkinkan untuk memasukkan nomor halaman dalam output (mungkin membantu untuk diproses lebih lanjut).
JepZ
4
Jawaban ini akan lebih mudah digunakan jika itu menjelaskan bagian-bagian mana dari perintah yang dimaksudkan untuk disalin secara harfiah dan mana yang merupakan tempat penampung. Apa pattern? Apa {}? Ada apa dengan `+`? Saya tidak tahu setelah membaca pertama ... jadi saya pergi ke halaman manual, saya kira.
Mark Amery
56

Jika Anda telah poppler-utilsmenginstal (default pada Desktop Ubuntu), Anda dapat "mengubahnya" dengan cepat dan mengirimkannya ke grep:

pdftotext my.pdf - | grep 'pattern'

Ini tidak akan membuat file .txt.

mengibaskan
sumber
1
jadi .. Anda mengekstrak teks sebelum Anda menerimanya yang artinya jawabannya adalah "tidak".
akira
18
@akira OP mungkin berarti "tanpa membuka PDF di penampil dan mengekspor ke teks"
Michael Mrozek
5
@ Akira Di mana Anda melihat "hanya grep"?
Michael Mrozek
6
@ Akira Yah, saya sudah mengatakan apa yang saya pikir dia maksud; dia tidak ingin mengekspor ke teks sebelum memprosesnya. Saya sangat meragukan dia memiliki masalah dengan perintah apa pun yang dikonversi ke teks dengan cara apa pun; tidak ada alasan untuk tidak
Michael Mrozek
2
@sherrellbc Argumen kedua pdftotextadalah nama file yang harus ditulis. Namun, berdasarkan konvensi, alat biasanya memungkinkan Anda untuk menulis stdoutalih-alih ke file dengan menentukan -sebaliknya. Demikian pula, beberapa alat akan menulis stdoutsecara default jika Anda menghilangkan argumen seperti itu sepenuhnya (tapi ini tidak selalu mungkin tanpa menciptakan ambiguitas).
Joost
12

pdfgrep ditulis untuk tujuan ini dan tersedia di Ubuntu.

Sebagian besar mencoba untuk kompatibel grepdan dengan demikian memberikan "kekuatan grep", hanya khusus untuk PDF. Itu termasuk opsi grep umum, seperti --recursive, --ignore-caseatau --color.

Berbeda dengan pdftotext | grep, pdfgrep dapat menampilkan jumlah halaman yang cocok dengan performa yang baik dan umumnya lebih cepat ketika tidak harus mencari seluruh dokumen (misalnya --max-countatau --quiet).

Penggunaan dasar adalah:

pdfgrep PATTERN FILE..

di mana PATTERNstring pencarian Anda dan FILEdaftar nama file (atau wildcard di shell).

Lihat halaman manual untuk info lebih lanjut.

hpdeifel
sumber
7

Tidak.

Pdf terdiri dari potongan-potongan data, beberapa di antaranya teks, beberapa di antaranya gambar dan beberapa di antaranya benar-benar ajaib XYZ (mis. File .u3d). Potongan-potongan itu sebagian besar terkompresi (mis. Flat, periksa http://www.verypdf.com/pdfinfoeditor/compression.htm ). Untuk 'grep' .pdf Anda harus membalikkan kompresi alias mengekstrak teks.

Anda dapat melakukannya per file dengan alat seperti pdf2textdan ambil hasilnya, atau Anda menjalankan 'pengindeks' (lihat xapian.org atau lucene ) yang membangun indeks yang dapat dicari dari file .pdf Anda dan kemudian Anda dapat menggunakan pencarian alat mesin pengindeks itu untuk mendapatkan konten pdf

Tapi tidak, Anda tidak bisa grepfile pdf dan berharap jawaban yang dapat diandalkan tanpa mengekstraksi teks terlebih dahulu.

akira
sumber
5
Mengingat pdfgrepada (lihat di atas), sebuah flat "tidak" tidak benar.
Jonathan Cross
6

Recoll dapat mencari PDF. Ini tidak mendukung ekspresi reguler, tetapi memiliki banyak opsi pencarian lain, jadi mungkin sesuai dengan kebutuhan Anda.

pengguna39336
sumber
5

Anda dapat menyalurkan melalui strings:

cat file.pdf | strings | grep <...etc...>
Andy Smith
sumber
8
Cukup gunakan strings file.pdf | grep <...>, Anda tidak perlucat
phunehehe
Ya - pikiran saya tampaknya bekerja lebih baik dengan aliran ... :-)
Andy Smith
12
tidak akan berfungsi jika teks dikompresi, yang merupakan sebagian besar waktu.
akira
6
Bahkan jika teksnya tidak terkompresi, umumnya kalimat-kalimat kecil (bahkan belum tentu seluruh kata!) Dicampur dengan informasi format. Tidak terlalu ramah untuk stringsatau grep.
Jander
Bisakah Anda memikirkan alasan lain mengapa menggunakan string untuk ini tidak akan berhasil? Saya menemukan bahwa menggunakan string berfungsi pada beberapa PDF tetapi tidak pada yang lain.
pasir
3

Lihatlah crgrep alat sumber daya umum yang mendukung pencarian dalam file PDF.

Hal ini juga memungkinkan pencarian sumber daya lain seperti konten yang bersarang di arsip, tabel database, meta-data gambar, dependensi file POM dan sumber daya web - dan kombinasi dari ini termasuk pencarian rekursif.

Craig
sumber
2

coba ini

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

untuk mencetak garis, polanya muncul di dalam pdf

harish.venkat
sumber
2

cd ke folder Anda yang berisi file pdf Anda dan kemudian ..

pdfgrep 'pattern' your.pdf

atau jika Anda ingin mencari lebih dari satu file pdf (mis. di semua file pdf di folder Anda)

pdfgrep 'pattern'  `ls *.pdf`

atau

pdfgrep 'pattern' $(ls *.pdf)
Rasmuss Rall
sumber
mengapa Anda menggunakan ls untuk meletakkan nama file di parameter? Bukan hanya lebih lambat tetapi juga ide buruk untuk menggunakan lsoutput sebagai input ke perintah lain . Cukup pdfgrep 'pattern' *.pdfsudah
phuclv
1

Ada pertanyaan duplikat di StackOverflow. Orang-orang di sana menyarankan variasi jawaban harish.venkarts:

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

Keuntungan dari jawaban serupa di sini adalah --with-filenamebendera untuk grep. Ini agak lebih unggul daripada pdfgrep juga, karena grep standar memiliki lebih banyak fitur.

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

pengguna7610
sumber
Saya pikir akan lebih baik untuk meninggalkan ini sebagai komentar (atau sunting) dalam jawaban yang sama yang Anda maksud.
Bernhard
0

Berikut ini adalah skrip cepat untuk mencari pdf di direktori saat ini:

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

Saya berasumsi maksud Anda tp tidak mengubahnya pada disk, Anda dapat mengubahnya stdoutdan kemudian menerimanya dengan pdftotext. Memegang pdf tanpa konversi apa pun bukanlah pendekatan praktis karena PDFsebagian besar merupakan format biner.

Dalam direktori:

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

atau dalam direktori dan subdirektori-nya:

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

Juga karena beberapa pdfscan, mereka perlu OCR terlebih dahulu. Saya menulis cara yang cukup sederhana untuk mencari semua pdf yang tidak dapat grepdiedit dan OCR mereka.

Saya perhatikan jika pdffile tidak memiliki font apa pun biasanya tidak dapat dicari. Jadi mengetahui ini bisa kita gunakan pdffonts.

2 baris pertama pdffontsadalah header tabel, jadi ketika sebuah file dapat dicari memiliki lebih dari dua output baris, dengan mengetahui hal ini kita dapat membuat:

gedit check_pdf_searchable.sh

lalu tempel ini

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

kemudian membuatnya bisa dieksekusi

chmod +x check_pdf_searchable.sh

kemudian daftarkan semua pdf yang tidak dapat dicari di direktori:

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

atau dalam direktori dan subdirektori-nya:

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

Jika Anda hanya ingin mencari nama / properti pdf ... atau string sederhana yang tidak dikompresi atau disandikan maka alih-alih stringsAnda dapat menggunakan di bawah ini

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

Dari 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

dan cat --help:

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

gpdf mungkin yang Anda butuhkan jika Anda menggunakan Gnome! Periksa ini jika Anda tidak menggunakan Gnome. Itu punya daftar pemirsa pdf CLI. Kemudian Anda dapat menggunakan grepuntuk menemukan beberapa pola.

Dharmit
sumber