Kiểm tra xem các tệp PDF có bị hỏng khi sử dụng dòng lệnh trên Linux không


16

Tôi có nhiều tệp PDF trên một thư mục.

Có thể kiểm tra xem một hoặc nhiều tệp bị hỏng (không có trang hoặc tải xuống chưa hoàn thành) bằng cách sử dụng dòng lệnh, mà không cần phải mở từng cái một?

Câu trả lời:


20

Có lẽ việc chạy pdfinfo(ở đây trên Fedora trong poppler-utilsgói) cho một manh mối?

Hầu hết các thông tin trên một tệp PDF đều có trong từ điển, vì vậy nếu tìm thấy nó thì nó sẽ ổn. Tôi sẽ làm một cái gì đó như:

for f in *.pdf; do
  if pdfinfo "$f" > /dev/null; then
    : Nothing
  else
    echo "$f" is broken
  fi
done

6
Tôi sẽ đề nghị thay thế pdfinfo bằng pdftotext. Bằng cách này, tất cả văn bản trên mỗi trang sẽ được kiểm tra. Và ký tự> gt phải là &> để tất cả các thông báo lỗi không hiển thị.
schoetbi

Tất cả các tệp PDF của tôi được gắn cờ là bị hỏng. Hàng trăm gigabyte trong số họ. Bao gồm những cái tôi vừa tạo. Dù sử dụng pdfinfohay pdftotext...
PatrickT

13

Đây là kịch bản của tôi

find . -iname '*.pdf' | while read -r f
  do
    if pdftotext "$f" &> /dev/null; then 
        echo "$f" was ok;   
    else
        mv "$f" "$f.broken";
        echo "$f" is broken;   
    fi; 
done

Để làm rõ: Tập lệnh này đổi tên các tệp pdf được chẩn đoán là 'bị hỏng' bằng cách thêm .broken vào phần mở rộng .pdf.
PatrickT

5

Công cụ lựa chọn của tôi để kiểm tra các tệp PDF là qpdf. qpdfcó một --checkđối số không tốt để tìm các vấn đề trong các tệp PDF.

Kiểm tra một tệp PDF với qpdf:

qpdf --check test_file.pdf

Kiểm tra tất cả các tệp PDF trong một thư mục với qpdf:

find ./directory_to_scan/ -type f -iname '*.pdf' \( -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \; -o -exec echo "{}": FAILED \; \)

Giải thích về Lệnh:

  • find ./directory_to_scan/ -type f -iname '*.pdf' Tìm tất cả các tệp có phần mở rộng '.pdf'

  • -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \; Thực thi qpdfcho từng tập tin được tìm thấy và đường ống tất cả đầu ra /dev/null. Đồng thời in tên tệp theo sau ': OK' nếu trạng thái trả về qpdflà 0 (nghĩa là không có lỗi)

  • -o -exec echo "{}": FAILED \; \) Điều này được thực thi nếu tìm thấy lỗi: In tên tệp theo sau ": FAILED"


Nơi nhận được qpdf:

qpdfcó cả nhị phân Linux và Windows có sẵn tại: https://github.com/qpdf/qpdf/release . Bạn cũng có thể sử dụng trình quản lý gói lựa chọn của mình để có được nó. Ví dụ: trên Ubuntu, bạn có thể cài đặt qpdf bằng lệnh apt:

apt install qpdf

Tuy nhiên, qpdf --checkkhông phát hiện siêu dữ liệu được xác định nhiều lần, không chính xác vì chúng được xử lý khác nhau bởi các công cụ khác nhau. Tôi đã báo cáo một lỗi . Các công cụ khác như pdfinfopdftkkhông, nhưng họ không yêu cầu kiểm tra cấu trúc PDF.
vinc17

4

Tôi đã có cho mình một câu trả lời:

for x in *.pdf; do echo "$x"; pdfinfo "$x" | grep Pages; done

Các tệp PDF có lỗi sẽ hiển thị lỗi.


4
Đó là một ý tưởng tồi (và không bao giờ thực sự cần thiết) để lặp lại kết quả đầu ra của ls: mywiki.wooledge.org/ParsingLs
slhck

2
@slhck: Điều này nên được xử lý với find (1). :-)
Tái lập lại Monica - M. Schröder

2

Tất cả các phương pháp sử dụng pdfinfohoặc pdftotextkhông có hiệu quả đối với tôi. Trong thực tế, họ tiếp tục cho tôi những thông tin sai lệch và đôi khi tạo ra những tập tin mà tôi không cần.

Những gì đã làm việc là JHISE .

Cài đặt:

Cài đặt jar từ liên kết trên và cập nhật biến môi trường PATH của bạn bằng lệnh này:

echo "export PATH=\$PATH:/REPLACE_WITH/YOUR/PATH_TO/jhove/" >> ~/.bash_profile

Làm mới mỗi thiết bị đầu cuối với source ~/.bash_profilevà bạn tốt để bắt đầu sử dụng hệ thống rộng.

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

jhove -m pdf-hul someFile.pdf

Bạn sẽ nhận được rất nhiều thông tin về pdf - nhiều hơn hầu hết mọi người có thể cần.

Bash One-liner:
Đơn giản là trả về validhoặc invalid:

if [[ $(jhove -m pdf-hul someFile.pdf | grep -a "Status:") == *"Well-Formed and valid"* ]]; then echo "valid"; else echo "invalid"; fi;

Lưu ý rằng điều này đã được chạy trên Mac OS X nhưng tôi cho rằng nó hoạt động tương tự với bất kỳ môi trường Bash dựa trên Unix nào.

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.