手把手教你从头编写 PDF – 第 5 部分:Hello World PDF

上一篇:手把手教你从头编写 PDF – 第 4 部分:DIY空白页

当恐龙还在地球上漫步的时候,我曾经谈到过构成 PDF 文件的各种对象。其中一种对象是 流对象(stream objects)。流对象包含了描述 PDF 页面外观的所有指令。在本文结束时,我们将能够创建一个“Hello World”PDF。为了在 PDF 文档中添加一些文本,我需要使用流对象。

如果你用文本编辑器打开任意一个 PDF 文件,大多数你能看到的内容都包含在流对象中。它的格式与其他对象稍有不同:它以一个字典开头,这个字典中必须有一个 /Length 映射,用来表示流的长度(以字节为单位)。流的长度是从关键词 stream 到 endstream 之间的所有内容(如果流有文件结尾字符,这些字符不计入长度)。通常情况下,当你打开一个 PDF 文件时,流中的内容是压缩的。可以通过流主字典中的 /Filter 键来判断使用了哪种压缩方式。例如:

10 0 obj<>
stream

…一堆压缩了的东西…

endstream
endobj

如果你费心将这些内容解压出来,你会发现里面是一系列指令。这些指令构成了 PDF 中所有内容的生成命令。以下是解压后的流内容:

BT

/F1 24 Tf

175 720 Td

(Hello World!)Tj

ET

BT 表示开始文本(Begin Text),ET 表示结束文本(End Text)。中间的内容用于设置字体、位置以及要显示的内容。相关的指令有 Tf、Td 和 Tj。注意,这些指令需要的参数会先写出来。

    1    对于第一条指令 Tf,它需要一个字体引用(例如 /F1,稍后会详细说明)和字体大小(这里是 24)。

    2    Td 操作符用于设置文本位置。第一个数值表示距离左边的单位,第二个数值表示距离底部的单位。

    3    这些单位非常有趣,它们基于一种逻辑坐标系统的表示方式,只有在内容需要渲染到实际设备(如打印机或显示器)时,才会转换为真实的物理坐标。这种机制保证了文本的大小和位置在不同媒介上的一致性。

    4    最后一条指令 Tj 定义了文本内容,括号中的字符将会绘制到 PDF 文档上。

在将这些内容添加到 PDF 文档之前,我们需要处理 /F1 的引用问题。在流对象中,不能像流对象外部那样直接引用对象(例如 10 0 R)。必须将 /F1 映射到某个对象,并通过 /Resources 字典使其可用。这个资源字典通过一个 /Contents 映射指向你的流对象:

3 0 obj<>

endobj

4 0 obj<>

endobj

5 0 obj<>

endobj

6 0 obj<>

endobj

7 0 obj<>

stream

BT

/F1 24 Tf

我们正在使用一个 /Page 对象,这个页面的 /Contents 条目指向一个流对象,而这个流对象负责打印我们的文本。流对象需要知道 /F1 指向的是哪个对象。我们的 /Resources 字典位于 4 0 R,其中只包含一个 /Font 条目,这个条目指向 /F1 所映射的位置。而在 5 0 obj 中,可以看到它映射到一个表示默认字体之一(Helvetica)的对象。

虽然这个过程看起来有点繁琐,但实际上有助于加快 PDF 查看器的速度。与其每次加载字体,不如仅保留一个引用。如果某个页面上的字体没有被调用(比如你没有查看该页面),就无需加载该字体。

最后,将这一切与第4部分-DIY空白页的内容结合起来,就能实现一个可能是世界首创的成果:如何制作一个“Hello World”PDF 文档!

%PDF-2.0
1 0 obj <>
endobj
2 0 obj <>
endobj
3 0 obj<>
endobj
4 0 obj<>>>
endobj
5 0 obj<>
endobj
6 0 obj
<>
stream
BT /F1 24 Tf 175 720 Td (Hello World!)Tj ET
endstream
endobj
xref
0 7
0000000000 65535 f
0000000009 00000 n
0000000056 00000 n
0000000111 00000 n
0000000212 00000 n
0000000250 00000 n
0000000317 00000 n
trailer <>
startxref
406
%%EOF

下一篇:路径对象

 

我们的主页:PDF 转 HTML5、Java 图像库、Java PDF SDK - IDRsolutions

我们的公众号:IDRSolutions

 

你可能感兴趣的:(pdf,软件工程,经验分享,团队开发,java)