Tìm kiếm Python trong nhiều tệp PDF

Đây là mẫu cho ứng dụng Dockerized có thể tái sản xuất, dựa trên R, tìm từ khóa và/hoặc câu trong nhiều tệp PDF

Tóm lược

  • Trước tiên, chúng tôi sử dụng R để chuyển đổi tệp PDF thành tệp văn bản thuần túy (.txt)
  • Sau đó, tập lệnh R thứ hai tìm kiếm các từ khóa và/hoặc câu đã được xác định trước đó trong các tệp văn bản đã chuyển đổi đó
  • Các trận đấu được báo cáo vào một tệp Excel, báo cáo từ khóa hoặc câu nào được tìm thấy trong tệp nào

Docker được sử dụng để chạy quy trình được đề cập ở trên bên trong một thùng chứa biệt lập (xem khối xây dựng này để tìm hiểu thêm về các thùng chứa). Bằng cách đó, bạn có thể chạy ứng dụng này mà không cần phải cài đặt R trong máy tính của mình và ứng dụng cũng sẽ chạy trơn tru, bất kể bạn đang sử dụng hệ điều hành (HĐH) nào

Ví dụ tạo động lực

Trong nhiều tình huống, chúng tôi sử dụng crtl (or "Command" in Mac) + F để tìm từ hoặc câu trong tệp PDF. Tuy nhiên, điều này có thể rất tốn thời gian, đặc biệt nếu cần áp dụng cho nhiều tệp và/hoặc các từ khóa hoặc câu khác nhau. Chẳng hạn, lần đầu tiên chúng tôi áp dụng ứng dụng này trong nghiên cứu pháp lý, nơi chúng tôi cần kiểm tra hơn 10.000 phán quyết của tòa án, những phán quyết nào liên quan đến một luật cụ thể

Nhận quy trình làm việc

Cần tìm từ khóa hoặc câu từ nhiều tệp PDF?

Tìm kiếm các lần xuất hiện của một chuỗi nhất định trong một loạt các tệp PDF là điều chúng tôi thấy mình làm rất thường xuyên. Nó có thể dành cho tiện ích cá nhân, chẳng hạn như tìm vé tàu cho hành trình sắp tới hoặc tiện ích kinh doanh nơi chúng tôi trích xuất một số dữ liệu từ tệp PDF. Mặc dù chúng tôi có thể mở từng tệp PDF theo cách thủ công bằng trình xem GUI và tìm kiếm chuỗi, quá trình này sẽ trở nên rất cồng kềnh khi tập hợp tệp lớn

Với các công cụ dòng lệnh, chúng ta có thể dễ dàng tự động tìm kiếm một số lượng lớn tệp. Tuy nhiên, chúng tôi phải lưu ý rằng PDF là định dạng nhị phân và các lệnh tìm kiếm văn bản thuần túy như grep và sed sẽ không hoạt động như mong đợi trên các tệp PDF

Trong hướng dẫn này, chúng ta sẽ xem xét một số lệnh chuyên biệt có thể được sử dụng để tìm kiếm chuỗi trong tệp PDF

2. Sử dụng pdftotext

Lệnh pdftotext là tiện ích chuyển đổi tệp PDF thành văn bản thuần túy. Nó được cung cấp trên hầu hết các bản phân phối Linux theo mặc định. Chúng tôi có thể sử dụng lệnh này để chuyển đổi tất cả các tệp PDF của mình thành văn bản thuần túy và sau đó chạy grep trên kết quả đầu ra là văn bản thuần túy. Đây là một quá trình gồm nhiều bước. Vì vậy, chúng tôi sẽ xem xét từng bước một và sau đó kết hợp tất cả các bước thành một lệnh duy nhất

2. 1. Chuyển đổi tệp PDF thành văn bản thuần túy

Chúng tôi có thể chuyển đổi một tệp PDF thành văn bản thuần túy như sau

$ pdftotext filename.pdf -

Dấu gạch nối ở cuối được sử dụng để hướng dẫn lệnh gửi đầu ra tới thiết bị xuất chuẩn. Nếu không, nó sẽ lưu đầu ra trong một tệp văn bản. Chúng tôi sẽ cần đầu ra đi vào thiết bị xuất chuẩn để chúng tôi có thể đưa nó vào các lệnh khác để xử lý thêm

2. 2. Tìm kiếm trong tệp PDF

Chúng ta có thể đưa đầu ra văn bản thuần túy từ lệnh trên vào lệnh grep để tìm kiếm một chuỗi hoặc mẫu trong tệp

$ pdftotext train-ticket.pdf - | grep --with-filename --label=train-ticket.pdf -i "bengaluru"
train-ticket.pdf:From: KSR BENGALURU(SBC)
train-ticket.pdf:Boarding At: KSR BENGALURU(SBC)

Chúng tôi đã thêm các cờ –with-filename và –nhãn để in tên tệp cho mỗi kết quả khớp. Cờ -i được sử dụng để thực hiện tìm kiếm không phân biệt chữ hoa chữ thường với mẫu được cung cấp. Chúng tôi có thể bỏ qua điều này để thực hiện tìm kiếm phân biệt chữ hoa chữ thường

2. 3. Tìm tất cả các tệp PDF trong thư mục

Bây giờ chúng tôi đã có lệnh tìm kiếm một tệp duy nhất, chúng tôi sẽ phải lặp lại lệnh này trên tất cả các tệp PDF bằng lệnh tìm. Để bắt đầu, chúng ta chỉ cần chạy lệnh find để in tất cả các đường dẫn của tệp PDF trong thư mục hiện tại

$ find . -name '*.pdf'
./sbc-2022-01-02.pdf
./train-ticket.pdf
./downloads/HR_23-01-2022.pdf
./downloads/subfolder/20-01-2022 HMB English.pdf
./30-01-2022 HMB English.pdf

Dấu chấm trong lệnh cho biết thư mục hiện tại và chúng ta có thể thay thế nó bằng bất kỳ đường dẫn nào khác để tìm kiếm trong. *. pdf làm đối số tên lọc tên tệp với. phần mở rộng pdf

2. 4. Kết hợp các bước

Giờ đây, chúng ta có thể sử dụng đối số exec của lệnh find để thực hiện tìm kiếm trên từng tệp và in kết quả theo tệp

$ find . -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" -i bengaluru' \;
./sbc-2022-01-02.pdf:Resv. Upto: KSR BENGALURU(SBC)
./sbc-2022-01-02.pdf:To: KSR BENGALURU(SBC)
./train-ticket.pdf:From: KSR BENGALURU(SBC)
./train-ticket.pdf:Boarding At: KSR BENGALURU(SBC)
./downloads/subfolder/20-01-2022 HMB English.pdf:Bengaluru Urban

Chúng ta thấy rằng lệnh find thực hiện tìm kiếm đệ quy trên các tệp PDF trong thư mục hiện tại và cả các thư mục con. Chúng ta có thể thêm đối số maxdepth để chỉ tìm kiếm thư mục hoặc chỉ bao gồm tối đa một cấp độ thư mục con được chỉ định

$ find . -maxdepth 1 -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" -i bengaluru' \;

3. Sử dụng pdfgrep

Lệnh pdfgrep có thể được sử dụng để tìm kiếm các mẫu trong tệp PDF chỉ trong một bước. Tuy nhiên, nó có thể không có sẵn trên bản phân phối Linux của chúng tôi theo mặc định và chúng tôi sẽ cần cài đặt gói pdfgrep để có thể sử dụng nó. Khi chúng tôi đã thiết lập xong mọi thứ, việc sử dụng nó rất dễ dàng

$ pdfgrep -HiR bengaluru .
./sbc-2022-01-02.pdf:   From: MYSURU JN(MYS)                                                               Date Of Journey: 02-Jan-2022                                                         To: KSR BENGALURU(SBC)
./sbc-2022-01-02.pdf:   Resv. Upto: KSR BENGALURU(SBC)                                                     Scheduled Arrival: 02-Jan-2022 21:05 *                                               Adult: 2 Child: 0
./train-ticket.pdf:   From: KSR BENGALURU(SBC)                                                           Date Of Journey: 01-Jan-2022                                                         To: MYSURU JN(MYS)
./train-ticket.pdf:   Boarding At: KSR BENGALURU(SBC)                                                    Date Of Boarding: 01-Jan-2022                                                        Scheduled Departure: 01-Jan-2022 10:50 *

Chúng tôi đã sử dụng tùy chọn H để in tên tệp, tùy chọn i cho tìm kiếm không phân biệt chữ hoa chữ thường và tùy chọn R để tìm kiếm đệ quy trong tất cả các thư mục con của thư mục đã chỉ định (thư mục hiện tại trong trường hợp này). Đầu ra từ quá trình chuyển đổi có thể hơi lộn xộn với khoảng trống lớn, như chúng ta thấy ở trên

4. Sử dụng ripgrep-all

Chúng ta có thể sử dụng lệnh rga từ tiện ích ripgrep-all để tìm các mẫu trong tệp PDF cũng như các định dạng tệp khác. Trong khi cài đặt gói hơi cồng kềnh, sử dụng lệnh rất đơn giản

$ rga --type pdf bengaluru
sbc-2022-01-02.pdf
Page 1: Resv. Upto: KSR BENGALURU(SBC)
Page 1: To: KSR BENGALURU(SBC)

train-ticket.pdf
Page 1: From: KSR BENGALURU(SBC)
Page 1: Boarding At: KSR BENGALURU(SBC)

Lệnh in tất cả các kết quả trùng khớp cùng với tên tệp cũng như số trang mà mẫu xuất hiện

5. Phần kết luận

Trong bài viết này, chúng tôi đã xem xét các phương pháp khác nhau để tìm kiếm một chuỗi hoặc một mẫu trong tập hợp các tệp PDF. Phương pháp đầu tiên của chúng tôi là một quy trình gồm nhiều bước. Nó liên quan đến việc chạy tìm để lặp lại tất cả các tệp PDF, chạy pdftotext rồi grep trên từng tệp để tìm sự xuất hiện của mẫu. Mặc dù đây là một quá trình phức tạp, nhưng nó sử dụng các lệnh đã có sẵn trên hầu hết các hệ thống theo mặc định

Để thay thế cho phương pháp trên, chúng ta cũng có thể sử dụng pdfgrep và ripgrep-all. Đây là những lựa chọn thay thế một bước đơn giản hơn, nhưng chúng có thể không được cài đặt trên hệ thống của chúng tôi theo mặc định

tác giả dưới cùng

Nếu bạn có một vài năm kinh nghiệm trong hệ sinh thái Linux và bạn muốn chia sẻ trải nghiệm đó với cộng đồng, hãy xem Nguyên tắc đóng góp của chúng tôi

Có cách nào để tìm kiếm nhiều tệp PDF cùng một lúc không?

Từ menu, đi tới “Chỉnh sửa” – “Tìm kiếm nâng cao” hoặc nhấp Shift+Ctrl+F. .
Chọn tùy chọn “Tất cả tài liệu PDF trong”
Mở hộp trình đơn thả xuống và nhấp vào "Duyệt tìm vị trí…" để chọn thư mục đã tìm kiếm của bạn
Trong trường tìm kiếm, nhập văn bản bạn muốn tìm kiếm và nhấn "Tìm kiếm. "

Có cách nào để mở khóa hàng loạt nhiều tệp PDF không?

Làm cách nào để dễ dàng mở khóa nhiều tệp PDF? .
Mở tệp PDF trong Xem trước bằng cách nhấp chuột phải vào tệp PDF
Nhập mật khẩu PDF
Chuyển đến menu Tệp từ thanh menu trên cùng, sau đó nhấp vào Xuất
Nhấp vào Quyền và Nhập mật khẩu Chủ sở hữu PDF của bạn, sau đó nhấp vào Áp dụng
Bây giờ, hãy nhấp vào Lưu để xuất tệp PDF đã mở khóa