pdf结构介绍

1 引言
  结构化的文档格式PDF(Portable Document Format)是由美国排版与图像处理软件公司Adobe于1993年首次提出的。它从页面描述语言PS(PostScript)发展而来,具有与PS几乎相同的页面描述能力和相似的描述方法。但与PS不同的是,PDF 除了能描述复杂版面外,还具有交互功能(如超链接、交互表单等)、页面随机存取及字体仿真描述等特性。因此,PDF不仅适合印刷出版,而且也适合电子出版。PDF和目前在电子出版中占统治地位的HTML语言相比也有自己明显的优势。HTML不能描述版面,而PDF能描述精美的版面;HTML页面中经常出现信息的不一致性(如不同平台,不同浏览器,不同尺寸的浏览器窗口看到的同一Web页面呈现出不同样子),而在PDF中不存在这个问题。PDF不仅具有PS和HTML两者的优点,还克服了它们的缺点,从而实现了纸张印刷和电子出版的统一。排版后的内容生成PDF文件,则能在交付印刷的同时,进行网络发行。
  但由于用Adobe免费的PDF阅读器(Acrobat Reader)阅读中文PDF时:只能显示TrueType中文字体,且无法实现平台独立和字体独立;又不支持中文字体的下载这两个问题。使PDF在中文电子出版领域的应用受到了极大的限制。解决问题的最好办法就是开发中文PDF阅读器。实现PDF检索系统,从PDF中提取信息,在其他应用程序中支持PDF的输入和阅读。

2 PDF的结构
  要想开发PDF阅读器,首先必须了解PDF的结构。PDF的结构可以从文件结构和逻辑结构两个方面来理解。PDF的文件结构指的是其文件物理组织方式,逻辑结构则指的是其内容的逻辑组织方式。
2.1 数据对象类型
  组成PDF文件的基本元素是PDF对象(PDF Object)。PDF对象包括直接对象(Direct Object)和间接对象(Indirect Object)。直接对象有如下几种基本类型:布尔型(Boolean)、数值型(Number)、字符串型(String)、名字型(Name)、数组型(Array)、字典型(Dictionary)、空对象(Null)、流对象(Stream)。间接对象是一种标识了的PDF对象,标识的目的是为了让别的PDF对象引用。任何PDF对象标识后都变成了间接对象。这个标识叫作间接对象的ID。
2.2 PDF的文件结构
  PDF的文件结构(即物理结构)包括四个部分:文件头、文件体、交叉引用表和文件尾。
  文件头(Header)指明了该文件所遵从PDF规范的版本号,它出现在PDF文件的第一行。如%PDF-1.2表示该文件格式符合PDF1.2规范。文件体(Body)由一系列的PDF间接对象组成。这些间接对象构成了PDF文件的具体内容如字体、页面、图像等等。交叉引用表(Cross-reference Table)则是为了能对间接对象进行随机存取而设立的一个间接对象地址索引表。文件尾(Trailer)声明了交叉引用表的地址,指明文件体的根对象(Catalog),还保存了加密等安全信息。根据文件尾提供的信息,PDF的应用程序可以找到交叉引用表和整个PDF文件的根对象,从而控制整个PDF文件。
2.3 PDF的文档结构
  PDF的文档结构反映了文件体中间接对象间的等级层次关系。PDF的文档结构是一种树型结构(如图1)。树的根节点就是PDF文件的根对象(Catalog)。根节点下有四个子树:页面树(Pages Tree)、书签树(Outline Tree)、线索树(Article Threads)、名字树(Named Destination)。



图1 PDF文档结构图

2.4 PDF中的资源
  PDF中的页面内容(如文字、图形、图像)都保存在页面对象的Contents关键字对应的流对象(下面简称内容流) 中。内容流(Content Stream)中用到了很多基本对象如数字、字符串,这些都是用直接对象(Direct Object)表示的。但还有其他一些对象如字体(Font),本身就是用字典对象(Dictionary )或流对象(Stream)来表示的,无法用直接对象表示,而内容流中又不能出现任何间接对象(否则无法与内容本身的数据区分),于是就将这些对象命名,并在内容流中用相应的名字来表示它们。这些用名字来表示的对象就称作命名资源(Named Resources)。
  在页面对象中有一个资源项(Resources Key),该项列出了内容流中用到的所有资源,并建立了一个资源名字与资源对象本身的映射表。
  PDF中的命名资源有:指令集(ProcSet)、字体(Font)、色彩空间(Color space)、外部对象(XObject(包括Image、Form和PS Segment))、扩展的图形状态(Extended graphics state)、底纹(Pattern)、用户扩展标记列表(Property list)。
  非命名资源有:Encoding、Font descriptor、Halftone、Function、CMap。由于非命名资源都是被隐含引用的,因此没有命名的需要。
2.5 PDF页面描述指令
  PDF一共有60个页面描述指令。这60个页面描述指令描述了页面上的一系列图形对象。这些图形对象可分为四类:路径对象(Path Object),文本对象(Text Object),图像对象(Image Object),外部对象(XObject),参见图2。这四类图形对象是构成所有页面的基本元素。



图2 页面上的图形对象

3 中文PDF阅读器的设计与实现
  我们采用面向对象的分析和设计方法,先将系统划分成若干主题,然后分别分析出各主题中的对象,画出对象结构图,再对各个对象进行设计。根据PDF的结构特点,我们在设计PDF阅读器时首先将设计工作划分为14个相对独立的主题,然后对这14个主题分别进行面向对象的分析和设计。这14个主题是:文件结构(File Structure)、过滤器(Filter)、总纲(Catalog)、页面(Page)、页面描述(Page Description)、注记(Annotation)、资源(Resources)、字体(Font)、外部对象(External Object)、色彩空间(Color Space)、图形状态(Graphics State)、文档类(PdfDoc)、视图类(PdfView)、插件接口(Plug-in Interface)。
  下面将有选择性地对这些主题的进行面向对象的分析(OOA)和设计(OOD)。
3.1 文件结构
  文件结构主题包括文件操作封装、交叉引用表、文件尾、对象扫描器、基本数据对象等。对象扫描器是该主题中的核心对象,它从字节流中分析出PDF对象。为了统一对基本数据对象的处理,我们设计了一个抽象数据对象CPdfObj,所有基本数据对象均从CPdfObj继承并重载相应成员函数。其对象结构图如图3所示。




图3 PDF数据类型对象结构图(图例以下相同)

3.2 过滤器
  该主题实现各种解码、解压算法的封装。PDF支持ASCIIHex、ASCII85、LZW、RunLength、CCITT Group 3,CCITT Group 4、JPEG、Flate等过滤器,必须实现这些过滤器才能从PDF中取得正确的信息。
3.3 总纲
  该主题包括根对象、线索树、页面树、书签树、名字树等。它是整个PDF的骨架,其对象结构如图4。



图4 Catalog主题对象结构图

3.4 页面
  本主题实现对页面外在属性和页面内容的管理。页面外在属性指的是页面的显示属性(尺寸、旋转角度、过渡效果、附加动作等)、页面注记(即本页上的交互属性,具体在注记主题里阐述)、页面缩像(Thumbnail)、页面上的线索(Article Thread)等。页面内容则指的是页面上的具体元素如路径、文字、内嵌图像等由页面描述指令产生的对象(这些对象与图形状态和页面资源密切相关),具体在页面描述主题中阐述。
3.5 页面描述
  页面描述主题包括路径、文字、内嵌图像等由页面描述指令产生的对象。这些对象在页面上的作用效果由图形状态参数来控制。它们还可能引用资源对象。我们在设计页面描述主题时,设计了一个抽象的页面元素类(CPageElement),所有页面图形对象(参见图2)都从该类继承,这样就统一了对页面图形对象的管理。我们在页面描述对象(CPageDescription)中设计了一类型为CPageElement的指针链成员,用来管理所有的页面图形对象。CPageElement类包含了页面图形对象的所有公共属性如对象类型、外接矩形、图形状态参数等,还包括了公共虚操作如显示(Show)等。
3.6 注记
  注记主题包括超链接、交互表单、声音、动画、页面注释等交互对象。
3.7 资源
  包括资源名字索引、资源对象的管理等。该主题实现资源名字与资源对象本身的映射关系,从而对资源进行管理。我们设计了一个抽象的资源类(CPdfResObj),其他所有资源对象(如字体,外部对象,色彩空间,扩展的图形状态)都从它继承,这样就可以用一条类型为CPdfResObj的指针链来管理所有资源。
3.8 字体
  字体主题包括对各种字体资源的解释。PDF中支持Type1、MMType1、Type1子集、Type3、TrueType、TrueType子集、Type 0、CIDFont Type 0、CIDFont Type 2等字体。我们设计了一个抽象的CPdfFont类,其中定义了输入(获取字体的描述信息)和输出(显示字符的位图)的虚操作,其他所有的字体类均从该类继承并重载相应的操作,这样就实现了字体解释和主程序的分离(两者联系的纽带便是CPdfFont)。
  PDF字体可分为三大类:PS字体(字体的描述为特定PS程序)、TrueType字体和自定义字体(Type3)。其中自定义字体是用PDF页面描述指令来描述的,其解释方式与解释PDF页面完全一样,因此不需要特别处理。但对于PS字体和TrueType字体必须要分别开发相应的解释器。能否正确地处理中文,关键就在于这两个字体解释器上。
3.9 外部对象
  包括外部图像(XObject Image)、外部表(XObject Form)、外部PS程序片段(XObject PS)等资源对象。
3.10 色彩空间
  色彩空间主题包括设备相关(Device-Dependent)的色彩空间、设备无关(Device-Independent)的色彩空间及特殊色彩空间等资源对象。设备相关的色彩空间包括DeviceGray、DeviceRGB和DeviceCMYK三种,设备无关的色彩空间包括CalGray、CalRGB和Lab三种,特殊色彩空间包括Separation(专色)、Indexed(颜色索引表)和Pattern(底纹)三种。页面上的所有着色操作均与色彩空间相关,任何一种颜色都是由某一色彩空间及相应空间下的颜色值共同来表示的。各个色彩空间下的颜色值可以相互转换。
3.11 图形状态
  图形状态主题包括一般图形状态,扩展图形状态及图形状态栈等对象。在PDF中,所有页面元素在页面上的最终表现结果都是由图形状态参数来控制的。
3.12 文档类
  管理页面对象的缓冲并将各数据结构关联起来。
3.13 视图类
  负责整个系统的用户界面及用户命令的处理。
3.14 插件接口
  在实现中,我们在Win95平台上用VC++5.0进行开发。我们采用了VC++的Doc/View程序框架结构。在划分主题时,我们也考虑了这种程序结构,所以将文档类和视图类作为两个主题分列出来了。
  在开发中,我们还根据实际需求(即以阅读PDF为主)对设计进行了裁剪,以减小开发工作量。我们裁掉了扩展的图形状态及相关的内容,声音、动画和交互表单,将来用一个插件来实现。
  在设计实现插件接口时,我们摈弃了传统的函数扩展接口(即以API函数调用作为接口),采用了以消息传递为基础的面向对象的插件扩展技术。在插件接口中,我们提供了一个插件公共基类,插件开发者只须从该类派生一个类并重载相应的消息处理函数即可完成插件开发。这种以消息传递为基础的插件接口能轻易地实现版本兼容、升级和扩展。

4 成果和体会
  现代的软件开发无论是规模还是复杂程度都远远超过了过去,因此充分利用现有的、共享的资源显得尤为重要,这样不仅大大减少了人力物力的重复浪费,提高开发效率,还提高了软件的可靠性。在开发中,我们从因特网上找到了各种过滤器实现的共享源代码,稍加改造、测试,就能够为我所用,大大减少了工作量。另外,我们还共享了其他开发组的成果,如PS字体解释器(PS字体解释器也可以从GhostView的共享代码中剥离出来,但工作量太大)。
  在开发过程中我们还体会到团队协作的重要性。现代的软件开发很少是过去那种手工作坊式的单打独斗,基本上都是多人或多开发组协同作战,因此开发人员分工协作的好坏直接影响到软件开发的成败。我们采用面向对象的分析和设计方法,将系统划分成若干主题,较好地适应了这种分工协作的开发模式。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值