代码改变世界

在线浏览文档的方案

2016-12-03 20:42  ^战士^  阅读(375)  评论(0编辑  收藏  举报

百度了一下,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还是挺不错的。