Verifique se os arquivos PDF estão corrompidos usando a linha de comando no Linux

16

Eu tenho muitos arquivos PDF em uma pasta.

É possível verificar se um ou mais arquivos estão corrompidos (zero páginas ou downloads inacabados) usando a linha de comando, sem a necessidade de abri-los um por um?

Kokizzu
fonte

Respostas:

20

Talvez executando pdfinfo(aqui no Fedora nopoppler-utils pacote) dê uma pista?

A maioria das informações em um arquivo PDF está no dicionário no final, portanto, se achar que deve estar OK. Eu faria algo como:

for f in *.pdf; do
  if pdfinfo "$f" > /dev/null; then
    : Nothing
  else
    echo "$f" is broken
  fi
done
vonbrand
fonte
6
Eu sugeriria substituir o pdfinfo pelo pdftotext. Dessa forma, todo o texto em todas as páginas será verificado. E o caractere> gt deve ser &> para que todas as mensagens de erro não apareçam.
Schoetbi 17/10/2014
Todos os meus PDFs estão sinalizados como quebrados. Centenas de gigabytes deles. Incluindo os que acabei de criar. Seja usando pdfinfoou pdftotext...
PatrickT
13

Este é o meu script

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
fonte
Para esclarecer: Este script renomeia os arquivos pdf que são diagnosticados como 'interrompidos' anexando .broken à extensão .pdf.
PatrickT
5

Minha ferramenta de escolha para verificar PDFs é qpdf. qpdftem um--check argumento que faz bem em encontrar problemas em PDFs.

Verifique um único PDF com qpdf:

qpdf --check test_file.pdf

Verifique todos os PDFs em um diretório com qpdf:

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

Explicação do comando:

  • find ./directory_to_scan/ -type f -iname '*.pdf' Encontre todos os arquivos com extensão '.pdf'

  • -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \; Execute qpdfpara cada arquivo encontrado e canalize toda a saída para /dev/null. Também imprima o nome do arquivo seguido por ': OK' se o status de retorno qpdffor 0 (ou seja, sem erros)

  • -o -exec echo "{}": FAILED \; \) Isso é executado se forem encontrados erros: Print filename seguido por ": FAILED"


Onde conseguir qpdf :

qpdfpossui binários Linux e Windows disponíveis em: https://github.com/qpdf/qpdf/releases . Você também pode usar o gerenciador de pacotes de sua escolha para obtê-lo. Por exemplo, no Ubuntu, você pode instalar o qpdf usando o apt com o comando:

apt install qpdf
moo
fonte
No entanto, qpdf --checknão detecta metadados multiplamente definidos, que estão incorretos, pois são manipulados de maneira diferente por ferramentas diferentes. Eu relatei um bug . Outras ferramentas como pdfinfoe pdftktambém não, mas não pretendem verificar a estrutura do PDF.
vinc17
4

Eu obtive uma resposta:

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

PDFs com erros mostrarão erros.

Kokizzu
fonte
4
É uma má idéia (e nunca realmente necessário) para iterar sobre a saída de ls: mywiki.wooledge.org/ParsingLs
slhck
2
@ sllck: Isso deve ser tratado com find (1). :-)
Restabelece Monica - M. Schröder
2

Todos os métodos que usam pdfinfoou pdftotextnão funcionaram para mim. Na verdade, eles continuavam me dando falsos positivos e às vezes criavam arquivos que eu não precisava.

O que funcionou foi JHOVE .

Instalação:

Instale o jar a partir do link acima e atualize sua variável de ambiente PATH com este comando:

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

Atualize cada terminal source ~/.bash_profilee você poderá começar a usá-lo em todo o sistema.

Uso básico:

jhove -m pdf-hul someFile.pdf

Você obterá muitas informações sobre o pdf - mais do que a maioria das pessoas provavelmente precisa.

Bash One-Liner:
simplesmente retorna validou invalid:

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

Observe que isso foi executado no Mac OS X, mas presumo que funcione da mesma forma em qualquer ambiente Bash baseado em Unix.

kraftydevil
fonte