1、MS WORD文档格式研究 答辩人: 袁丽莉 指导老师:陈 奇,引言:背景1,计算机科学的发展,网络技术的普及,使得人们的办公理念发生了根本性变化,对办公软件也提出了更高的要求。 说通用办公软件WPS独霸天下实际上比较夸张,金山之所以成为民族软件的翘楚,其实是在于求先生敢于同盖茨先生叫板的硬气。而无法否认的事实是,Microsoft的Office一直是办公领域的主流。,背景2,至今,许多人不使用WPS2000的一个很大的原因就在于它不能很好的支持WORD格式。事实上也是如此,WPS在技术上是无法与Office相比的,这是不争的事实。金山最大的优势在于本土化,符合中国人的使用习惯。仅仅采取使用微
2、软提供的win底下的c om接口不能满足跨平台的需求。,参考一下wps开发历程,1988年开始由求伯君一个人开始开发DOS下的WPS。 1995年6月开始由章立新负责,历时27个月董波、沈家正等人完成WPS 97的研发。 1998年开始由董波负责,历时18个月15人开发WPS 2000。 1999年10月开始由沈家正负责,历时20个月50余人开发WPS Office。2001年6月开始由万里负责,历时12个月50余人开发WPS Office 2002。近200万行代码。,开发目的,我们实验室在陈老师的带领下,开发自己的一套办公软件,一方面是一种探索,是一种学术研究,另一方面,也可能是中国的另一
3、个wps,甚至也可以取代微软在中国的地位,这个希望虽然渺茫,但是我们不断的努力,肯定能出一定的成绩。,开发目标,读出没有格式的文本给文本加以相应的格式 读出所有word的格式,如图形,声音等 能够存储为word格式,OLE vs 磁盘文件存储,一个简单的结构化存储对象就像一个“磁盘”:它有文件分配表类似的功能,一个或者多个存储对象(根目录以及子目录),一个或者多个流(路径中包含的文件)。整个结构可以在一个磁盘文件(MS-DOS或者NTFS)中。他也可以存在内存中,甚至可以作为数据库的一个记录。 嵌套的聚集的功能表明如果你的当前应用使用多个数据文件,你可以把所有的文件包含在一个结构化存储对象中,
4、而这个对象自身可以被包含在一个磁盘文件里。,Word文档是一种OLE的复杂文档,读出纯文本,Word文档分简单文档和复杂文档,但是由于word97以后,都有piece table,可以不用区别这两种文档。各种文本在main stream中的偏移都可以在文件头结构FIB中找到,特别需要注意的是其中的特殊字符,有些是标识当前页,有些是标识下面是图片之类的。,读文本的流程,虽然FIB中记录了相应的偏移,但是由于复杂文档的物理顺序于逻辑顺序是不对应的,因此不能通过这个偏移而直接得到。一般的流程是FIB=piece table=main stream,这个流程不适合读属性,读字符和段落属性,先来看一下图
5、FKPPIECE TABLEBIN TABLESTSH,FKP,FKP: 表示字符属性或者段落属性的连续512字节大小的一个数据结构。他有三类FKP,分别是CHPX FKP,PAPX FKP,LVCX FKP。本文只涉及到CHPX FKP以及PAPX FKP。下面我们来看看这两类FKP的结构。,CHPX的结构:BYTE cb;BYTE rgcb; / 描述字符属性的指令集(sprmlist)PAPX的结构比较复杂,分两种情况: BYTE cb; / cb != 0 BYTE rgcb*2-1;或者: BYTE cb = 0; BYTE cb2; BYTE rgcb2*2;而且这里的rg还不是最
6、终的段落属性的指令集(sprmlist)。而是 WORD istd; BYTE rg2; / 这才是sprmlist,CHPX FKP,FC fccrun + 1; /boundary of each runBYTE offcrun; /chpx offset in fkp ; offI*2 is the offsetBYTE unused?;CHPX grpchpxcrun; /CHPX 列表BYTE crun; /本FKP中CHPX的个数,PAPX FKP,FC fccrun +1;BX rgbxcrun;BYTE unused?;PAPX grppapxcrun;BYTE crun;/
7、BX结构:BYTE off;/ BYTE bxPhe12;,PIECE TABLE,翻译过来piece table就是一个样表,它是字符逻辑顺序于物理顺序的一个对应,其中的cp数组是文档的一个分割,和它一一对应的另一个数组PCD则描述了每一个文字块的物理位置以及其他一些信息。,BIN TABLE,一般来说word文档有一个CHPX FKP,PAPX FKP,LVCX FKP,但由于FKP是定长的,固定是512字节,所以当要表达的字符属性差异或者段落属性差异不能在一个FKP结构表述的时候,就需要增加。一般CHPX FKP,PAPX FKP,LVCX FKP是交叉存储的,但事先我们不能知道各类FK
8、P的数量,因为FIB结构中关于FKP数量的描述是无用的,不管是什么类型的word文档,它都把这些变量置0了。因此就需要通过bin table,来找到相应FKP在main stream中的页号,STSH样式表,样表是一个描述文档字符逻辑顺序的数据结构,它记录了word 文档最近的格式变换。样表数据结构用一个逻辑字符数据cp来表示word文件中的物理位置fc。数组cp是文本的一个分割。第二个数组是样表描述(pcd)数组,它与cp数组一一对应,cp记录了相应的piece的起始物理地址。,结构设计分析 1,设计充分考虑了将来的扩充 频繁运用“虚拟”和“指针”的概念,使得文章的结构清晰,容易查找和定位
9、提出了页的概念,不同的块一般都以页为界限作为开头,这样文档即使有较大的变化,也不至于改变太多不相关的内容,基本实现了小范围修改。,结构设计分析 2,采取unicode 的形式,以便在各国文字间的通用,同时考虑到有的文章是全字符形式的,为了尽可能的减少存储量,采取了压缩方式,以ascii码来表示字符。 文字格式和段落格式的存储颇具特色,在它的文件中保存了一份默认的格式,而文字和段落的格式都采用了“差额保存”的办法,而且将格式相同的连续文字作为run统一保存,这样一来节省了大量的空间,因此较大容量的word文档所占的空间并不会太大。,结构设计分析 3,具有针对性:把文档分成四个流Word把文档分成
10、简单和复杂文档 ,复杂文档保存了最后一次完全保存文档上对文档进行的操作指令,而不是保存最后的结果 。优点就跟数据库里的日志。读写操作比较麻烦,即使只想得到其中的文字,也不得不涉及到两个流,而且两个流之间的关系复杂,结构设计分析 4,总的感觉使word把结构分得很细,其他的简单一点的存储格式跟它比就好像使手工作坊和流水线作业,大家都知道流水线的的总效率是非常高的,但是你要说只是一个产品,那就不一定了,只有在数量大的时候才能体现出高效率,word也一样,特别是在大的文档或者是又复杂属性的时候体现出它的优点。,结构设计思考,以前总是听有人说word结构太复杂了,存储了很多没有用的信息,它的功能中也只
11、有2是常用的,感觉很浪费。但是你在使用word的过程中感觉到很慢了嘛,特别是现在机器配置比以前好很多的情况下,基本不会出现太大的问题。我们考虑问题要全面周到,不是说只要提供常见的就可以了,其他的基本是浪费,当然还要有远见,像word这样,你看他97的版本能够考虑到这么多,计算机发展这么快,他到现在还能适应,可以想象设计的时候是花了很大心思的。,典型问题分析,如何区分复杂文档和简单文档? Header subdocument text stream以及header textbox subdocument text stream具体指什么? 各个stream是按一定顺序连续存储的嘛? 打开word
12、文档,发现它的存储中有很多是无用的信息,都是以0000形式存储的,这样以来,空间很是浪费啊! 你觉得word里什么结构最精妙? Word结构这么复杂,能不能总结一下他所采取的策略?猜测一下它当初设计时候的总方案。,如何区分复杂文档和简单文档?,很简单,要生成复杂文档,可以通过 工具选项保存,然后选择快速保存。简单文档和复杂文档的区别是简单文档的文本是连续存储的,跟文本逻辑顺序一一对应,而复杂文档则不是。在读文档的时候本来可以根据main stream 中FIB结构指示是否为复杂文档,但是由于这个标志位已经不再被使用,所以也无法在读word文档的时候决定是否简单文档,其实也没有必要了,因为wor
13、d97 以后的版本都包含了piece table,无论简单还是复杂文档,读方法都是一样的。,Header subdocument text stream以及header textbox subdocument text stream具体指什么?,这两者都跟页眉和页脚有关,不要把header当成是标题,这是不对的。,各个stream是按一定顺序连续存储的嘛?,不是的。前面讲了ole文档结构其实就跟磁盘存储文件格式一样,他可以通过一张表格也可以是链表的形式组织一篇文档,所以,一般来说都是不连续的。,打开word文档,发现它的存储中有很多是无用的信息,都是以0000形式存储的,这样以来,空间很是浪费
14、啊!,这就涉及到word的兼容性和扩充性,以及对于大的文档处理的合理性来考虑了。Word的设计充分考虑了将来扩充的要求,比如它定义了页的标准,把512字节当成一页,一般不同的结构在存储的时候都是从页的边界开始的,而不是紧接着前面的结构,采取紧凑式存储,表面上看这是浪费空间,其实这才体现了它结构的优越性。设想一下,当你要修改一个文档的时候,如果是少量的修改,word就只要填充那些0000,而不必要把后面的整块结构往后移。自从office 97以来,结构一直没变,除了excel 97跟excel 2000和excel 2002有不同以外,它都保持了良好的兼容性。一方面是它设计的时候考虑了很多将来要
15、实现的功能,另一方面正是他的这种存储方式使得它保持了良好的兼容性。这些都是需要我们仔细思考的。,你觉得word里什么结构最精妙?,这是仁者见仁智者见智的问题。我现在觉得没什么结构是最精妙的,他的设计采取的好像都是同一个原则,采用的方法都差不多。我倒是觉得他采取的策略很好比较聪明,采用的是现有的,比如说Ole吧,就是采用了磁盘文件的相同方法,还有物理存储的位置采用虚拟的方式,这跟操作系统差不多阿。他的思维方式值得我们借鉴,他的设计使得功能的扩充很方便,而且能够保持很好的版本兼容性,老的版本能够都新版本没有增加的部分,新版本能够都老版本所有格式。这对于一个要长期应用的软件是多么重要,如果不同版本之间的用户不能交流的话,升级对于这个软件没有意义。,Word结构这么复杂,能不能总结一下他所采取的策略?猜测一下它当初设计时候的总方案。,我觉得对于操作系统熟悉的人,肯定会觉得他是把操作系统里面的方法应用到了文件中,模块的划分,页结构的定义,文件流的组织,指针地广泛应用以及文本偏移地虚拟存储方式,都跟操作系统地策略有相识之处。所以在我们创造性的设计一些我们以为很了不起的设想的时候,先想一下经典的操作系统的解决方法,不要忘记借鉴前人的经验,我们需要的是要站在巨人的肩膀上的创新。,谢谢! ,答辩人:袁丽莉 计算机9901,