具体实施方式
目前,对于许多用户可编辑的文档,存在文档格式开放和不开放两种。而对于开放格式的文档,一般都是基于xml组件的应用。比如,微软word 2007采用的是OOXML(Office Open xml)文档格式标准(相关内容可参见http://boycottnovell.com/2008/10/02/ooxml-leaked/中的1080.pdf、OfficeOpenXML-WordprocessingMLArtBorders.zip、OfficeOpenXML-SpreadsheetMLStyles.zip、OfficeOpenXML-DrawingMLGeometries.zip、OfficeOpenXML-RELAXNG-Strict.zip和OfficeOpenXML-XMLSchema-Strict.zip这6个文件),该标准基于xml和Zip技术,因此word 2007文档是一个代码开放的zip压缩文件,其中包含多个xml文件和媒体资源文件等(比如Word中插入的图片),与以前word版本的二进制格式文件相比,更便于数据交换。因此,本发明主要的目的是在不依赖于开放格式文档所对应的应用程序自身的情况下快速地将任意格式的数据转换为基于xml组件的开放格式的文档。以下,将结合附图对本发明进行详细描述。
图1是根据本发明的快速生成开放格式文档的方法的流程图,图2是用于解释图1所示方法的示图。参照图1和图2,该方法包括以下步骤:
步骤S1、数据结构化步骤
在该步骤中,将待处理的任意格式的数据生成规范的结构化数据,即,xml数据文件。
具体地讲,首先制定用于规范结构化数据,即,xml数据的规范化文件,即,Schema或DTD文件,然后,采集待处理数据生成xml文件,并利用所制定的Schema或DTD文件对该xml文件进行规范性验证,以使所生成的xml文件符合所制定的结构化规范。不同的用户可根据自己不同的需要来定义不同的Schema或DTD文件。定义Schema或DTD文件属于XML开发技术人员已知的现有技术,因此,省略其描述。
这里,所述任意格式的数据是指,比如,一篇比如不能被用户再次编辑的文档或者数据库中的一组数据等等数据。比如,对于数据库中的一组数据,可将这些数据首先生成一个xml文件,然后通过一个word报表的形式去展现。
步骤S2、文档模板创建步骤
在该步骤中,利用开放格式的空白文档(比如,空白word 2007文档)创建符合所述结构化数据的样式的文档模板,并将该文档模板中的所有组件保存到模板目录下。
在创建文档模板时,由于某些组件中的属性(比如,字体)是不能通过转换生成的,所以必须通过在模板中添加这些属性以保留这些属性。也就是说,为了使所生成的文档能够正确地显示结构化数据中所包含的文字、图片、表格、数学公式等各种元素的样式信息(比如,文字字体、表格样式等),必须预先在文档模板加入表示文字、图片、表格、数学公式等各种元素的样式的附加信息。如果没有在文档模板中指定样式,则采用该文档模板的默认样式。
在模板创建完成之后,为了获取模板中的所有组件,由于最终呈现给用户的文档往往是文档模板组件经过压缩的文件,所以需要利用相应的压缩工具对文档模板进行解压,从而获得该文档模板中的所有模板组件,即,xml组件。
步骤S3、结构化数据转换步骤
在该步骤中,对于结构化数据中所包含的内部资源(包括文字、图片、表格、数学公式等各种类型的元素),将它们转换为所用开放格式文档的模板组件,并用这些模板组件替换模板目录下的相应组件;对于结构化数据中所包含的外部资源,即,嵌入资源,将这些嵌入资源加载到模板目录下的资源目录中,如果资源格式不能够被兼容,则先进行格式转换,然后再拷贝到资源目录中,从而形成一个经过组件更新和加载的模板目录。
在内部资源转换过程中,可利用一个样式表文件来将结构化数据中所包含的文字、图片、表格、数学公式等元素转换为对应的模板组件,即,将根据任意格式的数据而生成的xml文件转换为一个新的满足所用开放格式规范的xml文件。在样式表文件中,需要对文字、图片、表格、数学公式等各种元素建立相对应的样式表。在实际操作中,可利用XSLT转换技术根据结构化数据来创建样式表文件。XSLT转换属于xml转换的一种已知技术,因此,省略其详细描述。当然,本发明不限于利用XSLT转换技术,可使用任何已知的xml转换方法来创建样式表文件。
步骤S4、文档成品步骤
在该步骤中,根据更新的模板目录下的所有组件生成符合所用开放格式的文档。通常需要利用相应的压缩工具将模板组件压缩,从而生成最终呈现给用户的文档。
以下,将参照图3以生成word 2007文档作为开放格式文档的示例来进行进一步的说明。
首先,在步骤S1中,将待处理数据生成规范的结构化数据,即,xml文件。
接着,在步骤S2中,创建word模板。首先打开一篇空白word文档,然后在该word文档中加入示范性段落、文字或表格等,并对这些内容设定相应的属性。比如,如果要是生成的字体显示为方正胖娃,则在本机上安装有方正胖娃字体的情况下,需要在模板中加入示例文字,并设定其字体为方正胖娃。如果不指定样式,则使用word默认样式。在word模板创建完成之后,由于word文档本身是一个符合Zip压缩算法的压缩文件,所以为了获取当前word模板中的所有xml组件,即,xml文件,在word模板创建完成后,必须利用符合Zip压缩规范的压缩工具(比如,Winrar、EasyZip)将其解压后才能获得这些xml组件,包括文档的图片资源、资源关联关系文件和文档内容文件等。然后,将解压后的文件保存在指定的临时目录下,以下将该目录称为word模板解压目录,该目录包括文档关系目录(_rels)、文档属性目录(docProps)和内容目录(word),其中,括号里为目录名。相关内容可参见微软官方网站:
http://www.microsoft.com/china/msdn/library/office/office/W ord2007XMLFormat.mspx?mfr=true。
接着,在步骤S3中,对根据待处理数据生成的结构化数据中所包含的内部资源和外部资源进行转换。
图4是根据本发明的内部资源转换方法的流程图。如图4所示,结构化数据30中通常可包括文字31、表格32、图片33、数学公式34等类型的内部资源。因此,需要根据相应的样式表将它们转换为对应的模板组件。其中,对于图片33,向模板组件转换时需同时在document.xml.rels中记录这些资源的关联关系。经过这些转换之后,得到不同文档元素类型对应模板组件以及资源关联关系35。
此外,在转换时为了数据交互方便,常常将两个xml文件的内容(比如,文档的内容数据和资源的关系数据)放在一个xml文件中,因此,转换完成后需要对转换后生成的xml文件进行拆分,恢复成两个xml文件,然后将拆分的文件放入word模板解压目录下的相应文件中。比如,转换时把word组件中document.xml.rels中的内容和document.xml中的内容放在了一个newdocumen.xml文件中,则需根据节点名称将各自的内容提取出来生成document.xml.rels,document.xml这两个文件。然后,将这两个文件放入word组件中相应的文件中,从而生成经过更新的word文档xml组件36。
图5是根据本发明的外部资源转换方法的流程图。参照图5,首先判断结构化数据中是否含有链接资源或者以数据流形式存在的资源。如果有链接资源,则首先判断该资源的格式是否符合OOXML规范,如果符合OOXML规范,则将该资源直接拷贝到word模板解压目录下的资源目录中,如果不符合OOXML规范,则将该资源的格式转换为能被word解析的格式,然后将转换的资源拷贝到word模板解压目录下的资源目录中。比如,对于图片资源,后缀名为“.jpg”的图片应重新命名为“.jpeg”,后缀名为“.GIF”的图片重新命名为“.GIFf”。对于Word文档不支持的图片文件,如后缀名为“eps”等格式的图片则应将其转换为能被word解析的资源再放入资源目录中。而对于数据流,则首先要将该数据流转换为资源文件,即,图片,然后与对链接资源相同的操作进行转换和拷贝。
最后,在步骤S4中,由于word文档是一个符合zip压缩算法的压缩文件,所以需要使用符合zip压缩规范的压缩工具将word模板解压目录下的所有文件夹和文件进行压缩,生成压缩文件。然后,将生成的压缩文档的后缀名修改为word后缀名,即,docx,从而完成结构化数据向符合OOXML规范的word文档的转换。
以下,将通过一个具体的例子来进一步说明本发明的技术方案和技术效果。在该示例中,待处理数据为图6所示排版文档,按照本发明方法将其生成word 2007文档。
以下是根据图6所示文档中所包含的数据及其样式而生成的xml文件,在该xml文件中,未对图像位置、段落位置以及段落字体字号进行描述。另外,在以下xml文件中,仅对段落,表格等元素仅部分列出,对于相同格式的部分采用了…代替。
<?xml version=″1.0″encoding=″utf-8″?>
<book xmlns:xsi=″http://www.w3.org/2001/XMLSchema-instance″>
<body>
<P uid=″1″>
<T>第一节数控机床及其分类</T>
</P>
<P uid=″2″>
<T>1.数控机床的基本概念</T>
</P>
<P uid=″3″>
<T>数控机床</T>
</P>
</P>
<P uid=″4″>
<Image uid=″5″href=″101.jpg″>
<Data type=″image″href=″Image0001.jpeg″></Data>
</Image>
</P>
<P uid=″10″>
<Table uid=″11″>
<Data type=″content″><Table>
<Row>
<Cell>
<Body>
<P uid=″12″>
<T>相对加工性等级</T>
</P>
</Body>
</Cell>
<Cell>
<Body>
<P uid=″16″>
<T>代表性材料</T>
</P>
</Body>
</Cell>
</Row>
<Row>
<Cell>
<Body>
<P uid=″49″>
<T>8</T>
</P>
</Body>
</Cell>
<Cell>
<Body>
<P uid=″52″>
<T>钛合金,</T>
</P>
</Body>
</Cell>
</Row>
</Table>
</Data>
</Table>
</P>
</body>
</book>
然后,利用XSLT转换技术将以上xml文件进行转换,得到以下xml文件,即,符合OOXML规范的xml组件。其中,body节点对应于如图7所示word模板组件中的document.xml中的body节点,因此,将这个body节点替换模板组件中的body节点即可。另外,Relationships节点对应于如图8所示模板组件中的document.xml.rels中的Relationships节点,因此,将这个Relationships节点替换模板组件中的Relationships节点即可。这样,就完成了xml文件到对应的OOXML组件的转换。
<?xml version=″1.0″encoding=″uft-8″?>
<w:document xmlns:ve=″http://schemas.openxmlformats.org/markup-compatibility/2006″
xmlns:o=″urn:schemas-microsoft-com:office:office″
xmlns:r=″http://schemas.openxmlformats.org/officeDocument/2006/relationships″
xmlns:m=″http://schemas.openxmlformats.org/officeDocument/2006/math″
xmlns:v=″urn:schemas-microsoft-com:vml″
xmlns:wp=″http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing″
xmlns:w10=″urn:schemas-microsoft-com:office:word″
xmlns:w=″http://schemas.openxmlformats.org/wordprocessingml/2006/main″
xmlns:wne=″http://schemas.microsoft.com/office/word/2006/wordml″>
<w:body>
<w:p>
<w:r>
<w:rPr>
<w:rFonts w:ascii=″″w:hAnsi=″″w:eastAsia=″″w:hint=″宋体
″></w:rFonts>
</w:rPr>
<w:t>第一节数控机床及其分类</w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:drawing>
<wp:inline distT=″0″distB=″0″distL=″0″distR=″0″>
<wp:extent cx=″373800″cy=″373800″></wp:extent>
<wp:effectExtent l=″0″t=″0″r=″0″b=″0″></wp:effectExtent>
<wp:docPr id=″11″name=″Image0001.jpeg″></wp:docPr>
<wp:cNvGraphicFramePr>
<a:graphicFrameLocks noChangeAspect=″1″
xmlns:a=″http://schemas.openxmlformats.org/drawingml/2006/main″></a:graphicFrameLock
s>
</wp:cNvGraphicFramePr>
<a:graphic
xmlns:a=″http://schemas.openxmlformats.org/drawingml/2006/main″>
<a:graphicData
uri=″http://schemas.openxmlformats.org/drawingml/2006/picture″>
<pic:pic
xmlns:pic=″http://schemas.openxmlformats.org/drawingml/2006/picture″>
<pic:nvPicPr>
<pic:cNvPr id=″0″
name=″Image0001.jpeg″></pic:cNvPr>
<pic:cNvPicPr></pic:cNvPicPr>
</pic:nvPicPr>
<pic:blipFill>
<a:blip r:embed=″rId11″></a:blip>
<a:stretch>
<a:fillRect></a:fillRect>
</a:stretch>
</pic:blipFill>
<pic:spPr>
<a:xfrm>
<a:off x=″0″y=″0″></a:off>
<a:ext cx=″373800″cy=″373800″></a:ext>
</a:xfrm>
<a:prstGeom prst=″rect″>
<a:avLst></a:avLst>
</a:prstGeom>
</pic:spPr>
</pic:pic>
</a:graphicData>
</a:graphic>
</wp:inline>
</w:drawing>
</w:r>
</w:p>
<w:tbl>
<w:tblPr>
<w:tblStyle w:val=″a3″></w:tblStyle>
<w:tblW w:w=″0″w:type=″auto″></w:tblW>
</w:tblPr>
<w:tblGrid></w:tblGrid>
<w:tr>
<w:trPr></w:trPr>
<w:tc>
<w:tcPr>
<w:tcW></w:tcW>
</w:tcPr>
<w:p>
<w:r>
<w:rPr>
<w:rFonts w:ascii=″″w:hAnsi=″″w:eastAsia=″″w:hint=″
宋体″></w:rFonts>
</w:rPr>
<w:t>相对加工性等级</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW></w:tcW>
</w:tcPr>
<w:p>
<w:r>
<w:rPr>
<w:rFonts w:ascii=″″w:hAnsi=″″w:eastAsia=″″w:hint=″
宋体″></w:rFonts>
</w:rPr>
<w:t>代表性材料</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<w:tr>
<w:trPr></w:trPr>
<w:tc>
<w:tcPr>
<w:tcW></w:tcW>
</w:tcPr>
<w:p>
<w:r>
<w:rPr>
<w:rFonts w:ascii=″″w:hAnsi=″″w:eastAsia=″″w:hint=″
宋体″></w:rFonts>
</w:rPr>
<w:t>8</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW></w:tcW>
</w:tcPr>
<w:p>
<w:r>
<w:rPr>
<w:rFonts w:ascii=″″w:hAnsi=″″w:eastAsia=″″w:hint=″
宋体″></w:rFonts>
</w:rPr>
<w:t>钛合金,</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</w:tbl>
</w:body>
<Relationships>
<Relationship Id=″rId11″
Type=″http://schemas.openxmlformats.org/officeDocument/2006/relationships/image″
Target=″media/Image0001.jpeg″
xmlns=″http://schemas.openxmlformats.org/package/2006/relationships″></Relationship>
</Relationships>
</w:document>
最后,对组件更新的模板中的所有文件夹和文件进行压缩,从而生成最终的word文档,如图9所示。由于在以上根据原文档生成的xml文件中没有描述图像位置、段落位置以及段落字体字号,所以在生成word文档时没有保留这些属性。当然,也可以根据需要在该xml文件中对图像位置等属性进行描述,从而保留所需要的属性。
从这个示例可看出,根据word模板创建好样式表之后,可将任意格式的数据快速地转换为具有该格式的word文档。类似地,如果要生成任何其它开放格式的文档,都可利用样式表文件进行转换。在创建样式表时,只要使其转换后结构符合所要生成的文档格式的规范即可。
相应地,本发明提供一种利用结构化数据快速生成word文档的系统。如图10所示,该系统包括:数据输入单元10,输入任意格式的数据,并将该数据发送给处理单元20;处理单元20,将从数据输入单元20接收的数据生成规范的结构化数据,再将该结构化数据生成符合开放格式规范的文档,并将所生成的文档发送给文档输出单元30;文档输出单元30,输出从处理单元20接收的word文档。
其中,处理单元20包括:设计单元22,设计用于规范所述结构化数据的规范化文件(即,schenma或DTD文件)、用于将所述结构化数据转换为所用开放格式文档的模板组件的样式表文件以及符合所述结构化数据的样式的模板,并将规范化文件发送给结构化单元21,将样式表文件发送给内部资源转换单元23,将所设计的模板中的所有组件发送给文档模板存储单元25;结构化单元21,将从数据输入单元10接收的数据生成规范的结构化数据,并将该结构化数据发送给内部资源转换单元23和外部资源转换单元24;内部资源转换单元23,利用样式表文件将从结构化单元接收的结构化数据转换为所用开放格式文档的模板组件,并用这些组件替换模板存储单元25中的相应子单元中;外部资源转换单元24,将从结构化单元21接收的结构化数据中的嵌入资源加载到模板存储单元25中的资源子单元中;模板存储单元,存储从设计单元22接收的模板组件,包括与文档模板中各个组件对应的子单元;文档成品单元26,在外部资源转换单元24和内部资源转换单元23处理完之后,从模板存储单元25读取文档模板中的所有组件,并根据这些组件生成符合所用开放格式的文档,最后将该文档发送给文档输出单元。
如果要生成word 2007文档,设计单元21利用符合OOXML规范的空白word文档创建word模板之后,将word模板解压以获得word模板中的所有组件,并将这些组件发送到模板存储单元25中的对应子单元中;内部资源转换单元23将所述结构化数据转换为word文档的OOXML组件,并用这些OOXML组件替换模板存储单元25中的相应子单元中存储的内容,同时将该结构化数据中的嵌入资源加载到模板存储单元25中的资源子单元中;文档成品单元26对模板存储单元25中的所有子单元中存储的内容进行压缩,并将生成的压缩文档的后缀名修改为word后缀名,从而生成符合OOXML规范的word文档。
通过这个系统,对于某一特定格式的开放格式文档,利用系统预先根据该格式创建好的schema或DTD文件和xslt样式表,就能够自动地、快速地将任意格式的数据生成具有该格式的文档,而不需要该格式文档所对应的应用程序。
从以上描述可看出,本发明将任意格式的数据转换为结构化数据,即,xml文件,然后应用样式表将该结构化数据转换为对应的模板组件,并用这些模板组件替换所创建文档模板中的相应组件,同时将嵌入资源加载到文档模板中的资源目录中,从而完成对文档模板的更新和加载,再根据该模板生成最终的开放格式文档。该方法不要求计算机安装开放格式文档所对应的应用程序,不受应用程序接口的限制,可在占用较少系统资源的情况下快速地将任意格式的数据生成开放格式文档。同时,由于对于嵌入资源直接进行格式转换和拷贝,从而保留了嵌入资源的原有属性,比如图片的精度。
以上参考实施例描述了本发明。但是,本领域的技术人员应该理解,本发明不限于所公开的实施例,在不脱离本发明的基本原理的情况下,任何类似的修改、替换或变形都应包括在本发明的保护范围内。