您的位置:首页 > 运维架构

文档转换与演示组件---Openoffice+jodConver+SWFTOOls并发时的那些问题

2014-09-02 16:29 357 查看
最近在做一个有关文档管理的系统,异构文档的管理(增删查改)自不用说,还会包括文档内容的一些简单挖掘,比如关键字、摘要、相似推荐等功能。另外还提供DictFilter的功能,支持让用户自己维护。

    这些天主要在解决文档转换问题,因为暂时定下的方案是将各种类型的文档(doc docx xls xlsx ppt html pdf等)先统一转化为pdf格式,然后再将pdf转换成swf,从而利用一些Flex之类的技术进行展示。这个解决方案貌似是比较传统而且实用的,网上一些现有的类百度文档的系统大都如此。但是转换过程中,openoffice+jodConver组件和SWFTools组件遇到了不少转换上的问题,网上相关的代码共享也很多,但是对于一些其他情况没有涉及到,主要集中在多线程并发时的情况下,在实际的开发中,发现一个不变的真理,只要预料到的问题。。。一定会发生。。恩。没错! 下面作为记录,以备用。

先说下用的工具:

(1)JODConverter是一个Java的OpenDocument文件转换器,可以进行许多文件格式的转换。它依赖于OpenOffice.org或者LibreOffice提供的服务来进行转换,它能将Microsoft Office文档(Word,Excel,PowerPoint)转换为PDF格式。 

    使用的JODConverter版本是3.0。比起直接调openoffice的sdk真心好用了很多,通过 OfficeManager类和DefaultOfficeManagerConfiguration类,至少开启服务再也不用Process调用shell了。。而且关闭服务也很简单,stop()而已。timeout也可以轻松设定。

[b](2)SWFTools[/b]是一个实用工具,与Adobe Flash文件(SWF文件)处理转换相关工具包。 

    该工具集包括用于阅读的SWF文件,结合他们,和他们建立从其他内容(如图像,声音文件,视频或源代码)程序。 SWFTools是在GPL下发布的。包括:

1. 合并工具 swfcombine

2. 抽取工具 swfextract

3. PDF/JPEG/PNG/AVI/TTF/WAV 到 SWF 的转换工具 :pdf2swf, jpeg2swf, png2swf, avi2swf, font2swf, and wav2swf|

4. 文本解析工具 swfstrings

5. SWF 解析器 swfdump

6. SWF 读写库 rfxswflib。

使用的swftools版本是0.9.1    官网什么的在这里:http://www.swftools.org/download.html

编程实现做好Process调用的准备,文件名空格特殊符号处理什么的自行解决吧

    1、多线程中,openoffice2pdf过程中一旦
ad7a
出现错误(包括TimeOut错误),会导致紧接着相邻的文档转换也失败。

        解决:netstat一下,发现,在jodConver的实现中,应该是加入了一个出错重新连接的逻辑在里面(这在单纯调用openoffice库时是没有的,如果有错会直接卡死,自行kill -9吧),每次Exception之后,负责对接客户端口的服务会另开启一个端口负责重连。关键来了,在重连过程中,文档可能是放在一个循环下顺序参加转换的,如果速度足够快,出错后的某个文档将有几率无法连接到服务(更多的是连接到之前的端口上,而这个端口已经易主啦,没法提供服务了),所以这篇文档当然也会TimeOutException掉。解决办法很简单,sleep一下再继续,等一等端口兄。。。

    2、多线程下,2pdf过程中有些文档就是总转换失败,一直无法找到原因很无语。

        解决:经过一些单独的测试,在批量文件中转换失败的文档,单独却成功了。。真的是难懂。既然重换端口之后也无法成功,索性直接重启服务吧。立刻加入ReTry的逻辑,让文档失败重做MaxRetry次,重做之前要记得重启一下服务!但是,新的问题又来了,生成文件过程中会有文件锁的存在,一般是文件名前加“ .~Lock ”文件名后加“#”,所以还得判断是否被加锁不然会出现can not store的Exception。记得及时删掉Lock临时文件。这也是openoffice为了安全加入的一个锁机制,只是它暂时可能没考虑到出错时对lock的释放吧。

    3、在Linux下,转swf的出错概率居然变大。而且出现了字体相关的错误:

Couldn't create a font for 'GAAAAA+WenQuanYiZenHeiSharp'

ERROR Internal error: No current splash fontinfo

Error: Couldn't create a font for 'ARISMP+E-B4'  

Error: Couldn't create a font for 'ARISMP+FZBSK--GBK1-0' 

...

诸如此类。然后就会转换失败。

        解决:通过在pdf2swf  的转换命令中加入 -s language = 加入:xpdf/chinese-simplified包之后还是无法完全解决问题。但是单独对错误的文件转换时却能够完成。于是,继续加入ReTry处理。。问题解决。查看日志,发现有的文档居然retry了7次才成功,虽然次数多了些,但总比失败强,况且2swf的速度相比2pdf还是比较快的。注意字体包xpdf/chinese-simplified还可以解决pdf2swf时中文乱码的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐