第7章 - 文档元数据和导航
Destinations
- 定义文件中位置的数据结构。它们可用于指定书签或超链接指向的位置。书签(适当地称为文档外联)用作文档的目录。
XML元数据
- 包含指定格式的XML文件的流,包含与文档信息字典相同的元数据,以及其他字段。
文件附件
- 允许将整个文件封装在文档中,就像电子邮件附件一样。
注释
- 允许文本和图形应用于PDF页面的顶部,与主页面内容分开,以供屏幕阅读器显示。 一种特殊的注释是超链接,它允许用户单击页面上的某个位置并重定向到文件中其他位置的目标。
文档的书签(适当地称为文档大纲)是条目树(通常是章节,章节,段落等的标题), 可以在PDF查看器中单击以在文档中移动。每个条目都有一些文本和目的地描述它链接到的位置。
目的地在PDF文件中定义一个位置,包括页码,该页面内的位置以及查看该页面时使用的 放大率。目的地可以明确定义(我们将为简单起见)或由名称引用,并在列出所有目的 地的文档范围名称树中查找。书签通常与PDF查看器中的文档一起显示。
目标是使用数组对象定义的,内容取决于目标的类型。目标语法总结在表7-1中。
文档大纲由大纲条目树和大量项目词典定义的大纲条目树组成。大纲字典由文档目录中的/Outlines条目指向。条目的子条目(子)可以默认显示(打开)或默认隐藏,仅通过单击(关闭)显示。大纲字典总结在表7-2和7-3中。
考虑一个有三页的文件。我们希望构建以下层次结构:
结果代码如例7-1所示。对于第一,第二和第三页,本文档中的页面对象具有对象编号3,5和7。 对象12是文档目录。对象11是文档概要字典,对象8,9和10是文档概要项目字典。
8 0 obj
<< /Parent 10 0 R /Title (Part endobj
9 0 obj
<< /Parent 10 0 R /Title (Part endobj
10 0 obj
<< /Parent 11 0 R /First 9 0 R endobj
11 0 obj
12 0 obj
<< /Outlines 11 0 R /Pages 1 0
1B) /Dest [ 7 0 R /Fit ] /Prev 9 0 R >>
1A) /Dest [ 5 0 R /Fit ] /Next 8 0 R >>
/Dest [ 3 0 R /Fit ] /Title (Part 1) /Last 8 0 R >>
>>
R /Type /Catalog >>
从PDF 1.4开始,元数据流可用于将XML元数据附加到整个文档或其中的各个元素。 文档级元数据流扩展并取代文档信息字典(为了与旧的PDF程序兼容,几乎总是包含该字典)。
元数据以未压缩和(通常)未加密的方式存储,并且以这样的方式使得不了解PDF 的外部工具可以容易地在PDF文件中找到它。
XML使用由可扩展元数据平台(XMP)定义的标记,该标准在Adobe的XMP:可扩展元数 据平台中进行了描述。该格式包括以与平台无关的方式以其他格式(例如,PDF)嵌入 元数据的方法,使得不能理解封闭格式的程序仍然可以提取XMP数据。有关XMP格 式的详细信息,请访问Adobe网站。
例7-2中显示了示例XMP元数据。你可以从文档信息词典中看到一些熟悉的条目。 还要注意序列/Type /Metadata /Subtype /XML,它将此流标识为XMP元数据。通过使用文档目录中的/Metadata条目将元数据流添加到文档中。
PDF中使用注释在页面内容本身之外添加注释或交互元素。每个查看器应用程序 (例如Adobe Reader或Mac OS X Preview)都可以以不同的方式显示这些注释, 甚至可以在软件版本之间进行更改,因此无法依赖精确的视觉效果。注释不会影响打印输出。
可以使用页面字典中的条目/Annots下的数组将一个或多个注释与每个页面相关联。 每个注释都是字典。表7-4中描述了更重要的条目。 每种类型的注释在此词典中都有其他类型。
我们将看两种注释:可用于添加注释的文本注释,以及用于在文档中创建超链接的链接注释。 绘制文档还有许多其他类型,突出显示文本和添加打印机标记。 在第96页的“文件附件”中,我们使用文件附件注释向各个页面添加附件。
首先是文本注释。这里,/Subtype是/Text。代码如例7-3所示。 我们将额外的注释字典条目/Open设置为true,以指示在打开文档时注释将是可见的。 使用/C条目将背景颜色设置为白色。
6 0 obj
<<
/Subtype /Text
/Open true
/Contents (An example text annotation) /Type /Annot
/Rect [400 100 500 200]
/C [1 1 1] RGB (1, 1, 1) i.e., White
>>
/Annots [6 0 R] Extra entry in page dictionary
Adobe Reader中的结果如图7-2所示。请注意,Adobe Reader会忽略此处的/Rect条目 - 其他查看者可能会使用它。
现在,让我们尝试链接注释,以构建从第一页到第三页的超链接。 链接注释具有子类型/Link和给定目标的/Dest条目(在第90页的“目标”中描述)。/Rect条目定义超链接的区域。
代码如例7-4所示。
Adobe Reader中的结果如图7-3所示。
附件是一种在PDF文档中包含一个或多个文件(任何类型)的方法。 文件可以作为整体附加到文档,也可以附加到单个页面。 通常,PDF查看器将显示任何附件的列表,允许用户打开或保存它们。 例如,可以使用此工具将示例资源与幻灯片演示文稿的PDF捆绑在一起。
嵌入文件本身只包含在流对象中,其中/Type /Embedded File作为流字典中的附加条目。 示例7-5中显示了示例嵌入文件的代码。
Example 7-5. An embedded file
<< /Type /EmbeddedFile /Length 35 >> stream
This is a text file attachment...
endobj
嵌入式文件流以两种完全不同的方式引用:一种用于整个文档的附件,另一种用于附加到特定页面。
要附加到整个文档,/EmbeddedFiles条目包含在文档目录中/Names条目引用的名称字典中。 代码如例7-6所示。
要附加到单个页面,将使用一种特殊类型的注释,通常在页面词典的/Annots字典中列出。 代码如例7-7所示。
例7-7. 特定页面附件的PDF代码。嵌入文件是对象8 (see Example 7-5).
9 0 obj
<<
/Type /Page
(Other dictionary entries as usual)
/Annots
[ << /FS << /EF << /F 8 0 R >> /F (attachment.txt) /Type /F >>
/Subtype /FileAttachment
/Contents (attachment.txt)
/Rect [ 18 796.88976378 45 823.88976378 ]
>> ]
>>
Adobe Reader在侧栏中显示附件如图7-4所示。