深入了解OpenOffice.org(三)
出自Ubuntu中文
深入了解OpenOffice.org(三)
原文出处:http://www.huihoo.com/openoffice/deepknowlegeofooo-3.html
原文作者:路广
授权许可:创作共用协议之“署名-禁止派生-非商业用途”方式
转载人员:yt9103
校对人员:无
适用版本:无
文章状态:完成
- OpenOffice.org中的XML应用
上一篇重点介绍了OpenOffice.org的技术体系结构。它的分层架构、UNO组件模型、基于IDL的API和SDK等等都是使OpenOffice.org获得广泛应用和好评的技术优势所在。
OpenOffice.org中的另一大特点是完全公开并充分记录的、可扩展和标准化的XML文件格式。该文件格式可以持久保存数据,用户不虞担心无法访问年代久远的文件,或者需要为此付出高昂的代价。基于该文件格式的架构和应用,开发者也可以轻松实现支持客户化的外部文件格式,与网络服务等其他应用集成。
1.需求与目标
- 1.专有办公软件的困扰
随着整个社会信息化程度的提高,办公软件已经成为社会信息基础设施的一部分。不论是个人消费者,还是企业、政府、和其它非盈利机构,都会或多或少地使用文字处理、电子表格、演示文稿、简单绘图和图像处理这样的功能,办公软件已经成为计算机使用中的日常需求。对于办公软件的团体用户来说,除了基本的办公“生产力”应用外,他们还有其他一些需求:
能够支持附加处理和集成功能:比如文件的归档和索引功能,校验文件内容的合法性,支持与数据库和工作流的集成,能够批量处理文件等;
文件具有长期的可读性:这对于那些需要处理历史悠久的文件的大型团体(比如政府、博物馆、大型企业等)分外重要;
文件独立于应用程序,最好是独立于提供者,这样用户就不会被锁定在某个文件格式上而被迫延续使用;
文件格式统一,避免非结构化的、混乱的工作流和多种文件格式混杂。
而现在用户所使用的专有办公软件无法轻易满足以上的这些要求,这是因为:
专有办公软件可以提供对附加功能和集成的支持,可是这需要附加的许可证和高额费用。
专有办公软件的文件通常都是不公开的,甚至是附带专利的,这样早期软件所支持的文件格式完全要期待软件厂商在后续版本中提供支持,这些支持通常是需要付费的,由于软件商的某些目标和企业行为甚至是不可得的。
专有办公软件的文件通常都是依附于特定应用程序,甚至是特定版本的,这样用户就会为了保持对以前文件的访问而被锁定在某个软件上,这种代价通常是高昂的。
专有办公软件的文件通常都是自成体系,经常由于利益问题导致文件交换困难,从而多种格式并存。
用户希望办公软件能够在保持功能的基础上开放文件格式,这样团体用户可以自己完成附加功能和集成工作;文件的长期可读性也可以保证,因为访问文件的应用程序可以由第三方实现;而由此文件也独立于软件商和特定应用程序,用户真正掌握了自己的数据和信息;文件格式也可以通过公开协商的方式实现统一。
- 2.客户化与可扩展性
随着办公自动化和信息化,政府、企业等团体用户在日常工作中的业务流转已经逐步过渡到需要自动完成的阶段,而办公软件通常会被团体用户用来支持工作流(Workflow)1。工作流中的一个重要内容就是实现工作文件在流程中恰当地运转以完成整个业务,而这里所指的文件很可能是团体用户所在行业规范的文件,或者是用户自定义的文件。实际上,在政府公文2、法律文件3、税务记录4、专利管理5、会议论文6、科技文件7、技术规范8、电子书籍9、盲人书籍10、新闻稿件11、投资研究12、文字研究13、人力资源14、采购销售、财务报表15、医疗16、保险17、零售18、金融19等方面、甚至整个电子商务系统20,国际上有团体或者联盟已经开始、甚至是完成了这些专用文件格式规范的制定。
中国政府也在基于XML着手制定《中文办公软件文件格式规范》21和《基于XML的电子公文格式规范》22;国家知识产权局为实现专利受理自动化而制定的《以电子文件形式提出的专利申请请求类文件类型定义[DTD](试行)》23已经于2004年公布,并开始接受专利电子申请;中国证监会参考XBRL12制定的《上市公司信息披露电子化规范》在2004年通过审批,上海证交所已经推出了相关的服务;税务部门在某些税种内已经开始施行了基于XML的数据表示方式。
这些为特定目的定义的文件规范要求和定制好的结构化工作流紧密配合。对于专有办公软件来说,支持这些文件规范意味着要在保持传统办公软件使用模式的基础上,根据需要提供扩展功能。也就是要即能保证对市场中广泛使用的文件的兼容性,又要提供附加工具支持对文件语义的操作,在通用格式和专用格式间转换。要支持这样的扩展功能,在没有充分了解专有办公软件内封闭的文件格式的条件下是很难实现的。
- 3.保护投资与标准化
团体用户通常在采用某种文件格式存储数据和信息后都希望能够保存尽可能长的时间,并且保证文件格式的稳定、或者是受控地演化,这样用户才能保持为此及相关系统的投资收益率并尽可能地降低总持有成本。而封闭的文件格式常常会导致丢失信息,或者是成本居高不下。
这个问题根本的解决之道在于文件格式的开放和标准化。只有文件格式开放了,才能够实现充分竞争,由此降低成本;只有标准化了,文件才能够稳定地演化,数据和信息才能更通畅地流转,也能够被更广泛地支持,出现更多的工具,用户才会有更多的选择。这是一个用户和业界双赢的途径。
- 4.解决方案
为了满足如上用户的需求,OpenOffice.org采用了可扩展标记语言(eXtensible Markup Language,XML)作为本地文件格式规范24的基础。采用XML作为办公软件的文件格式,能够轻松实现各种集成和扩展处理。通过定义办公软件特定的标记,这种文件格式能够支持所有的办公软件的功能,易于生成和处理文件,而且不会被某个软件商或应用程序锁定。为了实现文件格式的标准化,OpenOffice.org还参与发起了OASIS开放办公XML格式技术委员会25,目标就是制定开放办公软件XML文件格式规范。
2.设计原理
- 1.内容与样式
办公软件文件格式同行业专用文件和页描述文件格式有显著的区别。
绝大多数的行业专用文件只定义了文件中具有特定逻辑的内容,文件的显示样式在外部独立地实现,内容是它们的关注点。而页描述文件(例如Adobe PostScript、PDF和其他小样格式)通常是在特定页中定义了内容的显示方式,对于内容中的逻辑是不作规定的。
办公软件文件的内容通常具有一定的逻辑关系,例如章节和标题层次,而且也需要确定它的显示样式,例如字体字号和缩进等。那么就有两种实现方式:一种是将样式和内容混合起来表示,样式就嵌入在内容流里;另一种是将样式与内容分离开来表示,通过某种映射联系起来。前者的优点在于格式简单,缺点是嵌入在内容中的样式很难管理,而且由于重复样式会产生很多的冗余信息。后者正好与前者相反,格式相对复杂但层次较为清晰,样式单独保存有利于提高数据表达信息的效率,并且方便对样式和内容分别进行处理。
OpenOffice.org的XML文件格式采用的就是后一种实现方式。
- 2.文件打包
采用了样式与内容分别处理的OpenOffice.org XML文件格式,需要处理的一个问题是:如何处理文件内的非文字内容(例如图像、OLE对象和打印机设置信息),如何管理这么多数据部分?
OpenOffice.org针对多部分的文件采用了压缩打包26的方式。也就是说,将样式、内容、设置信息、元数据、和图像等非文字内容等采用通用压缩算法打包,访问时针对特定的部分进行解包和再打包。这样做的好处是统一管理,单独处理,文件尺寸更小,而且压缩算法和打包的ZIP文件格式也是各平台上都可得的,无专利隐患,并有开源软件的支持。
对于某些需要嵌入在文字内容流中的非文字对象,OpenOffice.org XML文件格式采用Base64的编码方式将其嵌入的。
- 3.标准化
OpenOffice.org XML文件格式从设计之初就非常注重标准化。为了能够更好地同其他信息格式交互,OpenOffice.org XML充分利用了现有的行业标准,不是“重新发明轮子”,而是在这些标准的基础上组建自己的办公软件文件格式。比如它直接采用了MathML27、XLink、Dublin Core28,重复利用了XHTML、SVG29、XSL-FO30、CSS中的内容,在此基础上融合创新而成OpenOffice.org XML文件格式。
在OpenOffice.org的实现架构中实际上还充分支持了XSLT31,下一版的OpenOffice.org 2.0还会支持刚发布不久的XForms32。
- 4.卓越的XML
OpenOffice.org XML文件格式,不仅仅是把现存的数据结构简单地XML化,也不是进行某种“拥抱-扩展-消灭”(Embrace-Extend-Extinguish,EEE)33的实践。
OpenOffice.org XML文件格式完全遵从于XML及其命名空间规范,所有的信息都通过结构化的XML来保存。没有信息存在于文件的物理表示方式中,没有信息存在于注释中,也没有信息存在于特别的节点名或者值中,更没有在值的“子格式”中保存信息。
为了统一文件格式,OpenOffice.org中所有相同功能的模块都采用同一概念和表示方式。这样在应用中就有很多的通用格式模型可以重复使用,提高了数据表示信息的效率。
3.文件格式
- 1.结构框架
如上所述,OpenOffice.org XML文件格式中引用了很多外部标准,比如XML 1.0、SVG 1.0、XML Namespace、XSLT 1.0、XPath 1.0、XLink 1.0、XSL-FO 1.0、HTML 4.01、ISO 860134、ISO 63935、ISO 316636等。而OpenOffice.org XML文件格式为了表示不同性质的内容,又为不同性质的数据内容定义了15个命名空间以便于区别管理。比如表示公共信息的xmlns:office、表示样式信息的xmlns:style、表示脚本的xmlns:script、表示文本的xmlns:text、表示元数据的xmlns:meta等。由于OpenOffice.org XML文件格式公布时W3C XML Schema还没有制定出来,所以它采用了传统的DTD进行数据类型定义。
图1是OpenOffice.org的文件基本结构。办公文件根结点<office:document>下包含的元素是:元数据<office:meta>、全局设置<office:setting>、脚本<office:script>、字体声明<office:font-decls>、普通样式<office:styles>、自动样式<office:automatic-styles>、主样式<office:master-styles>、内容体<office:body>。
- 2.打包格式
| <tablestyle="WIDTH: 781px">子文件名 | 根元素 | 子文件内容 |
| meta.xml | office:document-meta | 文件元信息(例如作者和创建时间):<office:meta> |
| styles.xml | office:document-styles | 文件中使用的样式:<office:font-decls>、<office:styles>、<office:automatic-styles>、<office:master-styles> |
| content.xml | office:document-content' | 文件内容及其使用的自动样式:<office:script>、<office:font-decls>、<office:automatic-styles>、<office:body> |
| settings.xml | office:document-settings | 全局设置(例如窗口大小和打印机设置):<office:setting> |
- 表 1 OpenOffice.org XML文件压缩包结构
实际上在OpenOffice.org的文件压缩包内,以上这几个部分被分别存储在相关的几个子文件内,如表1中所示。
OpenOffice.org XML文件的两个基本属性是类型和版本。文件类型通过<office:document>或<office:document-content>根结点的属性@office:class表示,可能的类型包括文字、主控文档、电子表格、绘图、演示文稿、图表等。
其中的“主控文档”是一类特殊的文字文件。主控文档由若干子文件构成,每个子文件实际上都是完整且独立的文件,链接到主控文档的“区域”中来。在主控文档中可以为这些区域定义主控样式,这些样式会在主控文档中应用到子文件上去。主控文档特别适合多人著述时使用。不同的作者撰写不同的章节,只要在主控文档中应用同样的样式,所有的内容就都被统一排版了。这样OpenOffice.org就能够在著作层次上实现内容和样式的分离管理。
OpenOffice.org XML文件中的校验和向前兼容性处理由文件根结点的属性@office:version控制。这个属性保存文件的当前版本,这样不同版本的OpenOffice.org访问文件时,会调用不同版本的文档模型。利用XML优秀的可扩展性,OpenOffice.org的不同版本能够方便地访问其他版本生成的文件,并最大程度上地保证兼容性。
压缩包内各个文件的相关信息由一个专门的列单文件(META-INF/manifest.xml)存储。它的主要内容包括:包内所有文件的列表、每个文件的媒体类型、包内被加密的文件所需要的解密信息。
- 3.样式
OpenOffice.org XML文件格式采用的是样式与内容分离管理的方式。而样式实际上分为三大类:
普通样式:OpenOffice.org用户界面上可以看到的表示格式的样式,有时为了与其他样式区分称为普通样式。普通样式就是对OpenOffice.org XML文件格式不了解的用户眼中的样式。
自动样式:用户直接给对象(例如段落)设置的排版属性包含于自动样式。自动样式由OpenOffice.org在文件输出时自动生成。自动样式只包含设定于特定对象的排版属性。
主样式:包含应用于文件内容并一起显示的排版信息和附加内容的样式。比如OpenOfficr.org Draw主页中的图像背景,又如OpenOffice.org Writer主页中的页眉和页脚。主样式又分为普通主样式和自动主样式。
OpenOffice.org XML文件中的样式间支持继承关系,但被继承者只能是普通样式。在普通样式和自动样式中还根据包含的内容不同划分为不同的家族,例如段落、区域、文字、表格、图表、图形等,继承也只能在同家族的样式间进行。
OpenOffice.org XML文件格式中的样式也支持条件映射,也就是说可以在满足特定逻辑判断条件下映射为另一样式。这些条件映射还可以进行组合。
OpenOffice.org XML文件格式中的页样式(最常见的主样式),实际上由两部分组成:页主样式<style:page-master>和主页样式<style:master-page>。页主样式隶属于自动样式,主要描述页的物理和几何属性,例如页大小、页边距、页眉和页脚高度等。而主页样式是文件中的页模板,位于主样式<office:master-styles>结点内。它包含一个指向页主样式的引用,以及页上显示的静态信息,例如静态的页眉页脚和背景等。
OpenOffice.org XML文件格式中也为数据定义了丰富的样式,时间、日期、货币、数值、科学计数、百分数、分数等数据格式类型定义到了最小元素,完全不存在表达特定含义的编码子元素与字符串。在表示语言的ISO-639标准和表示国家地区的ISO-3166标准的基础上,支持近百种locale组合的数据表示方法。
- 4.文字处理
OpenOffice.org XML文件格式中的文字内容主要由段落、标题、列表、表格、目录、索引、参考书目等构成,其中最基本的元素是段落。
段落用<text:p>表示,章节标题<text:h>可以看作是被标记为标题的特殊段落,它的特性大抵与段落相同。段落又由行内文本元素(Inline Text Element)构成。行内文本元素指的是文字区跨<text:span>和文本、脚注、尾注、书签、引用、链接锚、域和其他文字标记等,而文字区跨<text:span>所包含的也是行内文本元素。所以,从文件格式上讲文字区跨<text:span>是可以嵌套的,但是实际上OpenOffice.org输出的XML文件并不包含嵌套的文字区跨,因为这样的结构会更加复杂。段落内文字间的软回车<text:line-break>、空格符<text:s>和横向制表符<text:tab-stop>都是用元素来表示的,所以直接嵌在文本中的排版控制符号是不被OpenOffice.org识别的。
OpenOffice.org XML文件格式中的列表分为无序列表<text:unordered-list>和有序列表<text:ordered-list>两种。无序列表指的是由标记符号或图片引导的列表,而有序列表通常由各种数字或其本地语言文字表示引导。列表由若干列表头<text:list-header>和列表项<text:list-item>组成,而列表项又可包含段落、章节标题、无序或有序列表。被任意列表项包含的无序或有序列表实际上就是该列表项所在列表的子列表,或者说次级列表。OpenOffice.org就是这样通过列表嵌套来实现多级列表的。
- 5.子表格
如图3所示,文件输出过程与输入过程基本上相反。实现XML ExportFilter服务的组件将OpenOffice.org XML的数据流传递给基于XML的过滤器,该过滤器处理XML SAX事件,并将数据以合适的格式存储为磁盘或其他文件系统上的文件。实现XML ExportFilter服务的组件和基于XML的过滤器一起封装成文件输出过滤器。
类似的,如果可以把基于XML的输入过滤器与输出过滤器“串联”起来,实际上就能够实现脱离OpenOffice.org二进制文档模型而独立运行的文件转换工具。图4中就演示了这样的一个从其他格式文件转换到OpenOffice.org XML文件的工具。与图2相比,区别就在于原先实现XML ImportFilter服务的模块现在是XML Writer组件。如此以来,仅仅实现一个基于XML的输入过滤器我们就能够实现一个独立的文件转换工具了。
实际上现在OpenOffice.org社区里已经出现了许多与其他文件格式相互转换的独立工具,例如Writer与LaTex的转换46、WordPerfect与Writer间的转换47、OpenOffice.org与OpenSHORE48文件之间的转换等。
OpenOffice.org还有一个XMerge49过滤器项目,这是为了实现与Palm、PocketPC和Nokian等手持设备上的嵌入式办公软件(比如Palm中的AportisDoc和MiniCalc、Pocket Pc中的Pocket Word和Pocket Excel)进行通讯和同步的工具。XMerge采用Java实现,能够导入并将手持设备上相对简单的文件合并进OpenOffice.org XML文件中来,这对于提高移动用户的工作效率是很有帮助的。
图5是将图2中的OpenOffice.org基于XML的文件输入过滤器进一步分解的流处理过程。该输入过滤器被进一步分解成XML解析器和XSLT处理器两部分。存储于磁盘或其他文件系统上的客户化XML文件,经过实现XDocumentHandler接口的XML解析器解析后,进入XML逻辑转换单元。在此,客户化XML数据流被XSLT处理器转换为OpenOffice.org XML数据流。该XSLT处理器由于也实现了XDocumentHandler接口,所以可以被实现了XML ImportFilter服务的组件通过SAX方式导入OpenOffice.org内部文档模型。基于XSLT的文件输出过滤器的流程与输入基本相反。
在这个文件流处理过程中,基本上只要实现客户化XML文件与OpenOffice.org XML文件间的转换逻辑,也就是XSLT脚本,并设定与文件和过滤器类型相关的配置信息就能增加一种客户化XML文件的支持。
OpenOffice.org软件内已经加入了好几种这样基于XSLT的文件过滤器,比如支持DocBook、XHTML、Microsoft Word/Excel 2003 XML格式的过滤器。OpenOffice.org社区内也出现了一些对独立XML文件格式的支持,例如HTML/WML51和TEI 12XML文件。而实际上在团体用户的工作流中,很多已经制定好的或者正在制定的行业XML文件格式规范都可以通过这种方式使OpenOffice.org提供对它们的支持。比如XBRL、UBL、Open eBook、NewsML、RIXML、中文办公软件文件(UOF)、中国专利电子申请文件(SIPO XML)等等,OpenOffice.org都可以作为它们的优秀的著作工具。对行业XML文件格式规范的支持能力,再辅以功能强大的SDK,可以说OpenOffice.org在这些行业的工作流和内容管理系统环境中具有广阔的应用前景。现在已经有了一些这方面的解决方案和成功案例。
5.OASIS Open Office
结构化信息标准促进组织(OASIS)是从早期的SGML Open组织发展而来,它是为了推动开发、统一和采用电子商务标准而建立的全球性非盈利联盟。OASIS的技术委员会主要针对的领域包括网络服务、电子出版、水平电子商务架构、安全、公共领域、垂直工业应用等等。为了促进产业共识并联合各方努力,OASIS为技术委员会特别设计了简单、开放的流程。
OASIS开放办公XML格式技术委员会52成立于2002年11月,目标就是为了建立一个开放的、基于XML的办公软件文件格式规范,该规范以OpenOffice.org XML文件格式规范为基础着手制定。现在这个技术委员会的成员包括办公软件提供者Sun、IBM、Corel和KOffice53,企业出版和内容管理提供商Arbortext54、SpeedLegal55、Stellent56、Blast Radius57等,IT咨询公司CSW集团58、Propylon59、ISOGEN60、Toolsmiths61等,以及波音公司和澳大利亚国家档案馆62等企业和用户组织。在经过了一年多的讨论之后,OASIS Open Office XML格式1.0的委员会草案采用RELAX-NG63和W3C XML Schema于2004年3月公布,面向全世界征集意见。这个草案虽然从总体结构上与OpenOffice.org XML文件格式差别不大,但是也进行了一些更改和提高。为了保持规范的独立性,它还采用了全新的XML命名空间定义。
OASIS开放办公XML格式技术委员会从成立之初就受到了世界各地的广泛关注和称赞,不断地获得了更多的支持。KOffice组织于2003年8月宣布会将本地文件格式迁移到OASIS Open Office XML文件格式上来,并于该技术委员会草案公布后的第二个月就提供了对该文件格式的初步支持。未来发布的OpenOffice.org 2.0也将会将OASIS格式做为本地文件格式。GNOME Office暂时还没有参加这个技术委员会,但是他们表示会根据用户的需要来提供对该文件格式的支持。与此同时,有用户通过公开信64的形式呼吁Corel也将OASIS Open Office XML格式作为WordPerfect的本地文件格式。
通过本文,相信读者可以对OpenOffice.org XML文件格式规范本身,及其由来、现状和未来的发展方向有了一个初步的了解。OpenOffice.org XML是迄今为止功能最完善、开放性、标准化程度最高的可扩展的办公软件文件格式,并且还将继续向开放、可扩展和标准化的方向前进。了解了OpenOffice.org技术架构和XML文件格式规范,就具有了一定的进行OpenOffice.org开发和应用的技术基础。
然而对于开放源码社区内的OpenOffice.org来讲,拥有技术基础只是必要条件。为了能够更通畅地同开源社区的成员交流,更快捷方便地获取最准确的技术资料,能够为OpenOffice.org开源社区做出更大的贡献,同时也为开发者自身的技术工作创造更广阔的舞台,了解OpenOffice.org开源社区的组织结构、行为规范、和文化风格,及其与其他若干开源社区的联系与协作方式,也是很有必要的。
总之,优秀的软件只能从优秀的软件开发实践中来,优秀的软件开发者也只能从不断的软件开发实践过程中锻炼而不断提高。希望国内的软件开发者能够积极主动地参与国际开放源码社区的建设,提高自己,贡献社会。
本文依据《创作共用约定》之“署名-禁止派生-非商业用途”方式发布,即你可以免费拷贝、分发、呈现和表演当前作品,但是必须基于以下条款:
署名:你必须明确标明作者的名字。
非商业用途:你不可将当前作品用于商业目的。
禁止派生:你不可更改、转变或者基于此作品重新构造为新作品。
对于任何二次使用或分发,你必须让其他人明确当前作品的授权条款。
在得到作者的明确允许下,这里的某些条款可以放弃。
此约定是法律文本(完整的协议)65的简单易读概要。
1 工作流管理联盟,