Valide / verifique a integridade dos arquivos PDF

8

Existe alguma ferramenta que eu possa executar nos arquivos PDFs (todos os diretórios) e, finalmente, ele lista / identifica os PDFs corrompidos / inválidos?

Tenho centenas de arquivos PDF (relacionados à documentação, etc.) em meu computador (máquina Windows) e, com muita frequência, recebo / tenho que enviar dezenas de PDFs por e-mail. Agora é uma rotina normal que o PDF que recebo ou envio está corrompido. Isso cria sérios problemas, às vezes, quando o arquivo de origem (por exemplo, o arquivo do Word ou o arquivo Tex está ausente / não está disponível instantaneamente).

Verificar esses milhares de PDFs não é possível em tempo finito, então eu procurei uma ferramenta que eu possa rodar uma vez e ele verifica todos os PDFs (em diretórios e subdiretórios), e finalmente eu recebo uma lista desses arquivos que Eu deveria recriar. Até agora, parece que não existe tal ferramenta.

    
por Admiral 25.06.2014 / 17:00

4 respostas

5

É muito fácil verificar se um arquivo PDF é válido, usando o PDFtk. Um GUI livre para PDFtk está disponível em PDF Labs . Quando você executa essa ferramenta, você pode carregar quantos PDFs desejar, a partir de vários diretórios (usando o botão Adicionar arquivos), e então ela começará a acessar as páginas nesses arquivos PDF rapidamente.

Se qualquer arquivo entre os PDFs selecionados não for PDF válido, esse utilitário mostrará uma mensagem sobre o erro e o removerá automaticamente da janela de seleção.

Portanto, você pode economizar muitas horas usando este procedimento com o PDFtk. Além disso, se você tiver uma CPU multicore, poderá executar várias instâncias desse utilitário e lançar centenas de PDFs em cada instância.

Estou usando este software desde o último ano e é a ferramenta PDF mais útil que já usei.

    
por 25.06.2014 / 22:56
4

Eu usei "pdfinfo.exe" do pacote xpdfbin-win e cpdf.exe para verificar arquivos PDF quanto à corrupção, mas não queria envolver um binário se não fosse necessário.

Eu li que os formatos PDF mais recentes têm um catálogo de dados xml legível no final, então eu abri o PDF com o Windows regular NOTEPAD.exe e rolei para baixo após os dados ilegíveis até o final e vi várias chaves legíveis. Eu só precisava de uma chave, mas escolhi usar CreationDate e ModDate.

O seguinte script do Powershell (PS) verificará TODOS os arquivos PDF no diretório atual e gerará o status de cada um em um arquivo de texto (! RESULTS.log). Demorou cerca de 2 minutos para executar isso em 35.000 arquivos PDF. Eu tentei adicionar comentários para aqueles que são novos no PS. Espero que isso economize alguém algum tempo. Há provavelmente uma maneira melhor de fazer isso, mas isso funciona perfeitamente para os meus propósitos e lida com erros silenciosamente. Pode ser necessário definir o seguinte no início: $ ErrorActionPreference="SilentlyContinue" se você vir erros na tela.

Copie o seguinte em um arquivo de texto e nomeie-o adequadamente (ex: CheckPDF.ps1) ou abra o PS e vá até o diretório que contém os arquivos PDF para verificar e colá-lo no console.

#
# PowerShell v4.0
#
# Get all PDF files in current directory
#
$items = Get-ChildItem | Where-Object {$_.Extension -eq ".pdf"}

$logFile = "!RESULTS.log"
$badCounter = 0
$goodCounter = 0
$msg = "'n'nProcessing " + $items.count + " files... "
Write-Host -nonewline -foregroundcolor Yellow $msg
foreach ($item in $items)
{
    #
    # Suppress error messages
    #
    trap { Write-Output "Error trapped"; continue; }

    #
    # Read raw PDF data
    #
    $pdfText = Get-Content $item -raw

    #
    # Find string (near end of PDF file), if BAD file, ptr will be undefined or 0
    #
    $ptr1 = $pdfText.IndexOf("CreationDate")
    $ptr2 = $pdfText.IndexOf("ModDate")

    #
    # Grab raw dates from file - will ERR if ptr is 0
    #
    try { $cDate = $pdfText.SubString($ptr1, 37); $mDate = $pdfText.SubString($ptr2, 31); }

    #
    # Append filename and bad status to logfile and increment a counter
    # catch block is also where you would rename, move, or delete bad files.
    #
    catch { "*** $item is Broken ***" >> $logFile; $badCounter += 1; continue; }

    #
    # Append filename and good status to logfile
    #
    Write-Output "$item - OK" -EA "Stop" >> $logFile

    #
    # Increment a counter
    #
    $goodCounter += 1
}
#
# Calculate total
#
$totalCounter = $badCounter + $goodCounter

#
# Append 3 blank lines to end of logfile
#
1..3 | %{ Write-Output "" >> $logFile }

#
# Append statistics to end of logfile
#
Write-Output "Total: $totalCounter / BAD: $badCounter / GOOD: $goodCounter" >> $logFile
Write-Output "DONE!'n'n"
    
por 25.05.2017 / 16:49
3

Seguindo os passos de @n0nuf, escrevi um script em lote para verificar todos os PDFs em uma pasta específica com o pdfinfo e enviar por cpdf se estiver quebrado como uma tentativa de corrigi-los:

@ECHO OFF
FOR %%f in (*.PDF) DO (
    echo %%f
    pdfinfo "%%f" 2>&1 | findstr /I "error"  >nul 2>&1
    if not errorlevel 1 (
        echo "bad -> try to fix"
        @cpdf -i %%f -o %%f_.pdf 2>NUL
        mv %%f .\bak\%%f
    ) else (
       REM echo good        
    )
)
@ECHO ON

Ou o mesmo que o script bash:

for file in $(find . -iname "*.pdf")
do
    echo "$file"
    pdfinfo "$file" 2>&1 | grep -i 'error' &> /dev/null
    if [ $? == 0 ]; then
       echo "broken -> try to fix"
       cpdf -i "$file" -o "$file"_.pdf
    fi
done

PDFs quebrados serão movidos para uma subpasta \ bak e os PDFs recriados receberão o sufixo _.pdf (que não é perfeito, mas bom o suficiente para mim). NOTA: Um PDF recriado contém menos erros e deve ser visualizável com um visualizador de PDF comum. Mas isso não significa que você recupere todo o seu conteúdo. Conteúdo irrecuperável leva a páginas vazias.

Eu também tentei o mesmo com o JHOVE (Ferramenta de identificação, validação e caracterização de arquivos de código aberto) como sugerido por @kraftydevil aqui: Verifique se os arquivos PDF estão corrompidos usando a linha de comando no Linux e agora podemos confirmar que esta também é uma abordagem válida. (Primeiro eu tive menos sucesso. Mas então percebi que não havia manipulado a saída do JHOVE corretamente.)

Para testar as duas abordagens, excluí e alterei as partes aleatórias de um PDF com um editor de texto (removi fluxos, assim as páginas não foram renderizadas em meu visualizador de PDF, alterei as marcações de PDF e alterei alguns bits). O resultado é: Tanto o pdfinfo quanto o JHOVE conseguem identificar corretamente os arquivos danificados (o JHOVE foi ainda mais sensível em alguns casos).

E aqui está o script equivalente para JHOVE:

@ECHO OFF
FOR %%f in (*.PDF) DO (
    echo %%f
    "C:\Program Files (x86)\JHOVE\jhove.bat" -m pdf-hul %%f | findstr /C:"Well-Formed and valid" >nul 2>&1
    if not errorlevel 1 (
        echo good
    ) else (
        echo "bad -> try to fix"
        @cpdf -i %%f -o %%f_.pdf 2>NUL
        REM mv %%f .\bak\%%f
    )
)
@ECHO ON
    
por 11.07.2017 / 06:47
0

Há uma diferença entre o tipo de arquivo "PDF não válido" e um arquivo PDF corrompido. Acabei de executar um arquivo PDF corrompido por meio do pdftk e ele não detectou isso.

Até agora o pdf2ps (uma ferramenta ghostscript) detecta melhor os arquivos corrompidos, mas não tenho certeza se os arquivos PDF criados em Macs são corretamente avaliados.

    
por 09.12.2016 / 17:53