发明内容
本发明的目的在于,提供一种XML格式文档转换为Word格式文档的***和方法,可支持Word格式的排版风格,可避免频繁地调用MS-Word的Com接口而导致占用较多的***资源,可稳定高效批量地将XML格式文档转换为Word格式文档。
本发明的技术方案如下:
一种XML格式文档转换为Word格式文档的方法,其中,包括以下步骤:
读取XML格式文档中的基本元素信息;
按照Word格式文档的排版风格对读取的基本元素信息进行排版处理;
将排版处理后的信息生成RTF格式文档;
调用MS-Word的Com接口一次性的将RTF格式文档转换为Word格式文档,包括:调用***的CoInitialize接口来实现MS-Word的Com环境;调用CreateInstance初始化应用程序对象ApplicationPtr;同时,调用put_Visible将应用程序对象设置为后台转换模式;调用get_Documents得到代表Word文档集合的DocumentsPtr对象;调用DocumentsPtr的open接口在后台打开RTF中间文件。
所述的XML格式文档转换为Word格式文档的方法,其中,在读取XML格式文档基本元素信息的步骤中,具体包括以下步骤:
通过XML文件读取模块中的XML读取库将基本元素读出;
按照基本元素的类型对元素进行分组,对各组的元素按照层次顺序进行重新排列;
将重新排列后的元素信息输入到中间数据结构中。
所述的XML格式文档转换为Word格式文档的方法,其中,在进行Word格式文档风格排版处理的步骤中,对于类型为文本的基本元素,包括以下步骤:
对多个文本块进行横向切割;
判断纵向区间内同一垂直方向上是否存在有两个文本块;
在否的情况下将文本块合并成行。
所述的XML格式文档转换为Word格式文档的方法,其中,在进行Word格式文档风格排版处理的步骤中,对于类型为文本的基本元素,包括以下步骤:
对多个文本行进行纵向切割;
判断横向区间内同一水平方向上是否存在有两个文本行;
在否的情况下将文本行合并成一个文本段。
所述的XML格式文档转换为Word格式文档的方法,其中,在进行Word格式文档风格排版处理的步骤中,对于类型为图元和图像的基本元素,包括以下步骤:
若一个图元或者图像的区域位于一个文本段的区域内,则将该图元或者图像作为该文本段的背景信息;
若该图元或者图像的区域超过了一个文本块的区域,则将该图元或者图像作为整个页面的背景信息。
所述的XML格式文档转换为Word格式文档的方法,其中,在生成RTF格式文档的步骤中,还包括以下步骤:
每生成一个文本或者图元,都要先在颜色表中查询颜色是否存在,如果存在则提取颜色的索引值,如果不存在则在颜色表中新建颜色对象并提取颜色的索引值。
所述的XML格式文档转换为Word格式文档的方法,其中,在生成RTF格式文档的步骤中,还包括以下步骤:
每生成一个文本对象都要查询该文本的字体在字体表中是否存在,如果存在则将该字体在字体表中的索引值作为输入值进行输入,如果不存在则在字体表中新建该字体对象并将新建字体对象的索引值作为输入值进行输入。
所述的XML格式文档转换为Word格式文档的方法,其中,在生成RTF格式文档的步骤中,还包括以下步骤:
每行的间距为本行的下侧的纵坐标减去上一行文本的下侧的纵坐标的值。
一种XML格式文档转换为Word格式文档的***,包括依次数据连接的XML文件读取模块、Word风格排版模块、RTF文件生成模块和Word文件生成模块,其中:
XML文件读取模块,用于读取XML格式文档中的基本元素信息;
Word风格排版模块,用于按照Word格式文档的排版风格对读取的基本元素信息进行排版处理;
RTF文件生成模块,用于将排版处理后的信息生成RTF格式文档;
Word文件生成模块,用于调用MS-Word的Com接口一次性的将RTF格式文档转换为Word格式文档,包括:调用***的CoInitialize接口来实现MS-Word的Com环境;调用CreateInstance初始化应用程序对象ApplicationPtr;同时,调用put_Visible将应用程序对象设置为后台转换模式;调用get_Documents得到代表Word文档集合的DocumentsPtr对象;调用DocumentsPtr的open接口在后台打开RTF中间文件。
所述的XML格式文档转换为Word格式文档的***,Word风格排版模块包括相互数据连接的行合并单元、段合并单元以及图元和图像合并单元,其中:
行合并单元,用于横向切割多个文本块,并将文本块合并成行;
段合并单元,用于纵向切割多个文本行,并将文本行合并成一个文本段;
图元和图像合并单元,用于将图元或者图像作为文本段或整个页面的背景信息。
本发明所提供的一种XML格式文档转换为Word格式文档的***和方法,由于采用了RTF格式文档作为转换的中间文件,在转换的过程中利用RTF格式文档进行过渡,不仅支持了MS-Word的所有元素和复杂排版式样,而且还规避了频繁的Com调用,减少了过多占用的资源,减轻了设备的负载,也提高了RTF格式文档生成的效率和稳定性,适合批量转换时使用。
具体实施方式
以下将结合附图,对本发明的具体实施方式和实施例加以详细说明,所描述的具体实施例仅用以解释本发明,并非用于限定本发明的具体实施方式。
本发明的一种XML格式文档转换为Word格式文档的方法,其具体实施方式之一,如附图1所示,包括以下步骤:
步骤S100、读取XML格式文档中的基本元素信息;
步骤S200、按照Word格式文档的排版风格对读取的基本元素信息进行排版处理;
步骤S300、将排版处理后的信息生成RTF(Rich Text Format,富文本格式)格式文档;
步骤S400、调用MS-Word的Com接口将RTF格式文档转换为Word格式文档;
步骤S500、判断是否转换下一个XML格式文档;是则返回步骤S100,否则结束转换的步骤。
基于上述转换方法,本发明还提出了一种XML格式文档转换为Word格式文档的***,如附图4所示,至少包括依次数据连接的XML文件读取模块100、Word风格排版模块200、RTF文件生成模块300和Word文件生成模块400,其中:
XML文件读取模块100,用于读取XML格式文档中的基本元素信息;
Word风格排版模块200,用于按照Word格式文档的排版风格对读取的基本元素信息进行排版处理;
RTF文件生成模块300,用于将排版处理后的信息生成RTF格式文档;
Word文件生成模块400,用于调用MS-Word的Com接口将RTF格式文档转换为Word格式文档。
本发明所提供的一种XML格式文档转换为Word格式文档的***和方法,由于采用了RTF格式文档作为转换的中间文件,在转换的过程中利用RTF格式文档进行过渡,不仅支持了MS-Word的所有元素和复杂排版式样,而且还规避了频繁的Com调用,减少了过多占用的资源,减轻了设备的负载,也提高了RTF格式文档生成的效率和稳定性,适合批量转换时使用。
在本发明XML格式文档转换为Word格式文档的***和方法的优选实施方式中:
1、关于步骤S100和XML文件读取模块100:
在步骤S100中,XML文件读取模块100从待转换的XML文件中读取所需的信息,此处读取到的信息为元素的物理信息,包括元素的大小位置、文档的页数以及是否加密等信息;XML文件读取模块100包括依次数据连接的XML读取库、基本元素分组排列单元和元素信息输入单元。
具体的,在步骤S100中,首先通过XML文件读取模块100中的XML读取库,将基本元素读出,基本元素的类型包括文本、图像、图元、表格、文档和页面等;然后通过XML文件读取模块100中的基本元素分组排列单元,按照基本元素的类型对元素进行分组,对各组的元素按照层次顺序进行重新排列;最后通过XML文件读取模块100中的元素信息输入单元,将重新排列后的元素信息输入到中间数据结构中。
需要说明的是,本发明中所读取的XML文件,是本***与其他***的 接口文件,此外,其他需要生成Word文档的***,只需按要求先生成XML文件,即可与本***实现无缝连接。
2、关于步骤S200和Word风格排版模块200:
在步骤S200中,Word风格排版模块200可对文本、图元和图像进行Word格式文档风格的排版;Word风格排版模块200包括相互数据连接的行合并单元、段合并单元以及图元和图像合并单元。
具体的,对于文本的排版包括将散列的文本块合成为行、以及将行合成为段的具体操作,经过以下过程,即可将步骤S200输出的文本的物理信息,转换为可供Word输入的逻辑信息,其中:
行合并规则:可通过Word风格排版模块200中的行合并单元,先将散列的几个文本块进行横向或水平切割,在纵向区间内,若同一垂直方向上不存在有两个文本块,则将这几个文本块合并成一行;换言之,如果几个文本块在水平方向上可以切割,即这些文本在一个相同的纵向区间内,且此纵向区间在同一垂直方向上不包含两个文本块,就将这几个文本块合成为一行。
段合并规则:可通过Word风格排版模块200中的段合并单元,先将几个文本行进行纵向或垂直切割,在横向区间内,若同一水平方向上不存在有两个文本行,则将这几个文本行合并成一个文本段;换言之,如果几个文本行在垂直方向上可以切割,即这些文本在一个相同的横向区间内,且此横向区间在同一水平方向上不包含两个文本行,就将这几个文本行合成为一个文本段。
而对于图元和图像的排版,可通过Word风格排版模块200中的图元和图像合并单元来完成,其规则:如果一个图元或者图像的区域位于一个文本段的区域内,则将该图元或者图像作为该文本段的背景信息;如果该图元或者图像的区域超过了一个文本块的区域,则将该图元或者图像作为整个页面的背景信息。
3、关于步骤S300和RTF文件生成模块300:
在步骤S300中,RTF文件生成模块300将经步骤S200处理后的信息生成RTF格式文档;RTF文件生成模块300包括相互数据连接的文件头生成单元、颜色表生成单元、字体表生成单元、排版信息单元、固定行距单元、文本信息单元、图元信息单元以及图像信息单元;步骤S300可分为RTF文件头的生成、颜色表的生成、字体表的生成、排版信息的生成、日期生成、权限生成和版本号生成等几个部分,其中:
文件头的生成包括作者信息生成、日期生成、权限生成和版本号生成等,可由RTF文件生成模块300中的文件头生成单元实现。
颜色表即RTF文档的调色板,包括文本颜色的生成和图元颜色的生成。步骤S300中颜色表的生成规则,可由RTF文件生成模块300中的颜色表生成单元实现,即:每生成一个文本或者图元,都要先在颜色表中查询该颜色是否存在,如果存在则提取该颜色的索引值,如果不存在则在颜色表中新建该颜色对象并提取该颜色的索引值。
字体表是将整个RTF中的字体置于一个表中进行管理。步骤S300中字体表的生成规则,可由RTF文件生成模块300中的字体表生成单元实现,即:每生成一个文本对象都要查询该文本的字体在字体表中是否存在,如果存在则将该字体在字体表中的索引值作为输入值进行输入,如果不存在则在字体表中新建该字体对象并将新建字体对象的索引值作为输入值进行输入。
较好的是,在本发明步骤S300中,RTF格式文档的生成策略使用的是,全文档共享颜色表和字体表;颜色表生成单元和字体表生成单元具有全文档共享功能;因此每页中的基本元素都共享字体表和颜色表,从而可以加快文档的生成速度和具有较小文档的大小。
排版信息的输入包括节信息、栏信息、段信息和行信息等信息的输入,可由RTF文件生成模块300中的排版信息单元实现,排版信息单元包括相 互数据连接的节信息子单元、栏信息子单元、段信息子单元和行信息子单元,其中:
节信息在两种情况下需要输入:一种情况是,在新建一个页进行输入时,需要新建一个节,来将本页的页信息如页面大小与其他页隔开;另一种情况是,在栏排版变化的情况下,需要输入一个新节,来将新栏和旧栏的信息隔开;具体可由排版信息单元中的节信息子单元实现。
栏信息包括栏的个数和栏的宽度和间距等,可由排版信息单元中的栏信息子单元实现。
段信息主要包括首行缩进、段左间距设置和段右间距设置等,可由排版信息单元中的段信息子单元实现。
行信息输入主要是行间距设置,可由排版信息单元中的行信息子单元实现。
较好的是,为了能够精确的控制行间距,在本发明步骤S300中,采用的是固定行距策略,可由RTF文件生成模块300中的固定行距单元实现,即:每行的间距为本行的下侧的纵坐标减去上一行文本的下侧的纵坐标的值。
文本信息的输入包括文本的内容信息和格式信息输入,可由RTF文件生成模块300中的文本信息单元实现;内容信息就是文本的具体内容,控制信息包括文本的字体信息、颜色信息、粗体、斜体、下划线和删除线等信息的输入。
图元的信息输入,可由RTF文件生成模块300中的图元信息单元实现;首先是定位该图元的位置,其次是绘制该图元,最后是读取颜色表设置该图元的颜色和线型信息。
图像的信息输入,可由RTF文件生成模块300中的图像信息单元实现;包括两个部分,第一个是定位该图像,其次是用jpeg库将该图像转换为jpeg二进制信息输入到RTF文档中。
将经步骤S200处理后的信息生成RTF格式文档的具体生成过程,如附图2所示,步骤S300可包括以下步骤:
步骤S310、在生成一个RTF格式文档的开始,取一页元素信息;
步骤S320、判断是否是最后一页,是则生成RTF格式文档并结束流程,否则进入步骤S331;
步骤S331、输入页信息;
步骤S333、输入排版信息;
步骤S335、从页中得到一个基本元素;
步骤S337、判断是否还有元素,是则进入步骤S340,否则返回步骤S310;
步骤S340、判断元素是不是文本,是则进入步骤S350,否则进入步骤S360;
步骤S350、输入文本,更新颜色表和字体表;
步骤S360、判断元素是否是图元,是则进入步骤S370,否则进入步骤S380;
步骤S370、输入图元,更新颜色表;
步骤S380、输入图像,将图像转换为jpeg二进制信息。
上述直接生成RTF格式文档的方法,规避了频繁的Com调用,减少了过多占用的资源,减轻了设备的负载,也提高了RTF格式文档生成的效率和稳定性。
4、关于步骤S400和Word文件生成模块400:
在步骤S400中,Word文件生成模块400将经步骤S300后生成的RTF格式文档,在后台转换成为Word格式文档,如附图3所示,包括以下步骤:
步骤S410、初始化Com环境,即初始化Com接口;
步骤S420、调用Com模块中的DocumentPtr对象将RTF文件导入;
步骤S430、查询注册表得到用户安装的Word版本信息,;
步骤S440、根据该版本信息按照规则在后台生成对应版本的Word文档;如果用户安装了Word2002和Word2003则生成doc格式文档,如果用户安装了Word2007和Word2010则生成docx格式文档;
步骤S450、转换后删除作为中间文件的RTF文件,完成XML格式文件向Word格式文件的转换。
其中,本发明中调用Com模块的具体过程如下:
步骤S422、调用***的CoInitialize接口来实现MS-Word的Com环境;
步骤S424、调用CreateInstance初始化应用程序对象ApplicationPtr;同时,调用put_Visible(VARIANT_FALSE)将应用程序对象设置为后台转换模式;
步骤S426、调用get_Documents得到DocumentsPtr对象;该对象代表Word文档集合;
步骤S428、调用DocumentsPtr的open接口在后台打开RTF中间文件;例如,如果当前为Word2002***,则需调用Open2000接口。
可见,本发明调用MS-Word的Com接口并非采用的是,动态的调用MS-Word的自动化Com接口实现Word中基本元素信息和属性控制信息的写入。这是因为,首先,MS-Word的Com接口对配置环境和输入数据的格式要求较高,在频繁多次调用的情况下,经常会出现程序挂掉的情况;其次,每输入一个基本元素都会涉及到一次Com调用,随之而来的是大量的IO操作,所转换效率较低;再者,动态的调用MS-Word的自动化Com接口占用***资源较多,易造成机器负载较重。
另外,本发明调用DocumentsPtr的SaveAs在后台将RTF文件另存为Word文档,其生成规则是:如果用户安装的是Word2002和Word2003则默认生成doc格式文档,如果用户安装的是word2007和word2010,则默认生成docx格式的文档;如果保存为doc格式,则设置wdFormatDocument,如果保存为docx格式,则需设置wdFormatXMLDocument。将RTF文件另 存为Word格式文档的方法在后台实现了RTF格式文档到Word格式文档的转换,同时也支持了各种版本Word文件的生成。
总而言之,本发明XML格式文档转换为Word格式文档的***和方法的优选实施方式,按照Word文件的内容和排版生成相同的RTF文件,在后台调用MS-Word的Com接口一次性的将RTF文件转换为Word文件,这样在生成一个Word文档的过程中只需要一次Com调用,在最大程度上规避了Com调用的低效性和不稳定性,降低了资源占有量。可见,其显著的进步体现在:提高了转换效率和转换稳定性;对元素支持全面排版效果好;支持所有Word版本文件的生成;降低了转换对***资源的占有量。
应当理解的是,以上所述仅为本发明的较佳实施例而已,并不足以限制本发明的技术方案,对本领域普通技术人员来说,在本发明的精神和原则之内,可以根据上述说明加以增减、替换、变换或改进,例如,作为XML格式文档转换为Word格式文档的中间文档,还可采用Word2003的XML格式文档等同替换RTF格式文档,而所有这些增减、替换、变换或改进后的技术方案,都应属于本发明所附权利要求的保护范围。