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?

Kokizzu
źródło

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
vonbrand
źródło
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
schoetbi
źródło
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
muczeć
źródło
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
4

Dostałem odpowiedź:

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

Pliki PDF z błędami będą wyświetlać błędy.

Kokizzu
źródło
4
Jest to zły pomysł (i nigdy tak naprawdę nie potrzebny), aby powtarzać dane wyjściowe ls: mywiki.wooledge.org/ParsingLs
slhck 10.04.2013
2
@slhck: Należy to załatwić find (1). :-)
Przywróć Monikę - M. Schröder
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.

kraftydevil
źródło