PDF文件如何在下载时能够部分显示?

问题描述 投票:4回答:1

根据 PDF 1.7规格术语表第90页,第3.4节。

前面的章节描述了单个对象的语法。本节介绍了如何在 PDF 文件中组织对象以实现高效的随机访问和增量更新。一个规范的 PDF 文件最初由四个元素组成(见图 3.2)。

  • 一个单行头,标识该文件所符合的PDF规范的版本

  • 包含构成文件中的文件的对象的主体。

  • 一个包含文件中间接对象信息的交叉参考表。

  • 预告片,说明相互参照表和文件正文中某些特殊对象的位置。

基本上,这个结构有头部,其次是正文内容,然后是交叉引用表,最后是给出xref表位置的预告片。这里的关键部分是 trailerxref 桌子在 档尾xref 表包含了正文内容的相关元数据(主要是10位字节偏移量)。

鉴于xref表本身位于 在PDF文件的最后:

  • 为什么我的浏览器(谷歌浏览器)能够在整个文件下载完成之前部分显示PDF文件(前一百页左右)?

请看我的部分下载的PDF文件的截图。

Partially downloaded PDF file

pdf random-access cross-reference
1个回答
5
投票

上位机所描述的PDF文件类型也称为 "网络优化""线性化" (PDF的技术术语)。

必须注意的是,只有满足两个额外的条件(在文件的线性化特征之上),它才会发挥作用。

  1. PDF阅读器需要能够处理这些类型的PDF,并利用线性化功能。
  2. 为线性化PDF服务的(远程)主机需要支持以下功能 "字节流".

如果服务器不支持字节流,或者PDF文件没有线性化,那么整个文件就会被删除。 需要完全下载,然后阅读器才能显示任何页面。

上位者引用的关于PDF文件结构的描述不适用于线性化的PDF文件。这些文件的组织方式略有不同。

  1. PDF对象的排序有特殊的规则("标准 "的PDF可以有任意顺序的对象)。
  2. PDF文件需要包含一些额外的结构,称为 "提示表",以保证在其中进行有效的导航(即使它还没有完全下载)。

关于附加结构,线性化的PDF包含两组对象。

  1. 第一组是文档目录,所有文档级对象,以及属于最先显示的页面(不一定是 "第0页"!)的所有对象。这些对象应按顺序编号。

  2. 第二组存放所有其他对象。

这些组应按以下方式编制索引 两种 xref 表部分。

  1. 第一组的 xref 部分紧接在第一个间接对象之后出现,非常接近文件的开头。
  2. 第二组的 xref 部分被放置在文件的最后(就像在标准的、非线性的PDF中一样)。

第一个对象紧接在 %PDF-1.x 头行应包含一个字典键,指示出 /Linearized 属性的文件。

这种整体结构使得符合要求的读者可以很快地了解完整的对象地址列表,而不需要从头到尾下载完整的文件。

  • 在下载完整的文件之前,阅读器可以非常快速地显示第一页。

  • 用户可以点击缩略图页面预览(或文件ToC中的链接),以便在第一页显示后立即跳转到例如445页,然后浏览者可以通过字节范围请求要求远程服务器 "不按顺序 "提供445页所需的所有对象,这样浏览者可以更快地显示这一页。当用户阅读不按顺序的页面时,完整文档的下载仍将在后台进行...)。

PDF "线性化 "的技术细节可以在 规范性 附录F Adobe的原始PDF 1.7规范 (约11 MByte -- -- 这本身就是这种线性化PDF文件的一个例子!)

© www.soinside.com 2019 - 2024. All rights reserved.