私の読者(Zathura)が開けないPDFファイルがあります。それを開く別のリーダー(mupdf)があります。私はZathuraがファイルマジック値(最初の数バイト)の検出に依存していると信じています。なぜならそれはPDF以外の他のフォーマットを開くことができるからです。
検査の結果、私はそれが Java serialisation data, version 5
。
$ file document.pdf
document.pdf: Java serialization data, version 5
最初の数バイトを調べる:
00000000: aced 0005 7572 0002 5b42 acf3 17f8 0608 ....ur..[B......
00000010: 54e0 0200 0078 7000 0389 9525 5044 462d T....xp....%PDF-
通常、PDFは %PDF
バイト0
最初の27バイトを削除すれば、ファイルを開くことができます。
$ dd if=~/Downloads/file.pdf skip=27 bs=1 of=/tmp/file.pdf
さらに詳しく調べると、このファイルはApache FOPバージョン1.1によって生成されたものです。私は、かなりのグーグルにもかかわらず、PDFのためのこのフォーマットの言及を見つけることができません。
これはPDFの有効なフォーマットですか?
更新 ヘッダーを少し掘り下げてみると、 'array'にPDFファイルのデータが含まれているJavaシリアライズ配列のように見えます。私は見た スペック シリアル化プロトコル、特に 文法の説明 27バイトのヘッダを次のようにデコードできます。
AC ED
=STREAM_MAGIC
ファイルの内容をシリアル化プロトコルとして識別します。00 05
=STREAM_VERSION
直列化バージョン。75
=TC_ARRAY
72
=TC_CLASSDESC
00 02
=クラス名の長さ5b 42
=クラス名ur
AC F3 17 F8 06 08 54 E0
=SerialVersionUID
クラスのシリアルバージョン識別子02
=フラグSC_SERIALIZABLE
- オブジェクトはシリアル化をサポートします。00 00
=このクラスのフィールド数(ゼロ!)78
=TC_ENDBLOCKDATA
。70
=TC_NULL
(オブジェクトには親クラスがありません)00 03 89 95
= "配列"の長さ= 231829 =データサイズ(バイト)
抽出されたPDFは確かに231829バイトの長さです
$ dd if=document.pdf skip=27 bs=1 | wc -c
231829 bytes
これは、ファイルが破損しておらず、実際にはPDF文書を含むJavaの直列化配列であることを示しています。しかし、これは有効なPDFと見なされますか?