Um PDF válido pode ser “dados de serialização Java”?

1

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 ele foi 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ça com %PDF no byte 0.

Se eu remover 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 depois de mergulhar um pouco no cabeçalho, parece ser um array serializado em java no qual o 'array' contém os dados do arquivo PDF. Eu olhei para a especificação para o protocolo de serialização e, em particular, a descrição gramatical da qual eu poderia decodificar o cabeçalho de 27 bytes como:

  • AC ED = STREAM_MAGIC identifica o conteúdo do arquivo como protocolo de serialização.

  • 00 05 = STREAM_VERSION A versão de serialização.

  • 75 = TC_ARRAY
  • 72 = TC_CLASSDESC
  • 00 02 = comprimento do nome da classe.
  • 5b 42 = o nome da classe ur
  • AC F3 17 F8 06 08 54 E0 = SerialVersionUID , o identificador da versão em série da classe.
  • 02 = flag SC_SERIALIZABLE - o objeto suporta serialização.
  • 00 00 = Número de campos nesta classe (zero!)
  • 78 = TC_ENDBLOCKDATA .
  • 70 = TC_NULL (o objeto não tem classe pai).
  • 00 03 89 95 = comprimento de "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?

    
por starfry 23.05.2017 / 18:46

1 resposta

1

A referência diz o seguinte:

3.4.1 File Header

The first line of a PDF file is a header identifying the version of the PDF
specification to which the file conforms. For a file conforming to PDF 1.7, 
the header should be

    %PDF−1.7

Minha interpretação dessa linha é que, estritamente falando, o arquivo que você tem é não um arquivo PDF válido. A primeira linha termina com o valor correto, mas contém "lixo" adicional antes.

Como já foi dito, é mais provável que até a implementação do leitor de PDF procure a %PDF-x.x magic, e meu palpite é que a maioria lê até atingir o primeiro 0D 0A que no seu caso acontece logo após o marcador PDF.

Se os dados de serialização contivessem o valor 0D 0A , então meu palpite é que o mupdf também falharia em lê-lo.

    
por 25.05.2017 / 11:40

Tags