我正在阅读PDF规范,我对它的结构有一些疑问。
首先,文件签名是%PDF-n.m
(8个字节)。
之后,文档说可能至少 4字节的二进制数据(但也可能没有)。文档没有说明可能有多少二进制字节,所以这是我的第一个问题。如果我试图解析PDF文件,我应该如何解析该部分?我怎么知道放在那里的二进制字节数(如果有的话)?我应该在哪里停止解析?
之后,应该有一个正文,一个外部参照表和一个预告片以及%%EOF
。
PDF文件的最小文件大小是多少,假设PDF文件中没有任何内容(没有任何对象),并假设文件开头不包含可选的二进制字节部分? / p>
第三个也是最后一个问题:如果有多个正文+外部参照+预告片部分,那么在%%EOF
指向之前会偏移哪个部分?第一个或最后一个xref
表?
答案 0 :(得分:2)
首先,文件签名是%PDF-n.m(8字节)。之后,文档说可能至少有4个字节的二进制数据(但也可能没有)。文档没有说明可能有多少二进制字节,所以这是我的第一个问题。如果我试图解析PDF文件,我应该如何解析该部分?我怎么知道放在那里的二进制字节数(如果有的话)?我应该在哪里停止解析?
你有哪些文件? PDF规范ISO 32000-1说:
如果PDF文件包含二进制数据,则大多数情况下都是如此(参见7.2,"词汇约定"),标题行应为 紧接着是包含至少四个二进制字符的评论行 - 即 代码是128或更大。
因此,那些至少4个字节的二进制数据不会立即跟随文件签名而没有任何结构,但它们位于注释行 !这意味着他们是
%
(它开始一个评论,即无论如何都要解析时你必须忽略的数据)和因此在解析时很容易识别。特别是它只是注释行的一个特例,没有特别的处理。
(叹了口气,我刚刚看到你和@Jongware在我写这篇文章时的评论中清除了......)
PDF的最小文件大小是什么,假设PDF文件中没有任何内容(没有任何对象),并假设文件中没有包含可选的二进制字节部分一开始?
如果没有对象,则您没有PDF文件,因为PDF文件中需要某些对象,特别是目录。那么你的意思是最小的有效PDF文件吗?
正如您所评论的那样,您的确意味着最低限度的有效PDF。
请查看有关stackoverflow的问题What is the smallest possible valid PDF?,有些尝试创建或多或少严格遵守规范的最小PDF。阅读例如@plinth's answer您将看到不再是PDF的内容,但仍会被Adobe Reader接受。
第三个也是最后一个问题:如果有多个正文+外部参照+预告片部分,那么在%% EOF指向之前会在哪里偏移?
通常它将是最后一个交叉引用表/流,因为通常的用例是
%%EOF
之前的新偏移指向新的交叉引用; %%EOF
之前的新偏移指向最新的交叉引用; 线性化文档的例外情况,其中%%EOF
之前的偏移指向初始交叉引用,而这些引用又指向文件末尾的部分< EM>前。详情请参阅ISO 32000-1的附件F.
当然,您可以对线性化文档应用增量更新,但您可以使用混合形式。
通常,解析器最好能够解析部分交叉引用的任何顺序。不要忘记,不仅有交叉参考部分,还有交叉参考流。