PDF 文件格式(一)

144 阅读4分钟

要传递文档有很多选择,最简单的纯文本,它的特点是只有文本信息,没有字体,没有图像,没有排版等。

除此之外很自然的会想到 Microsoft Word , Word 多用来编辑文档,排版等等,把 Word 在不同电脑间传递会带来一些问题,比如高版本的 Word 创建的文档不能在低版本的 Word 上完全一模一样的显示。

我们还有另外一种方法,就是把排版好的文档打印成图片,然后传递图片,因为图片可以完整保存格式信息而且还不会变化。这会有新的问题,比如低像素的图片,在高分辨率的电脑上看起来效果就不是很好。

这个时候就是 PDF 派上用场了,PDF 的全称是 Portable Document Format 字面意思方便在不同设备间传递的格式。我们看到很多论文,求职简历,正式的公告之类的文件都是 PDF , PDF 带来了很多好处,比如版权保护,不易修改,方便在不同设备间的显示效果一致。同时也带来一些问题,PDF 文档中没有了哪里是标题,哪里是段落,表格之类的这种逻辑结构的信息。有这些信息的叫 Tagged PDF .

PDF 最早是 Adobe 开发的,在 PDF 之前有文档描述语言(page description languages)比如 PostScript,文档表述语言的实现方式是用编程语言来描述文档格式。举个例子,比如要在文档的中间写两个子"美丽",文档描述语言的逻辑是记录这两个字的位置,使用的字体,字号,颜色等信息,当用阅读器打开这个文档的时候,阅读器会根据当前环境来渲染出页面。PDF 是从 PostScript 演进来的。除了 PostScript 还有其他的比如 TeX, 还有很少听到的 PCL,KPDL 等等。

除了 ISO Standard 标准 PDF 有几个稍有区别的变种PDF/X, PDF/A . 中国在几年前出了自己的 PDF 文件格式叫 OFD(Open Fix-Layout Document),简单看 OFD 的标准和 PDF 会有神似的地方,应该细节还是有写不一样。OFD 用来我们自己的发票之类的,不确定其他应用范围。

要理解 PDF 这种文件格式会涉及到很多技术,理解的意思是可以写一个 PDF 的解析库,因为我正在尝试写一个 PDF 实现。

PDF 包含文字,图片,Graphics(不确定怎么翻译),举几个例子,直线,Bézier Cerve,等几何图形的描述和渲染,这就会需要 2D 图形学相关知识。

PDF 可以直接保存图像比如 (png, tiff, jpg) 等等,这些文件格式。不管是文字还是 Graphics 都是可以有颜色的,颜色相关的知识,比如 CMYK, RGB .... PDF 中的颜色就有十几种方式来定义。

PDF 是从 PostScript 变化来的,所以在 PDF 里总是会看到编程语言的影子,PDF 每一页的内容是用一条一条命令来描述在什么位置需要放什么内容的。总共有60 多还是 70 多调指令,然后用一个基于栈的方式来解释这些指令成具体的光栅化的动作,这样就可以把一个 PDF 文档显示到我们面前。

除了这些有的 PDF 支持 JavaScript , 支持 Form 表单,加密等等。 还可以预见到很多其他问题,比如字体,图片这些都是可以嵌入到 PDF 文件里,为了让文件尽可能的小,会需要压缩相关的知识。

这些知识点都是我们司空见惯的东西,很少在意其具体实现是什么。加上各种历史原因,每个小的知识点都极度复杂,比如字体有很多中格式类型 PDF 都支持, Typ0, Typ1, OpenType , TrueType .... 字体一旦有问题都会带来各种问题,比如文字不能正确显示,复制乱码之类的问题。

在使用 PDF 的时候会遇到很多问题, PDF 转 Word, PDF 提取表格,PDF 转图片,PDF 切分合并,加密等,而且也有很多这种工具,但有些问题还是多少会有问题比如 PDF 提取表格. PDF 怎么提取文字,怎么提取 PDF 中的字体,图像。如何分析 PDF 中的逻辑结构把 PDF 转化成 HTML, MarkDown 等等。理解 PDF 方便我能解决这些问题。如果文中有误多指正,邮箱 (zhengwu@midday.me)