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


135

Có cách nào để tìm kiếm tệp pdf bằng sức mạnh của grep mà không cần chuyển đổi thành văn bản đầu tiên trong Ubuntu không?


1
Tôi nghĩ rằng bạn cần phân tích nó bằng pdf2text để lấy lại một số kết quả có thể sử dụng được ...
Johan


1
Đối với những người đến đây thông qua tìm kiếm: Nếu bạn sẵn sàng chuyển đổi nó thành tệp văn bản, hãy xem Làm thế nào để tìm kiếm nội dung của nhiều tệp pdf?
Martin Thoma

Câu trả lời:


135

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à

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

5
Điều này cũng hoạt động trong mac osx (Mavericks). Cài đặt nó bằng cách sử dụng bia. Đơn giản. Cảm ơn.
mikiemorales

7
Vì tò mò tôi đã kiểm tra nguồn pdfgrep và nó sử dụng poppler để trích xuất chuỗi từ pdf. Hầu như chính xác như câu trả lời của @ wag chỉ theo trang chứ không phải, có lẽ là toàn bộ tài liệu.
Andrew Martin

4
pdfgrepcũng có một cờ đệ quy. Vì vậy, câu trả lời này có lẽ có thể được giảm xuống : pdfgrep -R pattern /path/. Mặc dù nó có thể kém hiệu quả hơn nếu nó đi qua mọi tệp ngay cả khi nó không phải là PDF. Và tôi nhận thấy rằng nó có vấn đề với các nhân vật quốc tế như å, ä và ö.
Rovmate

1
Trên thực tế, -ntùy chọn là một pro cho pdfgrep vì nó cho phép bao gồm số trang trong đầu ra (có thể hữu ích để xử lý thêm).
JepZ

4
Câu trả lời này sẽ dễ sử dụng hơn nếu nó giải thích các bit của lệnh có nghĩa là sao chép theo nghĩa đen và đâu là giữ chỗ. Có gì pattern? Có gì {}? Có chuyện gì với `+`? Tôi không có ý tưởng gì khi lần đầu tiên đọc ... vì vậy tôi cho rằng trang này tôi đi.
Đánh dấu Amery

56

Nếu bạn đã poppler-utilscài đặt (mặc định trên Ubuntu Desktop), bạn có thể "chuyển đổi" nó ngay lập tức 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.


1
vì vậy .. bạn trích xuất văn bản trước khi bạn grep nó có nghĩa là câu trả lời là "không".
akira

18
@akira OP có thể có nghĩa là "không mở tệp PDF trong trình xem và xuất thành văn bản"
Michael Mrozek

5
@akira Bạn thấy "grep only" ở đâu?
Michael Mrozek

6
@akira Chà, tôi đã nói những gì tôi nghĩ có lẽ anh ấy muốn nói; anh ta không muốn xuất thành văn bản trước khi xử lý nó. Tôi rất nghi ngờ anh ta có vấn đề với bất kỳ lệnh nào chuyển đổi thành văn bản theo bất kỳ cách nào; không có lý do để không
Michael Mrozek

2
@sherrellbc Đối số thứ hai pdftotextlà tên tệp cần ghi. Tuy nhiên, theo quy ước, các công cụ thường cho phép bạn ghi vào stdoutthay vì vào tệp bằng cách chỉ định -thay thế. Tương tự, một số công cụ sẽ ghi vào stdoutmặc định nếu bạn bỏ hoàn toàn một đối số như vậy (nhưng điều này không phải lúc nào cũng có thể mà không tạo ra sự mơ hồ).
Joost

11

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 grepvà 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-casehoặc --color.

Ngược lạ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-counthoặc --quiet).

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

pdfgrep PATTERN FILE..

PATTERNchuỗi tìm kiếm của bạn ở đâu và FILEdanh sách tên tệp (hoặc ký tự đại diện trong vỏ).

Xem trang hướng dẫn để biết thêm thông tin.


7

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ụ: 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' một .pdf, bạn phải đảo ngược việc nén hay trích xuất văn bản.

Bạn có thể làm điều đó một trong hai mỗi tập tin với các công cụ như pdf2textvà grep kết quả, hoặc bạn chạy một 'indexer' (nhìn vào xapian.org hoặc Lucene ) trong đó xây dựng một chỉ số thể tìm kiếm ra các file .pdf của bạn và sau đó bạn có thể sử dụng tìm kiếm công cụ công cụ của bộ chỉ mục đó để có được nội dung của pdf.

Nhưng không, bạn không thể greptập tin 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.


5
Xem xét pdfgreptồn tại (xem ở trên), một chữ "không" phẳng là không chính xác.
Jonathan Cross

6

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.


5

Bạn có thể dẫn nó qua stringsđầu tiên: -

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

8
Chỉ cần sử dụng strings file.pdf | grep <...>, bạn không cầncat
phunehehe

Vâng - tâm trí của tôi dường như hoạt động tốt hơn với các luồng ... :-)
Andy Smith

12
Sẽ không hoạt động nếu văn bản được nén, đó là phần lớn thời gian.
akira

6
Ngay cả khi văn bản không bị nén, nó thường là những mẩu câu nhỏ (thậm chí không nhất thiết phải là toàn bộ từ!) Được trộn lẫn với thông tin định dạng. Không thân thiện cho stringshay grep.
Jander

Bạn có thể nghĩ ra một lý do khác tại sao sử dụng chuỗi cho việc này sẽ không hoạt động? Tôi thấy rằng sử dụng chuỗi hoạt động trên một số tệp PDF nhưng không phải là chuỗi khác.
giờ trở lại

3

Hãy xem crgrep công cụ 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.


2

thử đi

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

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)

Tại sao bạn lại sử dụng ls để đặt tên tệp trong tham số? Nó không chỉ chậm hơn mà còn là một ý tưởng tồi để sử dụng lsđầu ra làm đầu vào cho các lệnh khác . Chỉ cần pdfgrep 'pattern' *.pdflà đủ
phuclv

1

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"' \;

Lợi thế so với câu trả lời tương tự ở đây là --with-filenamecờ 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


Tôi nghĩ sẽ tốt hơn nếu để nó như một bình luận (hoặc chỉnh sửa) trong câu trả lời tương tự mà bạn đang đề cập.
Bernhard

0

Đâ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

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 stdoutvà 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ì PDFchủ 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 bởi vì một số pdfquét là cần phải đượ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ể chỉnh sửa grepvà OCR chúng.

Tôi nhận thấy nếu một pdftập tin 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 pdffontslà 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

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ào đó stringsbạn có thể sử dụng tên dưới đây

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

gpdf có thể là những gì bạn cần nếu bạn đang sử dụng Gnome! Kiểm tra điều này 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ô hình.

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.