符合规范的最小PDF大小

符合规范的最小PDF大小,pdf,binaryfiles,file-structure,Pdf,Binaryfiles,File Structure,我正在阅读PDF规范,我对它的结构有一些疑问 首先,文件签名是%PDF-n.m(8字节)。 之后,文档说可能至少有4个字节的二进制数据(但也可能没有)。文档没有说明可以有多少二进制字节,所以这是我的第一个问题。如果我试图解析PDF文件,我应该如何解析该部分?我怎么知道有多少二进制字节(如果有的话)放在那里?我应该在哪里停止解析 之后,应该有一个主体、一个外部参照表和一个尾部以及一个%%EOF 假设PDF文件中没有任何内容(没有任何对象),并且假设文件开头不包含可选的二进制字节部分,那么PDF的最

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

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

之后,应该有一个主体、一个外部参照表和一个尾部以及一个
%%EOF

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

第三个也是最后一个问题:如果有多个主体+外部参照+拖车部分,那么在
%%EOF
指向之前偏移到哪里?第一个还是最后一个
xref

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

你有哪些文件?PDF规范说明:

如果PDF文件包含二进制数据,与大多数文件一样(见7.2“词汇约定”),则标题行应为 紧接着是一个注释行,该行至少包含四个二进制字符,即 代码为128或更大

因此,这些至少4字节的二进制数据不会紧跟在没有任何结构的文件签名之后,而是在注释行上!这意味着它们是

  • 前面有一个
    %
    (它开始一条注释,即在解析时必须忽略的数据)和
  • 后接行尾,即CR、LF或CR-LF
  • 因此,在解析时很容易识别。特别是,它只是注释行的一个特例,没有什么需要特别处理的

    (叹气,我刚刚看到你和@Jongware在我写这篇文章时的评论中澄清了这一点……)

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

    如果没有对象,则没有PDF文件,因为PDF文件中需要某些对象,尤其是目录。你是说一个最小有效的PDF文件吗

    正如你所评论的,你的意思是一个最小的有效PDF

    请看一下关于stackoverflow的问题,有一些尝试创建最小的PDF,或多或少严格遵守规范。阅读,例如,你会看到不再是PDF格式的东西,但仍然被Adobe Reader接受

    第三个也是最后一个问题:如果有多个主体+外部参照+拖车部分,在%%EOF指向之前偏移到哪里

    通常,它将是最后一个交叉引用表/流,就像通常的用例一样

    • 你从只有一个交叉参考部分的PDF开始
    • 您附加了一个增量更新,其交叉引用部分与之前一样指向原始交叉引用,并且
      %%EOF
      之前的新偏移量指向该新交叉引用
    • 您附加了另一个增量更新,其中的交叉引用部分指向上一次更新中的交叉引用,并且
      %%EOF
      之前的新偏移量指向该最新的交叉引用
    • 等等
    线性化文档的例外情况是,
    %%EOF
    之前的偏移量指向初始交叉引用,而初始交叉引用又像前面一样指向文件末尾的部分。有关详细信息,请参见附录F

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

    一般来说,解析器最好能够解析任意顺序的部分交叉引用。别忘了,不仅有交叉参考部分,还有交叉参考流

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

    你有哪些文件?PDF规范说明:

    如果PDF文件包含二进制数据,与大多数文件一样(见7.2“词汇约定”),则标题行应为 紧接着是一个注释行,该行至少包含四个二进制字符,即 代码为128或更大

    因此,这些至少4字节的二进制数据不会紧跟在没有任何结构的文件签名之后,而是在注释行上!这意味着它们是

  • 前面有一个
    %
    (它开始一条注释,即在解析时必须忽略的数据)和
  • 后接行尾,即CR、LF或CR-LF
  • 因此,在解析时很容易识别。特别是,它只是注释行的一个特例,没有什么需要特别处理的

    (叹气,我刚刚看到你和@Jongware在我写这篇文章时的评论中澄清了这一点……)

    假设PDF文件中没有任何内容(没有对象),那么PDF的最小文件大小是多少