有效的PDF可以是“Java序列化数据”吗?


1

我有一个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= flag SC_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吗?

Answers:


1

引用有这样的说法:

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

我对该行的解释是严格来说,您拥有的文件不是有效的PDF文件。第一行以正确的值结束,但它前面包含额外的“垃圾”。

有人说,最有可能的是PDF阅读器的实现如何寻找%PDF-x.x魔法,我的猜测是大多数读取,直到它们碰到0D 0A你的情况恰好在PDF标记之后的第一个。

如果序列化数据包含该0D 0A值,那么我的猜测是mupdf也无法读取它。


我正在写相同的答案,但你只是更快一点。我完全同意。没有合适的PDF阅读器应该接受这样的文件有效。有些人不管额外的数据如何都是纯粹的运气。
Tonny

它只是0A跟在标题之后的一个单独的(实际上是规范建议的注释行0a 25aa abac ad0a ),但是你的观点是有道理的,为什么一个更放松的读者可以应对那些坚持规范的人。
starfry

看来,任何的组合0A0D或者0D 0A工作。我有我的桌面上的两个PDF文件,以及一个具有0D与其他人有0D 0A。:)
马格努斯2017年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.