【问题标题】:How are PDF files able to be partially displayed while downloading?下载时如何部分显示 PDF 文件?
【发布时间】:2015-06-07 15:50:15
【问题描述】:
根据PDF 1.7 specification,第 90 页,第 3.4 节:
前面的部分描述了各个对象的语法。这
部分描述了如何在 PDF 文件中组织对象以提高效率
随机访问和增量更新。最初是一个规范的 PDF 文件
由四个元素组成(见图 3.2):
基本上,该结构具有标题,然后是正文内容,然后是交叉引用表,最后是给出外部参照表位置的预告片。这里的关键部分是trailer和xref表在文件末尾,xref表包含正文内容的相关元数据(主要是10位字节偏移)。
鉴于外部参照表本身位于PDF 文件的最后:
- 在整个文件下载完成之前,我的浏览器 (Google Chrome) 为何能够部分显示 PDF 文件(前一百页左右)?
查看我部分下载的 PDF 文件的屏幕截图:
【问题讨论】:
标签:
pdf
random-access
cross-reference
【解决方案1】:
OP 描述的 PDF 文件类型也称为 “网络优化”(营销术语)或 “线性化”(PDF 术语中的技术术语)。
必须注意,它仅在满足两个额外条件(在文件的线性化功能之上)时才有效:
- PDF 查看器需要能够处理这些类型的 PDF 并利用线性化功能。
- 服务于线性化 PDF 的(远程)主机需要支持“字节流”。
如果服务器不支持字节流或 PDF 文件未线性化,则需要完整下载整个文件仍然,然后查看器才能下载显示任何页面。
OP 引用的关于 PDF 文件结构的描述不适用于线性化的 PDF 文件。它们的组织方式略有不同:
- 对 PDF 对象的排序应用了特殊规则(“标准”PDF 可以具有任意顺序的对象)。
- PDF 文档需要包含一些称为“提示表”的附加结构,以确保在其中进行有效导航(即使尚未完全下载)。
关于附加结构,线性化 PDF 包含两组对象:
第一组是文档目录,所有文档级对象,以及属于第一个显示页面(不一定是“页面 0”!)的所有对象。对象应按顺序编号。
第二组包含所有其他对象。
这些组应由 两个 xref 表部分索引。
- 第一组的
xref 部分紧跟在第一个间接对象之后,非常接近文件的开头。
- 第二组的
xref 部分位于文件的末尾(就像在标准的非线性 PDF 中一样)。
紧随%PDF-1.x 标题行之后的第一个对象应包含一个字典键,指示文件的/Linearized 属性。
这种整体结构允许符合要求的读者非常快速地了解对象地址的完整列表,而无需从头到尾下载完整的文件:
PDF“线性化”的技术细节可以在 Adobe's original PDF 1.7 Specification 的 'normative' 附录 F 中找到(大约 11 MByte - 它本身就是这种线性化 PDF 文件的示例!)