百度了一下,java 方面 在线浏览文档基本都是OpenOffice+SWFTool+Flexpaper的居多。
我这两天项目用上。没多考虑就直接拿来用了。不想一堆的问题。。。
首先jodconverter 2.2.1 不支持2007 office 文档的转换。需要FQ去下载谷歌的3.0-Beta-4版本 :(
其次,转换表格不理想。Excel,和带表格的word文档,就别指望能有高颜值的pdf文档输出。
最后,速度慢啊,先要转pdf,pdf又要转swf。 真个烦。
最悲剧的是,officeManager 进程启动OpenOffice不稳定,如果按照网上的写法,先start,再close,就很耗时间,也让JVM不停的创建内存,释放内存。
如果只开一次,不关闭,那么程序崩溃或者tomcat 更新war包重启,就会导致一直连接不上。主要原因就是没有关闭OpenOffice的进程.
最最悲剧的是,pdf2swf 必须通过Runtime.getRuntime() 调用。这里埋下了很大的隐患。如果这个进程不结束,就会内存泄露,或者阻塞当前进程。其他请求将不能处理。
问题归问题,但是这个功能还是要实现的。后面直接把PDF2swf 去掉。直接用pdf.js 呈现pdf 文件。 目前来看。不需要转swf 了,但是OpenOffice的问题还是有。
于是自己动手写了一个杀死OpenOffice的方法。
private static void killOpenOfficeProcess() { Runtime rt = Runtime.getRuntime(); String command = "taskkill /F /IM soffice.bin"; try { rt.exec(command); } catch (IOException e) { e.printStackTrace(); } }
这个方法每次这样调用
private static boolean startService() { // String path = System.getProperty("java.library.path"); try { if (officeManager == null) { DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration(); configuration.setOfficeHome(OPEN_OFFICE_HOME);// 设置安装目录 configuration.setPortNumbers(OPEN_OFFICE_PORT); // 设置端口 configuration.setTaskExecutionTimeout(1000 * 60 * 5L); configuration.setTaskQueueTimeout(1000 * 60 * 60 * 24L); officeManager = configuration.buildOfficeManager(); } killOpenOfficeProcess(); officeManager.start(); // 启动服务 startFlag = true; return true; } catch (Exception ce) { System.out.println(ce); return false; } }
对了,调试过程中发现一个奇葩的事情,officeManager.start()的时候,居然会调用sigar-amd64-winnt.dll。 如果这个文件不在java.library.path里,就会报错。
pdf.js还是挺不错的。