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?

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

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

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

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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.