Sprawdź, czy pliki PDF nie są uszkodzone za pomocą wiersza polecenia w systemie Linux


16

Mam wiele plików PDF w jednym folderze.

Czy można sprawdzić, czy jeden lub więcej plików jest uszkodzonych (zero stron lub niedokończone pobieranie) za pomocą wiersza poleceń, bez konieczności otwierania ich jeden po drugim?

Odpowiedzi:


20

Być może uruchomienie pdfinfo(tutaj w Fedorze w poppler-utilspakiecie) daje wskazówkę?

Większość informacji na temat pliku PDF znajduje się na końcu w słowniku, więc jeśli go znajdzie, powinno być OK. Zrobiłbym coś takiego:

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

6
Sugerowałbym zastąpienie pdfinfo pdftotext. W ten sposób sprawdzany będzie cały tekst na każdej stronie. Znak> gt powinien być &>, aby nie wyświetlały się wszystkie komunikaty o błędach.
schoetbi

Wszystkie moje pliki PDF są oznaczone jako uszkodzone. Setki gigabajtów z nich. W tym te, które właśnie stworzyłem. Czy używasz pdfinfoczy pdftotext...
PatrickT

13

To jest mój skrypt

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

Aby to wyjaśnić: ten skrypt zmienia nazwy plików pdf, które zostały zdiagnozowane jako „uszkodzone”, dodając .broken do rozszerzenia .pdf.
PatrickT,

5

Moim wybranym narzędziem do sprawdzania plików PDF jest qpdf. qpdfma --checkargument, który dobrze sprawdza się w wyszukiwaniu problemów w plikach PDF.

Sprawdź pojedynczy plik PDF za pomocą qpdf:

qpdf --check test_file.pdf

Sprawdź wszystkie pliki PDF w katalogu za pomocą qpdf:

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

Objaśnienie polecenia:

  • find ./directory_to_scan/ -type f -iname '*.pdf' Znajdź wszystkie pliki z rozszerzeniem „.pdf”

  • -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \; Wykonaj qpdfdla każdego znalezionego pliku i potokuj wszystkie dane wyjściowe do /dev/null. Wydrukuj także nazwę pliku, a po nim „: OK”, jeśli zwracany status qpdfto 0 (tzn. Brak błędów)

  • -o -exec echo "{}": FAILED \; \) Wykonuje się to, jeśli zostaną znalezione błędy: Wydrukuj nazwę pliku, a następnie „: AWARIA”


Gdzie zdobyć qpdf:

qpdfma pliki binarne dla systemu Linux i Windows dostępne na stronie : https://github.com/qpdf/qpdf/releases . Możesz także użyć swojego menedżera pakietów, aby go zdobyć. Na przykład na Ubuntu możesz zainstalować qpdf za pomocą apt z poleceniem:

apt install qpdf

Nie qpdf --checkwykrywa jednak wielokrotnie zdefiniowanych metadanych, które są niepoprawne, ponieważ są obsługiwane w różny sposób przez różne narzędzia. Zgłosiłem błąd . Inne narzędzia, takie jak pdfinfoi pdftknie, ale nie twierdzą, że sprawdzają strukturę PDF.
vinc17


2

Wszystkie metody wykorzystujące pdfinfolub pdftotextnie działały dla mnie. W rzeczywistości ciągle podawali mi fałszywe wyniki i czasami tworzyli pliki, których nie potrzebowałem.

To, co zadziałało, to JHOVE .

Instalacja:

Zainstaluj słoik z powyższego łącza i zaktualizuj zmienną środowiskową PATH za pomocą tego polecenia:

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

Odśwież każdy terminal za pomocą source ~/.bash_profilei możesz zacząć korzystać z niego w całym systemie.

Podstawowe użycie:

jhove -m pdf-hul someFile.pdf

Otrzymasz wiele informacji o pliku pdf - więcej niż większość osób prawdopodobnie potrzebuje.

Bash One-Liner:
Zwraca validlub invalid:

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

Zauważ, że to zostało uruchomione na Mac OS X, ale zakładam, że działa tak samo z każdym środowiskiem Bash opartym na Uniksie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.