Eu tenho um arquivo PDF que meu leitor (Zathura) não abriria. Eu tenho outro leitor (mupdf) que abri-lo. Acredito que o Zathura depende da detecção do valor mágico do arquivo (primeiros bytes), pois ele pode abrir outros formatos além do PDF.
Na inspeção, notei que é detectado como Java serialisation data, version 5.
$ file document.pdf
document.pdf: Java serialization data, version 5
Inspecionando os primeiros bytes:
00000000: aced 0005 7572 0002 5b42 acf3 17f8 0608 ....ur..[B......
00000010: 54e0 0200 0078 7000 0389 9525 5044 462d T....xp....%PDF-
Normalmente, um PDF começaria com %PDF no byte 0.
Se eu despir os primeiros 27 bytes, posso abrir o arquivo:
$ dd if=~/Downloads/file.pdf skip=27 bs=1 of=/tmp/file.pdf
Uma inspeção mais detalhada mostra que o arquivo foi gerado pelo Apache FOP Versão 1.1. Não consigo encontrar qualquer metion deste formato para um PDF, apesar de um pouco do Google.
Este é um formato válido para um PDF?
atualizar Tendo mergulhado um pouco no cabeçalho, ele parece ser um array serializado em java, onde o 'array' contém os dados do arquivo PDF. Olhei para o especificação para o protocolo de serialização e, em particular, o descrição gramatical a partir do qual eu poderia decodificar o cabeçalho de 27 bytes como:
AC ED=STREAM_MAGICidentifica o conteúdo do arquivo como protocolo de serialização.00 05=STREAM_VERSIONA versão de serialização.75=TC_ARRAY72=TC_CLASSDESC00 02= Comprimento do nome da classe.5b 42= o nome da classeurAC F3 17 F8 06 08 54 E0=SerialVersionUID, o identificador da versão em série da classe.02= flagSC_SERIALIZABLE- o objeto suporta serialização.00 00= Número de campos nesta classe (zero!)78=TC_ENDBLOCKDATA.70=TC_NULL(Objeto não tem classe pai).00 03 89 95= length of "array" = 231829 = tamanho dos dados em bytes
O PDF extraído é de fato 231829 bytes
$ dd if=document.pdf skip=27 bs=1 | wc -c
231829 bytes
Isso indicaria que o arquivo não está corrompido e é, de fato, um array serializado Java que contém um documento PDF. Mas isso seria considerado um PDF válido?