NO.25 No POI,No jacob——多个Word合并(RTF格式Word非二进制Word)之解决

本文探讨了如何将多个由JRRtfExporter生成的RTF格式Word文档进行合并的方法。通过对RTF文件结构的研究,提出了一种去除头尾信息并进行特定格式调整的技术方案,解决了在Web应用服务器环境下合并文档的问题。

AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

 

    说明:本地的样本Word是用jasperReportJRRtfExporter生成的(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,两个MP3ZIP打包再改后缀名就可以实现最简单合并

     *有头有尾型

           多数据文件格式有固定的头信息格式和尾信息

    因此,猜测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.基本原理及程序类

AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值