Saya memiliki file PDF yang tidak dapat dibuka oleh pembaca saya (Zathura). Saya punya pembaca lain (mupdf) yang membukanya. Saya percaya bahwa Zathura bergantung pada pendeteksian nilai sulap file (beberapa byte pertama) karena dapat membuka format lain selain PDF.
Pada inspeksi, saya perhatikan bahwa terdeteksi sebagai Java serialisation data, version 5
.
$ file document.pdf
document.pdf: Java serialization data, version 5
Memeriksa beberapa byte pertama:
00000000: aced 0005 7572 0002 5b42 acf3 17f8 0608 ....ur..[B......
00000010: 54e0 0200 0078 7000 0389 9525 5044 462d T....xp....%PDF-
Biasanya sebuah PDF akan dimulai dengan %PDF
byte 0.
Jika saya menghapus 27 byte pertama, saya dapat membuka file:
$ dd if=~/Downloads/file.pdf skip=27 bs=1 of=/tmp/file.pdf
Pemeriksaan lebih lanjut menunjukkan bahwa file tersebut dihasilkan oleh Apache FOP Versi 1.1. Saya tidak dapat menemukan metion apa pun dari format ini untuk PDF meskipun ada sedikit Google.
Apakah ini format yang valid untuk PDF?
Pembaruan telah menyelidiki sedikit ke header itu tampaknya menjadi array serial java di mana 'array' berisi data file PDF. Saya melihat spesifikasi untuk protokol serialisasi dan, khususnya, deskripsi tata bahasa dari mana saya bisa mendekode header 27 byte sebagai:
AC ED
=STREAM_MAGIC
mengidentifikasi konten file sebagai protokol serialisasi.00 05
=STREAM_VERSION
Versi serialisasi.75
=TC_ARRAY
72
=TC_CLASSDESC
00 02
= Panjang nama kelas.5b 42
= nama kelasur
AC F3 17 F8 06 08 54 E0
=SerialVersionUID
, pengidentifikasi versi serial kelas.02
= flagSC_SERIALIZABLE
- objek mendukung serialisasi.00 00
= Jumlah bidang dalam kelas ini (nol!)78
=TC_ENDBLOCKDATA
.70
=TC_NULL
(Objek tidak memiliki kelas induk).00 03 89 95
= panjang "array" = 231829 = ukuran data dalam byte
PDF yang diekstraksi memang sepanjang 231829 byte
$ dd if=document.pdf skip=27 bs=1 | wc -c
231829 bytes
Ini akan menunjukkan bahwa file tersebut tidak rusak dan memang merupakan array serial Java yang berisi dokumen PDF. Tetapi apakah ini dianggap sebagai PDF yang valid?