说明:本地的样本Word是用jasperReport的JRRtfExporter生成的(RTF格式 特征:使用UltraEdit之类的文本编辑器打开为字符,如果打开是中间有0~f16列的,这是二进制文件,不在本文说明之列),目前已经实现了合并,但一旦其中几篇手工修改再保存,格式变了,合并还不怎么成功,固本文仅称为解决思路……
(2010-05-12更新:问题已解决,原来是由于一个程序BUG导致的)
最新有个技术任务,需要将多个JRRtfExporter生成的Word(实际上是RTF)合并成为一个Word。因此上网找啊找啊找资料……
找了半天,多为两种途径,均不符合我们的要求:
1.jacob
有个jacob的东东,使用了dll,所以只能在Windows环境下用了(我们需要在Web应用服务器(Unix-based)上实现);
2.POI
网上的例子最多也就实现了从Word里抽取出纯文本(我们需要保留格式),并且写Word的方法也不咋样,貌似打开时还有问题。
那怎么办呢?
据了解,各种文件格式一般分为
*无头无尾型
比如MP3,两个MP3用ZIP打包再改后缀名就可以实现最简单合并
*有头有尾型
多数据文件格式有固定的头信息格式和尾信息
因此,猜测RTF也属于有头有尾了。
OK,先用FileInputStream readLine打印出来瞧瞧长什么样(用UltraEdit之类的文本编辑器打开Word(字符流型)看也一样):
( #后面表示注释说明)
OK,看了这些,合并就有思路了:
1.第一篇去尾 2.中间的去头去尾 3.最后一篇去头
*掐头:remove掉最前面的“{”
*去尾:remove掉最后的右括号,并替换为“/page”
手工实验了一下,成功!开始编程实现,最终对于未曾修改过的几篇Word成功合并。
对于有手工修改保存的(比如中间某一篇改过),合并后的文档在那一篇后面合进来的几篇会有乱码。奇怪的是,如果全部的文档都手工修改过,反而一切OK。
把这种修改过的Word打开,嚯,不过加了一个字符,内容多了好多,格式也发生了变化:(看来得继续分析了
革命尚未成功,继续研究中……
2010-05-12更新:
替换为/page,会产生两个新问题
1.对于所有文档均有页眉页脚,且各不相同的情况,合并后所有的页眉页脚都变成最后一页的页眉页脚;
2.如果某一页后面有空白,合并后下一页会自动补进,从而改变了原文档的页布局
一开始对这两个问题没有参透,上来先看了《Word 2002 RTF Specification Final》中页眉页脚的定义(半天无果)。
后来经领导点拔:"这可能是分节符的问题"顿悟(遇到问题多与人沟通多么重要)
后终分析出分节符的一般定义:"/sectd /ltrsect/linex0/endnhere/sectspecifyl/sectrsid4587980/sftnbj {/rtlch/fcs1 /af0 /ltrch/fcs0 /insrsid14484352 /sect }/sectd /ltrsect"(注:这段代码只是自己做了一个空白RTF插入一个分节符得到的,相关数字在实际应用并未影响格式)。
合并问题终得以彻底解决:)
其它与此有关的BLOG:NO.52 RTF实现动态Word 2.基本原理及程序类
本文探讨了如何将多个由JRRtfExporter生成的RTF格式Word文档进行合并的方法。通过对RTF文件结构的研究,提出了一种去除头尾信息并进行特定格式调整的技术方案,解决了在Web应用服务器环境下合并文档的问题。
之解决&spm=1001.2101.3001.5002&articleId=5549696&d=1&t=3&u=594a5e80b11b42f48033fe3320d81351)
3360

被折叠的 条评论
为什么被折叠?



