根据规格,最小PDF大小

时间:2016-01-19 21:07:19

标签: pdf binaryfiles file-structure

我正在阅读PDF规范,我对它的结构有一些疑问。

首先,文件签名是%PDF-n.m(8个字节)。 之后,文档说可能至少 4字节的二进制数据(但也可能没有)。文档没有说明可能有多少二进制字节,所以这是我的第一个问题。如果我试图解析PDF文件,我应该如何解析该部分?我怎么知道放在那里的二进制字节数(如果有的话)?我应该在哪里停止解析?

之后,应该有一个正文,一个外部参照表和一个预告片以及%%EOF

PDF文件的最小文件大小是多少,假设PDF文件中没有任何内容(没有任何对象),并假设文件开头不包含可选的二进制字节部分? / p>

第三个也是最后一个问题:如果有多个正文+外部参照+预告片部分,那么在%%EOF指向之前会偏移哪个部分?第一个或最后一个xref表?

1 个答案:

答案 0 :(得分:2)

  

首先,文件签名是%PDF-n.m(8字节)。之后,文档说可能至少有4个字节的二进制数据(但也可能没有)。文档没有说明可能有多少二进制字节,所以这是我的第一个问题。如果我试图解析PDF文件,我应该如何解析该部分?我怎么知道放在那里的二进制字节数(如果有的话)?我应该在哪里停止解析?

你有哪些文件? PDF规范ISO 32000-1说:

  

如果PDF文件包含二进制数据,则大多数情况下都是如此(参见7.2,"词汇约定"),标题行应为   紧接着是包含至少四个二进制字符的评论 - 即   代码是128或更大。

因此,那些至少4个字节的二进制数据不会立即跟随文件签名而没有任何结构,但它们位于注释 !这意味着他们是

  1. 前面有一个%(它开始一个评论,即无论如何都要解析时你必须忽略的数据)和
  2. 后跟行尾,即CR,LF或CR LF。
  3. 因此在解析时很容易识别。特别是它只是注释行的一个特例,没有特别的处理。

    (叹了口气,我刚刚看到你和@Jongware在我写这篇文章时的评论中清除了......)

      

    PDF的最小文件大小是什么,假设PDF文件中没有任何内容(没有任何对象),并假设文件中没有包含可选的二进制字节部分一开始?

    如果没有对象,则您没有PDF文件,因为PDF文件中需要某些对象,特别是目录。那么你的意思是最小的有效PDF文件吗?

    正如您所评论的那样,您的确意味着最低限度的有效PDF。

    请查看有关stackoverflow的问题What is the smallest possible valid PDF?,有些尝试创建或多或少严格遵守规范的最小PDF。阅读例如@plinth's answer您将看到不再是PDF的内容,但仍会被Adobe Reader接受。

      

    第三个也是最后一个问题:如果有多个正文+外部参照+预告片部分,那么在%% EOF指向之前会在哪里偏移?

    通常它将是最后一个交叉引用表/流,因为通常的用例是

    • 您从PDF开始,该PDF只有一个交叉引用部分;
    • 您附加一个增量更新,其中交叉引用部分指向原始上一个,并且%%EOF之前的新偏移指向新的交叉引用;
    • 您附加了另一个增量更新,其中交叉引用部分指向第一个更新的交叉引用为上一个,并且%%EOF之前的新偏移指向最新的交叉引用;
    • 等...

    线性化文档的例外情况,其中%%EOF之前的偏移指向初始交叉引用,而这些引用又指向文件末尾的部分< EM>前。详情请参阅ISO 32000-1的附件F.

    当然,您可以对线性化文档应用增量更新,但您可以使用混合形式。

    通常,解析器最好能够解析部分交叉引用的任何顺序。不要忘记,不仅有交叉参考部分,还有交叉参考流。