Làm thế nào để tìm kiếm nội dung của nhiều tập tin pdf?


226

Làm cách nào tôi có thể tìm kiếm nội dung của tệp PDF trong thư mục / thư mục con? Tôi đang tìm kiếm một số công cụ dòng lệnh. Dường như grepkhông thể tìm kiếm tệp PDF.


5
Grep sẽ không hoạt động vì PDF là định dạng nhị phân và văn bản thường được nén hoặc mã hóa theo nhiều cách khác nhau.
đánh dấu stephens

4
Đây là một giải pháp GUI: Adobe Reader, xem wikispaces.psu.edu/display/training/ mẹo
Martin Thoma


3
Trình đọc Adobe hoạt động tốt, nhưng nó không lập chỉ mục; Vì vậy, nếu bạn có nhiều tập tin, nó sẽ bị chậm. Bất kỳ giải pháp lập chỉ mục?
Ruby

Câu trả lời:


211

Phân phối của bạn sẽ cung cấp một tiện ích gọi là pdftotext:

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

"-" là cần thiết để có đầu ra pdftotext thành thiết bị xuất chuẩn, không cho các tệp. Các tùy chọn --with-filename--label=sẽ đặt tên tệp trong đầu ra của grep. --colorCờ tùy chọn là tốt và báo cho grep xuất ra bằng cách sử dụng màu trên thiết bị đầu cuối.

(Trong Ubuntu, pdftotextđược cung cấp bởi gói xpdf-utilshoặc poppler-utils.)

Phương pháp này, sử dụng pdftotextgrep, có lợi thế hơn pdfgrepnếu bạn muốn sử dụng các tính năng của GNU greppdfgrepkhông hỗ trợ. Lưu ý : pdfgrep-1.3.x hỗ trợ -Ctùy chọn để in dòng ngữ cảnh.


1
@Kurt Pfeifle Bản chỉnh sửa "(Chỉnh sửa bởi -kp-)" bạn đã thực hiện không hoạt động vì grepbộ lọc tên tệp được in.
Raphael Ahren

@sjr không, trong khi pdfgrepgiải pháp tốt cho các tìm kiếm thực sự nhanh chóng và đơn giản, thường thì tôi muốn có một số ngữ cảnh, vì một dòng duy nhất sẽ không đủ hữu ích - vì vậy tôi đã thêm vào câu trả lời này: Chẳng hạn, bạn có thể thêm tùy chọn -C5 trước "mẫu của bạn" để bao gồm 5 dòng ngữ cảnh cho đầu ra - pdfgrep không hỗ trợ điều này
Colin D Bennett

ồ thật tuyệt, thật vui khi biết có những lợi thế cho điều này mặc dù nó ít rõ ràng hơn với hầu hết mọi người khi nó đang làm
sjr

2
@sjr Chỉ để ghi lại: Tôi đang sử dụng Ubuntu 12.10 và pdfgrepvô dụng, nó báo cáo một lượng rác khổng lồ trên các tệp mà nó không thể xử lý. Giải pháp của bạn mặt khác đã giúp. Vì vậy, xin vui lòng không xóa nó, thậm chí sau 3 năm nó vẫn hữu ích!
Ali

Tôi cũng có thể sử dụng nó trong cygwin, để biến nó thành một hàm với tham số tôi phải làm cho "your_potype" trở thành '$ 1'
Koshmaar

214

pdfgrep , chính xác những gì tên của nó gợi ý.

pdfgrep -R 'a pattern to search recursively from path' /some/path

Tôi đã sử dụng nó cho các tìm kiếm đơn giản và nó hoạt động tốt.

(Có các gói trong Debian, Ubuntu và Fedora.)

Vì phiên bản 1.3.0 pdfgrep hỗ trợ tìm kiếm đệ quy. Phiên bản này có sẵn trong Ubuntu kể từ Ubuntu 12.10 (Định lượng).


1
Từ Natty (Ubuntu 11.04) trở lên (Xem các gói.ubfox.com/ ))
Martin Thoma

2
@pavon pdfgrephiện có tùy chọn đệ quy đó, bao gồm cả -Rtheo liên kết tượng trưng
Tobias Kienzler

30

Recoll là một ứng dụng tìm kiếm GUI toàn văn tuyệt vời cho Unix / Linux, hỗ trợ hàng tá định dạng khác nhau, bao gồm PDF. Nó thậm chí có thể chuyển số trang chính xác và thuật ngữ tìm kiếm của truy vấn cho người xem tài liệu và do đó cho phép bạn chuyển đến kết quả ngay từ GUI của nó.

Recoll cũng đi kèm với giao diện dòng lệnh khả thi và giao diện trình duyệt web .


1
@Glutanimate Nó sẽ hữu ích (tôi và có thể cả những người khác nữa) nếu bạn có thể thêm một ví dụ liên quan đến câu hỏi ban đầu (công cụ dòng lệnh để tìm kiếm nhiều pdf): Tôi cũng muốn xem cách thực hiện tìm kiếm ký tự đại diện và cách tìm kiếm các thư mục hiện hành bao gồm tất cả các thư mục con . Điều đó sẽ trông như thế nào recoll / xapiantrong dòng lệnh (không phải GUI)? Cảm ơn!
hấp dẫn về natty

@ LeszekŻarna Có lẽ bạn có thể đăng ví dụ bạn đã kiểm tra?
hấp dẫn về natty

Các recoll hướng dẫn sử dụng có thể chứa một số gợi ý, nhưng cung cấp một thay kỹ thuật và "off-topic" đọc ...
hấp dẫn về Natty

1
@nutty: recoll -t -q dir: pwdext: pdf 'neuro *' - stackoverflow đã ăn các backticks xung quanh pwd.
medoc

13

Phiên bản thực tế của pdfgrep (1.3.0) của tôi cho phép như sau:

pdfgrep -HiR 'pattern' /path

Khi làm pdfgrep --help:

  • H: In tên tệp cho mỗi trận đấu.
  • i: Bỏ qua sự phân biệt trường hợp.
  • R: Thư mục tìm kiếm đệ quy.

Nó hoạt động tốt trên Ubuntu của tôi.


7

Tôi đã thực hiện kịch bản nhỏ phá hoại này . Hãy vui vẻ với nó.

function pdfsearch()
{
    find . -iname '*.pdf' | while read filename
    do
        #echo -e "\033[34;1m// === PDF Document:\033[33;1m $filename\033[0m"
        pdftotext -q -enc ASCII7 "$filename" "$filename."; grep -s -H --color=always -i $1 "$filename."
        # remove it!  rm -f "$filename."
    done
}

2
+1. Nhưng thay vì $filename.bạn nên đặt nó vào grep.
Raphael Ahrens

3

Tôi thích câu trả lời của @ sjr tuy nhiên tôi thích xargs vs -exec. Tôi thấy xargs linh hoạt hơn. Ví dụ với -P, chúng ta có thể tận dụng nhiều CPU khi thực hiện điều đó hợp lý.

find . -name '*.pdf' | xargs -P 5 -I % pdftotext % - | grep --with-filename --label="{}" --color "pattern"

điểm thú vị về xargs'khả năng xử lý song song. Lưu ý rằng bạn --labellựa chọn đối số sẽ theo nghĩa đen {} , bởi vì các greplệnh được bây giờ không còn được thực hiện trong bối cảnh find's exec.
mkuity0

2

Tôi có cùng một vấn đề và do đó tôi đã viết một tập lệnh tìm kiếm tất cả các tệp pdf trong thư mục được chỉ định cho một chuỗi và in các tệp PDF phù hợp với chuỗi truy vấn.

Có lẽ điều này sẽ hữu ích cho bạn.

Bạn có thể tải nó ở đây


có thể hữu ích để đặt kịch bản trong bình luận?
baxx

Tôi đã thử tập lệnh của bạn và nó diễn ra chậm hơn nhiều so với pdfgrepgiải pháp hoặc một lớp lót của nó và nó đã để lại cho tôi một quá trình đang diễn ra bằng cách sử dụng 100% luồng CPU ngay cả sau khi tôi Ctrl-C để chấm dứt nó.
Jason

2

Nếu bạn muốn xem tên tệp với pdftotext, hãy sử dụng lệnh sau:

find . -name '*.pdf' -exec echo {} \; -exec pdftotext {} - \; | grep "pattern\|pdf" 

2

Có một tiện ích khác gọi là ripgrep-all , dựa trên ripgrep .

Nó có thể xử lý nhiều hơn chỉ các tài liệu PDF, như các tài liệu và phim Office và tác giả cho rằng nó nhanh hơn pdfgrep.

Cú pháp lệnh để tìm kiếm đệ quy thư mục hiện tại và lệnh thứ hai chỉ giới hạn ở các tệp PDF:

rga 'pattern' .
rga --type pdf 'pattern' .

1

Có một công cụ grep tài nguyên chung nguồn mở crgrep tìm kiếm trong các tệp PDF nhưng cũng có các tài nguyên khác như nội dung được lưu trữ 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ả hai bao gồm tìm kiếm đệ quy.

Mô tả đầy đủ trong tab Tệp bao gồm rất nhiều những gì công cụ hỗ trợ.

Tôi đã phát triển crgrep như một công cụ mã nguồn mở.


Craig - bạn có kết nối với dự án đó không? Nếu vậy, bạn nên nêu nó trong câu trả lời của bạn. Tôi nói điều này bởi vì bạn vừa đăng một câu trả lời gần như giống hệt nhau cho hai câu hỏi cũ khác ...
Stephen C

Bài đăng được cập nhật để làm rõ rằng tôi là tác giả của crgrep
Craig

1

Đầu tiên chuyển đổi tất cả các tệp pdf của bạn thành các tệp văn bản:

for file in *.pdf;do pdftotext "$file"; done

Sau đó sử dụng grepnhư bình thường. Điều này đặc biệt tốt vì nó nhanh khi bạn có nhiều truy vấn và nhiều tệp PDF.


Điều này, khi được thực hiện kết hợp với ag github.com/ggreer/the_silver_searcher . Có khả năng phân tích cú pháp tại psychedeliks Gb bằng micro giây. Các tập tin phẳng cho cuộc sống
NVRM

0

Bạn cần một số công cụ như pdf2text để trước tiên chuyển đổi pdf của bạn thành tệp văn bản và sau đó tìm kiếm bên trong văn bản. (Bạn có thể sẽ bỏ lỡ một số thông tin hoặc biểu tượng).

Nếu bạn đang sử dụng ngôn ngữ lập trình, có thể có các thư viện pdf được viết cho mục đích này. ví dụ: http://search.cpan.org/dist/CAM-PDF/ cho Perl


0

hãy thử sử dụng 'acroread' trong một tập lệnh đơn giản như ở trên

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.