openOffice和SWFTools 在线浏览

简单介绍一下以下代码整体思路 :

1:为实现在线浏览阅读文档内容,首先要转换office 文档成pdf格式,在转换成swf,返回swf流就能实现在线浏览器形式阅读(图片可直接返回流,不用转换)

2:该代码未编写完全(要转换的类型未编写,写了个大概),只实现了我所用的需求,同时转换返回是否成功转换状态。

3:该代码实现了自动启动服务,无需担心关机重启服务忘记开启转换不了的情况(配置文件需要放在根目录下)

package com.mw.usims.fts.util;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
import com.ml.cs.Server;
import org.apache.log4j.Logger;
import org.apache.poi.ss.formula.functions.T;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.*;
import java.net.ConnectException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.*;

/**
 * Created by LiAnAn on 2015/6/11.
 */
public class NewFileConvertUtil implements Callable<Integer> {
    private static Logger log = Logger.getLogger(NewFileConvertUtil.class);
    private File inputFile;
    private File outputFile;
    private int success = -1; // 0:成功 else 失败
    private String endType;
    private String beginType;
    private static boolean isStartServer = false;
    private static final String processName = "soffice.exe";
    private static String SWFTools_HOME;
    private static String openOffice_INSTALL_PATH;
    public NewFileConvertUtil(File inputFile,File outputFile,ConvertType type){
        initializeConfig();
        this.inputFile = inputFile;
        this.outputFile = outputFile;
        this.beginType = getType(type.toString(), SubStringType.PREFIX);
        this.endType = getType(type.toString(), SubStringType.SUFFIX);
    }

    /**
     * 初始化配置
     */
    private void initializeConfig(){
        if(null==SWFTools_HOME || null==openOffice_INSTALL_PATH){
            SAXReader reader = new SAXReader();
            String filePath = this.getClass().getResource("/")+"install-path-config.xml";
            //String filePath = Server.getContext().getServerHome().getAbsolutePath()+"install-path-config.xml";
            Document document = null;
            try {
                document = reader.read(filePath);
                Element element = document.getRootElement();
                openOffice_INSTALL_PATH = element.elementText("openOffice");
                SWFTools_HOME = element.elementText("SWFTools");
            } catch (DocumentException e) {
                e.printStackTrace();
            }

        }
    }

    public NewFileConvertUtil(File inputFile,File outputFile){
        initializeConfig();
        this.inputFile = inputFile;
        this.outputFile = outputFile;
        this.beginType = getFileType(inputFile);
        this.endType = getFileType(outputFile);
    }

    private String getType(String type,SubStringType subStringType){
        int len = type.indexOf("_");
        if(SubStringType.PREFIX.equals(subStringType)){
            return type.substring(0,len);
        }
        if(SubStringType.SUFFIX.equals(subStringType)){
            return type.substring(len + 1, type.length());
        }
        return null;
    }

    @Override
    public Integer call() throws Exception {
        run();
        return this.success;
    }

    enum SubStringType{
        PREFIX,
        SUFFIX;
    }

    enum  ConvertType{
        DOT_PDF,
        HTML_PDF,
        PPTX_PDF,
        DOCX_PDF,
        TXT_PDF,
        XLSX_PDF,
        DOC_PDF,
        PDF_SWF;
    }

    private boolean startSofficeProcess(){
        if(!isStartServer) {
            if (!isExistSofficeProcess()) {
                log.info("********************start soffice.exe process begin******************");
                String command = openOffice_INSTALL_PATH + "\\program\\soffice.exe -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\"";
                try {
                    log.info("Execute command"+command);
                    Process pro = Runtime.getRuntime().exec(command);
                } catch (IOException e) {
                    log.info("启动soffice.exe进程异常:(提示:异常1,配置openOffice安装目录异常;异常2,本机未安装openOffice应用程序;异常3,该文件类型不支持转换)", e) ;
                    return false;
                }
                log.info("********************start soffice.exe process end******************");
            }
        }
        return true;
    }

    private boolean isExistSofficeProcess(){
        String[] command = new String[]{"cmd.exe", "/C","wmic process get name" };
        int a=0;
        try {
            log.info("******* 获取所有进程名称判断soffice.exe是否存在 begin *******");
            Process pro = Runtime.getRuntime().exec(command);
            InputStream inputStream = pro.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
            String temp;
            while((temp=br.readLine())!=null){
                if(processName.equals(temp.trim())){
                    isStartServer = true;
                    a=1;
                    break;
                }
            }
            if(null!=br)br.close();
            if(null!=inputStream)inputStream.close();

        } catch (IOException e) {
            log.error("获取所有进程名判断是否存在soffice.exe异常:",e);
        }
        if(a==1){
            log.info("soffice.exe进程已存在,无需重新创建!");
        }else{
            log.info("创建soffice.exe进程成功!");
        }
        log.info("******* 获取所有进程名称判断soffice.exe是否存在 end *******");
        return isStartServer;
    }

    void convertPDF(){
        log.info("********************* 转换文件开始********************");
        if(startSofficeProcess()) {
            OpenOfficeConnection connection;
            try {
                connection = new SocketOpenOfficeConnection(8100);
                if(!connection.isConnected()) {
                    connection.connect();
                }
                DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
                converter.convert(inputFile, outputFile);
            } catch (ConnectException ce) {
                log.error(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"--转换文件异常:",ce);
                return;
            }
            success = 0;
            connection.disconnect();
        }
        log.info("********************* 转换文件结束********************");
    }

    void convertSWF() throws IOException {
        if(!outputFile.exists()){
            if(outputFile.isDirectory() || !inputFile.exists()){
                return;
            }
            if(outputFile.isFile()){
                outputFile.createNewFile();
            }
        }
        if(!inputFile.exists()){
            return ;
        }
        log.info("************* "+beginType+" begin*********************");
        String command = SWFTools_HOME + "\\pdf2swf.exe " + inputFile.getAbsolutePath() + " -o " + outputFile.getAbsolutePath() + " -T 9  ";
        log.info("Execute command:"+command);
        Process pro = Runtime.getRuntime().exec(command);
        try {
            pro.waitFor();
        } catch (InterruptedException e) {
            log.error("转换swf异常(提示:异常1,SWFTolls程序未安装;异常2,SWFTools安装目录未配置):",e);
        }
        log.info("************* "+beginType+"转换swf end*********************");
        success = pro.exitValue();
    }

    /**
     * 删除目录下所有文件、目录以及目录下文件
     * @param file
     * @return
     */
    public static boolean removeFile(File file){
        if(file.isDirectory()){
            String[] strings = file.list();
            for(int i=0;i<strings.length;i++){
                boolean success = removeFile(new File(file,strings[i]));
                if(!success){
                    return false;
                }
            }
        }
        file.delete();
        return true;
    }

    /**
     * 获取大写的文件后缀名
     * @param file
     * @return
     */
    private String getFileType(File file){
        String fileName = file.getName();
        return fileName.substring(fileName.lastIndexOf(".")+1,fileName.length()).toUpperCase();
    }

    public synchronized void run() {
        try {
            Thread.sleep(10000);
            if(endType!=null){
                if("PDF".equals(endType)) {
                    convertPDF();
                }
                if("PDF".equals(beginType) && "SWF".equals(endType)){
                    convertSWF();
                }
            }else{
                log.info("转换的文件类型和ConvertType不匹配,无法转换程序停止运行");
                return;
            }
        } catch (InterruptedException e) {
            log.error("转换pdf异常:",e);
        } catch (IOException e) {
            log.error("转换SWF异常:",e);
        }
    }

    public static List<Integer> execute(List<NewFileConvertUtil> task){
        ExecutorService exec = Executors.newCachedThreadPool();
        ArrayList<Future<Integer>> list = new ArrayList<>(task.size());
        for(int i=0;i<task.size();i++){
            list.add(exec.submit(task.get(i)));
        }
        ArrayList<Integer> results = new ArrayList<>(task.size());
        for(Future<Integer> fs : list){
            try {
                results.add(fs.get().intValue());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
        if(!exec.isShutdown()){
            exec.shutdown();
        }
        return results;
    }

    public static Integer execute(File inputFile,File outputFile) {
        ExecutorService exec = Executors.newCachedThreadPool();
        NewFileConvertUtil convert = new NewFileConvertUtil(inputFile,outputFile);
        Future<Integer> fs = exec.submit(convert);

        try {
            return fs.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }finally {
            if(!exec.isShutdown()){
                exec.shutdown();
            }
        }
        return -1;
    }

    public static void main(String arg0[]) throws Exception {
        ExecutorService exec = Executors.newCachedThreadPool();
        NewFileConvertUtil convert = new NewFileConvertUtil(new File("E:\\51job_宋庆亨(86307153).doc"),new File("E://123456.pdf"));
        Future fs = exec.submit(convert);
        System.out.println(fs.get());
        if(!exec.isShutdown()){
            exec.shutdown();
        }

    }
}

下面是配置文件,放到根目录下,会自动加载

<?xml version="1.0" encoding="UTF-8"?>
<main>
    <common>程序安装路径配置</common>
    <openOffice>C:\Program Files (x86)\OpenOffice 4</openOffice>
    <SWFTools>C:\Program Files (x86)\SWFTools</SWFTools>

</main>
时间: 2024-12-10 20:11:25

openOffice和SWFTools 在线浏览的相关文章

PDF解决方案(4)--在线浏览

相关专题链接 PDF解决方案(1)--文件上传 PDF解决方案(2)--文件转PDF PDF解决方案(3)--PDF转SWF PDF解决方案(4)--在线浏览 前言:上一篇主要提到了PDF在线浏览的各种方案的优劣和如何把PDF转换为SWF文件,这一篇主要介绍SWF文件的在线浏览. SWF在线浏览 SWF在线浏览选择的是FlexPaper,一个轻量级的开源(又是开源,开源万岁!)组件,可以在浏览器中显示各种文档. 下载地址:http://flexpaper.devaldi.com/ 在自己的页面中

Java模拟实现百度文档在线浏览

Java模拟实现百度文档在线浏览 这个思路是我参考网上而来,代码是我实现. 采用Apache下面的OpenOffice将资源文件转化为pdf文件,然后将pdf文件转化为swf文件,用FlexPaper浏览. ok, A.下载OpenOffice (转换资源文件) B.下载JodConverter(调用OpenOffice) C.下载Swftools(Pdf2Swf) D.下载 FlexPaper(浏览swf文件) 这里我已经全部下载好了,大家只需要下载:http://down.51cto.com

在线浏览文档的方案

百度了一下,java 方面 在线浏览文档基本都是OpenOffice+SWFTool+Flexpaper的居多. 我这两天项目用上.没多考虑就直接拿来用了.不想一堆的问题... 首先jodconverter 2.2.1 不支持2007 office 文档的转换.需要FQ去下载谷歌的3.0-Beta-4版本 :( 其次,转换表格不理想.Excel,和带表格的word文档,就别指望能有高颜值的pdf文档输出. 最后,速度慢啊,先要转pdf,pdf又要转swf. 真个烦. 最悲剧的是,officeMa

JAVA实现word doc docx pdf excel的在线浏览 - 仿百度文库 源码

我们具体实现思路是这样的 首先下载并安装openoffice和swftools openoffice下载地址:http://www.openoffice.org/download/index.html swftools下载地址:http://www.swftools.org/download.html 本源码下载地址: 去除FlexPaper水印的下载地址:http://pan.baidu.com/s/1qWDfphU FlexPaper原版源码下载地址:http://pan.baidu.com

利用FlexPaper实现Word、PPT、PDF在线浏览

今天在百度文库看文件时想着有没有可以在线看电子书的插件或源码呢?到网上搜索下发现了FlexPaper,下载下来,找了一些资料,折腾一番,出的效果还不错,就是将中文文档转换成swf文件时卡住了,先作个记录,以后有空再研究了. FlexPaper 是 一个开源轻量级的在浏览器上显示各种文档的组件,被设计用来与PDF2SWF一起使用, 使在Flex中显示PDF成为可能,而这个过程并无需PDF软件环境的支持.它可以被当做Flex的库来使用.另外也可以通过将一些例如Word.PPT 等文档转成PDF,然后

FlexPaper实现文档在线浏览(附源码)

园子里也有关于FlexPaper的文章,但都不怎么详细. 没有较全的参数说明.就连官方网站都没有.没法,最后只得将swf文件反编译后查看了源码才将里面的参数全部弄出来. 好了,废话不多说,开始正题. 1. 概述 FlexPaper是一个开源轻量级的在浏览器上显示各种文档的组件,被设计用来与PDF2SWF一起使用, 使在浏览器中显示PDF成为可能,而这个过程并无需PDF软件环境的支持. 另外也可以通过将一些例如Word.PPT等文档转成PDF,然后实现在线浏览. 2. 实现步骤 文档(PDF,Wo

在线浏览office 文件

http://blog.csdn.net/binyao02123202/article/details/20051683 [Asp.net]常见word,excel,ppt,pdf在线预览方案,有图有真相,总有一款适合你! 2014-02-27 15:04     1089人阅读     评论(0)     收藏     举报 目录(?)[+] 引言 方案一 方案二 方案三 方案四 方案五 方案六 总结 引言 之前项目需要,查找了office文档在线预览的解决方案,顺便记录一下,方便以后查询.

sharepoint 2013 office web app 2013 文档在线浏览 IE11 浏览器不兼容解决方法

昨晚配置完成office web apps 2013的外部网络访问之后,今天发现了一个很奇怪的问题,就是IE 11不支持文档在线浏览,找了很多方法,打补丁什么的,都不管用,最后在预览文件的页面,看到<head>标签,里面有一句代码: <meta http-equiv="X-UA-Compatible" content="IE=99" /> 我把他改成了 <meta http-equiv="X-UA-Compatible&quo

页面中打开Word,在线浏览

/// <summary> /// 为了通用,放到一个类文件中,别的也没直接调用 /// </summary> /// <param name="fileName">得到上传的文件名字以及后缀名字</param> /// <param name="inFilePath">要打开文件的路径</param> /// <param name="ShowPath">生产静