我有一个PDF文件,我的读者(Zathura)无法打开。我有另一个读者(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的有效格式吗?
更新已经深入到标题中它似乎是一个java序列化数组,其中'array'包含PDF文件数据。我查看了序列化协议的规范,特别是语法描述 ,我可以将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
= flagSC_SERIALIZABLE
- 对象支持序列化。00 00
=此类中的字段数(零!)78
=TC_ENDBLOCKDATA
。70
=TC_NULL
(对象没有父类)。00 03 89 95
=“array”的长度= 231829 =以字节为单位的数据大小
提取的PDF确实长231829字节
$ dd if=document.pdf skip=27 bs=1 | wc -c
231829 bytes
这表明文件没有损坏,实际上是包含PDF文档的Java序列化数组。但这会被视为有效的PDF吗?