Bisakah PDF yang valid menjadi "data serialisasi Java"?

1

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 %PDFbyte 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_MAGICmengidentifikasi konten file sebagai protokol serialisasi.

  • 00 05= STREAM_VERSIONVersi serialisasi.

  • 75 = TC_ARRAY
  • 72 = TC_CLASSDESC
  • 00 02 = Panjang nama kelas.
  • 5b 42 = nama kelas ur
  • AC F3 17 F8 06 08 54 E0= SerialVersionUID, pengidentifikasi versi serial kelas.
  • 02= flag SC_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?

starfry
sumber

Jawaban:

1

The referensi telah mengatakan ini:

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

Penafsiran saya tentang baris itu adalah bahwa secara tegas, file yang Anda miliki bukan file PDF yang valid. Baris pertama berakhir dengan nilai yang benar, tetapi berisi "sampah" tambahan sebelum itu.

Karena itu, kemungkinan besar tergantung pada penerapan pembaca PDF cara mencari %PDF-x.xkeajaiban, dan tebakan saya adalah yang paling banyak dibaca sampai mereka mencapai yang pertama 0D 0Ayang dalam kasus Anda terjadi tepat setelah penanda PDF.

Jika data serialisasi mengandung 0D 0Anilai, maka tebakan saya adalah bahwa mupdf juga akan gagal untuk membacanya.

Magnus
sumber
Saya menulis jawaban yang sama, tetapi Anda sedikit lebih cepat. Saya sangat setuju. Pembaca PDF yang tepat tidak boleh menerima file seperti itu sebagai valid. Yang dilakukan beberapa orang terlepas dari data tambahan adalah keberuntungan semata.
Tonny
Ini hanya satu-satunya 0Ayang mengikuti tajuk (sebenarnya baris komentar seperti yang disarankan oleh spec - 0a 25aa abac ad0a ) tetapi poin Anda masuk akal mengapa pembaca yang lebih santai mungkin mengatasi ketika mereka yang mengikuti spesifikasi tidak.
Starfry
Tampaknya ada kombinasi dari 0A, 0Datau 0D 0Aberfungsi .. Saya memiliki dua file PDF di desktop saya, dan satu memiliki 0Ddan yang lainnya memiliki 0D 0A. :)
Magnus