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

下载时如何部分显示PDF文件?,pdf,random-access,cross-reference,Pdf,Random Access,Cross Reference,根据第90页第3.4节: 前面的部分描述了各个对象的语法。这 第节介绍如何在PDF文件中组织对象以提高效率 随机访问和增量更新。一个规范的PDF文件 由四个要素组成(见图3.2): 一个单行标题,标识所引用的PDF规范的版本 文件符合 包含组成包含在文档中的文档的对象的主体 文件 一种交叉引用表,其中包含有关间接引用的信息 文件中的对象 给出交叉参考表位置和特定位置的拖车 文件正文中的特殊对象 基本上,结构有标题,然后是主体内容,然后是交叉引用表,最后是提供外部参照表位置的尾部。这里的关键部

根据第90页第3.4节:

前面的部分描述了各个对象的语法。这 第节介绍如何在PDF文件中组织对象以提高效率 随机访问和增量更新。一个规范的PDF文件 由四个要素组成(见图3.2):

  • 一个单行标题,标识所引用的PDF规范的版本 文件符合

  • 包含组成包含在文档中的文档的对象的主体 文件

  • 一种交叉引用表,其中包含有关间接引用的信息 文件中的对象

  • 给出交叉参考表位置和特定位置的拖车 文件正文中的特殊对象

基本上,结构有标题,然后是主体内容,然后是交叉引用表,最后是提供外部参照表位置的尾部。这里的关键部分是
拖车
外部参照
表位于文件的末尾,而
外部参照
表包含正文内容的相关元数据(主要是10位字节偏移量)

鉴于外部参照表本身位于PDF文件的最末端:

  • 为什么我的浏览器(Google Chrome)能够在整个文件下载完成之前部分显示PDF文件(前100页左右)
请参阅我部分下载的PDF文件的屏幕截图:


OP描述的PDF文件类型也称为“网络优化”(营销术语)或“线性化”(PDF术语中的技术术语)

必须注意的是,只有在满足两个额外条件(在文件线性化特性的基础上)时,它才起作用:

  • PDF查看器需要能够处理这些类型的PDF,并利用线性化功能
  • 为线性化PDF提供服务的(远程)主机需要支持“字节流”
  • 如果服务器不支持字节流,或者PDF文件未线性化,则需要完全下载整个文件,然后查看器才能显示任何页面

    OP引用的关于PDF文件结构的描述不适用于线性化PDF文件。它们的组织方式略有不同:

  • PDF对象的排序有特殊规则(“标准”PDF可以有任意顺序的对象)
  • PDF文档需要包含一些称为“提示表”的附加结构,以保证在其中进行高效导航(即使尚未完全下载)
  • 关于附加结构,线性化PDF包含两组对象:

  • 第一组是文档目录、所有文档级对象以及属于第一个要显示页面的所有对象(不一定是“第0页”!)。物体应按顺序编号

  • 第二组包含所有其他对象

  • 这些组应通过两个
    表格部分进行索引

  • 第一个组的
    xref
    部分紧跟在第一个间接对象之后,非常接近文件的开头
  • 第二组的
    xref
    部分位于文件的末尾(与标准的非线性PDF一样)
  • 紧跟在
    %PDF-1.x
    标题行之后的第一个对象应包含一个字典键,指示文件的
    /线性化
    属性

    这种整体结构允许一致性读者快速了解对象地址的完整列表,而无需从头到尾下载完整文件:

    • 在下载完整文件之前,查看器可以快速显示第一页

    • 用户可以单击缩略图页面预览(或文件ToC中的链接),以便在显示第一页后立即跳转到第445页,然后查看者可以通过字节范围请求请求远程服务器发送这些“无序”的内容,请求第445页所需的所有对象因此,查看器可以更快地显示此页面。(当用户无序阅读页面时,完整文档的下载仍将在后台进行…)

    PDF“线性化”的技术细节可在的“规范性”附录F中找到(约11Mbyte——其本身就是此类线性化PDF文件的一个示例!)

    在参考文献中查找“线性化”,或参见。