it-swarm-vi.com

Làm cách nào tôi có thể grep trong các tệp PDF?

Có cách nào để tìm kiếm PDF bằng sức mạnh của grep, mà không cần chuyển đổi thành văn bản trước trong Ubuntu không?

160
Dervin Thunk

Cài đặt gói pdfgrep, sau đó sử dụng lệnh:

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

Tinh ranh

Cách đơn giản nhất để làm điều đó:

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

Nếu bạn có poppler-utils đã cài đặt (mặc định trên Ubuntu Desktop), bạn có thể "chuyển đổi" nó một cách nhanh chóng và chuyển nó thành grep:

pdftotext my.pdf - | grep 'pattern'

Điều này sẽ không tạo ra một tập tin .txt.

63
wag

pdfgrep được viết cho chính xác mục đích này và có sẵn trong Ubuntu.

Nó cố gắng tương thích hầu hết với grep và do đó cung cấp "sức mạnh của grep", chỉ chuyên dùng cho các tệp PDF. Điều đó bao gồm các tùy chọn grep phổ biến, chẳng hạn như --recursive, --ignore-case hoặc là --color.

Trái ngược với pdftotext | grep, pdfgrep có thể xuất số trang của trận đấu theo cách thức biểu diễn và thường nhanh hơn khi không phải tìm kiếm toàn bộ tài liệu (ví dụ: --max-count hoặc là --quiet).

Cách sử dụng cơ bản là:

pdfgrep PATTERN FILE..

trong đó PATTERN là chuỗi tìm kiếm của bạn và FILE một danh sách tên tệp (hoặc ký tự đại diện trong Shell).

Xem manpage để biết thêm thông tin.

16
hpdeifel

Không.

Một pdf bao gồm các khối dữ liệu, một số trong đó là văn bản, một số trong số chúng là hình ảnh và một số trong số chúng thực sự kỳ diệu XYZ (ví dụ: các tệp .u3d). Các khối đó hầu hết được nén (ví dụ: phẳng, kiểm tra http://www.verypdf.com/pdfinfoeditor/compression.htmlm ). Để 'grep' a .pdf, bạn để đảo ngược việc nén aka trích xuất văn bản.

Bạn có thể làm điều đó trên mỗi tệp bằng các công cụ như pdf2text và grep kết quả hoặc bạn chạy một 'bộ chỉ mục' (xem xapian.org hoặc lucene ) để xây dựng một chỉ mục có thể tìm kiếm từ các tệp .pdf của bạn và sau đó bạn có thể sử dụng các công cụ công cụ tìm kiếm của bộ chỉ mục đó để lấy nội dung của pdf.

Nhưng không, bạn không thể grep tệp pdf và hy vọng có câu trả lời đáng tin cậy mà không cần trích xuất văn bản trước.

7
akira

Recoll có thể tìm kiếm các tệp PDF. Nó không hỗ trợ các biểu thức thông thường, nhưng nó có nhiều tùy chọn tìm kiếm khác, vì vậy nó có thể phù hợp với nhu cầu của bạn.

6
user39336

Bạn có thể chuyển nó qua strings trước: -

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

Hãy xem công cụ grep tài nguyên chung crgrep hỗ trợ tìm kiếm trong các tệp PDF.

Nó cũng cho phép tìm kiếm các tài nguyên khác như nội dung được lồng trong kho lưu trữ, bảng cơ sở dữ liệu, siêu dữ liệu hình ảnh, phụ thuộc tệp POM và tài nguyên web - và kết hợp các tài nguyên này bao gồm tìm kiếm đệ quy.

3
Craig

Có một câu hỏi trùng lặp trên StackOverflow. Những người ở đó đề xuất một biến thể của câu trả lời harish.venkarts:

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

Ưu điểm so với câu trả lời tương tự ở đây là --with-filename cờ cho grep. Điều này cũng có phần vượt trội so với pdfgrep, vì grep tiêu chuẩn có nhiều tính năng hơn.

https://stackoverflow.com/questions/4643438/how-to-search-contents-of-mult Môn-pdf-files

2
user7610

thử cái này

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

để in các dòng mô hình xảy ra bên trong pdf

2
harish.venkat

cd vào thư mục của bạn chứa tệp pdf của bạn và sau đó ..

pdfgrep 'pattern' your.pdf

hoặc nếu bạn muốn tìm kiếm nhiều hơn một tệp pdf (ví dụ: trong tất cả các tệp pdf trong thư mục của bạn)

pdfgrep 'pattern'  `ls *.pdf`

hoặc là

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

Đây là một kịch bản nhanh để tìm kiếm pdf trong thư mục hiện tạ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 \;
0
Nico

gpdf có thể là những gì bạn cần nếu bạn đang sử dụng Gnome! Kiểm tra this trong trường hợp bạn không sử dụng Gnome. Nó có một danh sách người xem pdf CLI. Sau đó, bạn có thể sử dụng grep để tìm một số mẫu.

0
Dharmit

Tôi giả sử bạn có nghĩa là tp không chuyển đổi nó trên đĩa, bạn có thể chuyển đổi chúng thành stdout và sau đó grep nó với pdftotext. Cắt xén pdf mà không có bất kỳ loại chuyển đổi nào không phải là một cách tiếp cận thực tế vì PDF chủ yếu là định dạng nhị phân.

Trong thư mục:

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

hoặc trong thư mục và các thư mục con của nó:

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

Ngoài ra vì một số pdf là các bản quét mà họ cần được OCRed trước. Tôi đã viết một cách khá đơn giản để tìm kiếm tất cả các pdf không thể là greped và OCR chúng.

Tôi nhận thấy nếu một tệp pdf không có bất kỳ phông chữ nào thì nó thường không thể tìm kiếm được. Vì vậy, biết điều này chúng ta có thể sử dụng pdffonts.

2 dòng đầu tiên của pdffonts là tiêu đề bảng, vì vậy khi một tệp có thể tìm kiếm được có nhiều hơn hai dòng đầu ra, biết điều này chúng ta có thể tạo:

gedit check_pdf_searchable.sh

sau đó dán cái này

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

sau đó làm cho nó thực thi

chmod +x check_pdf_searchable.sh

sau đó liệt kê tất cả các pdf không thể tìm kiếm trong thư mục:

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

hoặc trong thư mục và các thư mục con của nó:

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

Nếu bạn chỉ muốn tìm kiếm tên/thuộc tính pdf ... hoặc các chuỗi đơn giản không được nén hoặc mã hóa thì thay vì strings bạn có thể sử dụng bên dưới

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

Từ 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

cat --help:

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