Java基于springmvc实现文档预览(openoffice+swftools+flexpaper)

Java基于springmvc使用openoffice+swftools+flexpaper实现在线预览


源码下载

1.概述

主要原理

1.通过第三方工具openoffice,将word、excel、ppt、txt等文件转换为pdf文件

2.通过swfTools将pdf文件转换成swf格式的文件

3.通过FlexPaper文档组件在页面上进行展示

2.安装包下载

1.openoffice是Apache下的一个开放免费的文字处理软件

   下载地址:Apache Open Office 4.x

2.SWFTools是一组用来处理Flash的swf文件的工具包,我们使用它将pdf文件转成swf文件!

   下载地址:SWFTools官网下载 swftools-2013-04-09-1007.exe

3.FlexPaper是一个开源轻量级的在浏览器上显示各种文档的组件

   下载地址:FlexPaper官网下载


3.安装文件

1.将所下载的文件(JODConverter除外)进行安装,盘符可随自己设定!需要注意的是在openoffice安装完成后,当我们使用它时,需将它的服务打开。在次我们需要以命令的方式打开:

打开dos窗口,进入openoffice安装盘符,输入以下代码来启动服务:

soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

注意:最后一个命令前边的‘—’,可不要写错!服务起不来,项目可是继续不下去的哦.

官网启动服务截图如下:

Java基于springmvc实现文档预览(openoffice+swftools+flexpaper)_第1张图片


本地运行截图:

Java基于springmvc实现文档预览(openoffice+swftools+flexpaper)_第2张图片

运行成功是没有反馈的,若不放心,可以打开任务管理器,在进程中可以看到以下俩个进程:


3.开发过程

1.使用maven新建一个web项目,将源码中resource中flexpaper文件中的js文件夹(包含了flexpaper_flash_debug.js,flexpaper_flash.js,jQuery.js,这三个js文件主要是预览swf文件的插件)

拷贝至网站根目录;将FlexPaperViewer.swf拷贝至网站根目录下(该文件主要是用在网页中播放swf文件的播放器),目录结构如下图:

Java基于springmvc实现文档预览(openoffice+swftools+flexpaper)_第3张图片

注:需创建upload文件夹


2.添加maven pom依赖


  4.0.0
  com.arthur
  online-view
  war
  1.0-SNAPSHOT
  online-view Maven Webapp
  http://maven.apache.org

  
    
    4.1.0.RELEASE
    1.2.1
  

  

    
      junit
      junit
      4.11
      test
    

    
      com.artofsolving
      jodconverter
      2.2.1
    
    
    
      javax.servlet
      servlet-api
      2.5
      provided
    
    
      javax.servlet.jsp
      jsp-api
      2.1
      provided
    
    
    
      org.slf4j
      slf4j-api
      1.6.0
    
    
    
      org.slf4j
      slf4j-nop
      1.6.0
      test
    

    
    
    
      org.springframework
      spring-context
      ${spring.version}
    
    
      org.springframework
      spring-beans
      ${spring.version}
    
    
      org.springframework
      spring-core
      ${spring.version}
    

    
      org.springframework
      spring-web
      ${spring.version}
    

    
      org.springframework
      spring-webmvc
      ${spring.version}
    

    
      org.springframework
      spring-context-support
      ${spring.version}
    
    
    
      commons-fileupload
      commons-fileupload
      ${fileupload.version}
    
  

  
    online-view
  

3.创建springmvc.xml配置文件




    
    
    
    

    
     
         
         
     

    
        
        
        
        
    

    
    
    

4.在web.xml中配置好spring mvc



  Archetype Created Web Application

  
  
    SpringEncodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    
      encoding
      UTF-8
    
    
      forceEncoding
      true
    
  
  
    SpringEncodingFilter
    /*
  

  
    springmvc
    org.springframework.web.servlet.DispatcherServlet
    
      contextConfigLocation
      classpath:spring/springmvc.xml
    
    1
  
  
  
    springmvc
    /
  


5.创建文件上传视图( fileUpload.jsp )和文档在线预览视图(documentView.jsp)


fileUpload.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>



    
    文档在线预览系统
    



请上传要处理的文件,过程可能需要几分钟,请稍候片刻。

documentView.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
    String swfFilePath=session.getAttribute("swfpath").toString();
%>



    
    
    
    
    

    文档在线预览系统



6.创建转换类DocConverter.java

package com.arthur.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

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;

/**
 * doc docx格式转换
 */
public class DocConverter {
    private static final int environment = 1;// 环境 1:windows 2:linux
    private String fileString;// (只涉及pdf2swf路径问题)
    private String outputPath = "";// 输入路径 ,如果不设置就输出在默认的位置
    private String fileName;
    private File pdfFile;
    private File swfFile;
    private File docFile;

    private final String OPEN_OFFICE_HOST="127.0.0.1"; //open office运行的host
    private final Integer OPEN_OFFICE_PORT=8100; //open office运行的端口号,默认8100
    private final String SWFTOOLS_HOME="C:/Program Files (x86)/SWFTools/"; //swfTools的安装路径

    public DocConverter(String fileString) {
        ini(fileString);
    }

    /**
     * 重新设置file
     *
     * @param fileString
     */
    public void setFile(String fileString) {
        ini(fileString);
    }

    /**
     * 初始化
     *
     * @param fileString
     */
    private void ini(String fileString) {
        this.fileString = fileString;
        fileName = fileString.substring(0, fileString.lastIndexOf("."));
        docFile = new File(fileString);
        pdfFile = new File(fileName + ".pdf");
        swfFile = new File(fileName + ".swf");
    }

    /**
     * 转为PDF
     *
     * @param file
     */
    private void doc2pdf() throws Exception {
        if (docFile.exists()) {
            if (!pdfFile.exists()) {
                OpenOfficeConnection connection = new SocketOpenOfficeConnection(OPEN_OFFICE_HOST,OPEN_OFFICE_PORT);
                try {
                    connection.connect();
                    DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
                    converter.convert(docFile, pdfFile);
                    // close the connection
                    connection.disconnect();
                    System.out.println("****pdf转换成功,PDF输出:" + pdfFile.getPath()+ "****");
                } catch (java.net.ConnectException e) {
                    e.printStackTrace();
                    System.out.println("****swf转换器异常,openoffice服务未启动!****");
                    throw e;
                } catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) {
                    e.printStackTrace();
                    System.out.println("****swf转换器异常,读取转换文件失败****");
                    throw e;
                } catch (Exception e) {
                    e.printStackTrace();
                    throw e;
                }
            } else {
                System.out.println("****已经转换为pdf,不需要再进行转化****");
            }
        } else {
            System.out.println("****swf转换器异常,需要转换的文档不存在,无法转换****");
        }
    }

    /**
     * 转换成 swf
     */
    @SuppressWarnings("unused")
    private void pdf2swf() throws Exception {
        Runtime r = Runtime.getRuntime();
        if (!swfFile.exists()) {
            if (pdfFile.exists()) {
                if (environment == 1) {// windows环境处理
                    try {
                        Process p = r.exec(SWFTOOLS_HOME+"pdf2swf.exe "+ pdfFile.getPath() + " -o "+ swfFile.getPath() + " -T 9");
                        System.out.print(loadStream(p.getInputStream()));
                        System.err.print(loadStream(p.getErrorStream()));
                        System.out.print(loadStream(p.getInputStream()));
                        System.err.println("****swf转换成功,文件输出:"
                                + swfFile.getPath() + "****");
                        if (pdfFile.exists()) {
                            pdfFile.delete();
                        }

                    } catch (IOException e) {
                        e.printStackTrace();
                        throw e;
                    }
                } else if (environment == 2) {// linux环境处理
                    try {
                        Process p = r.exec("pdf2swf " + pdfFile.getPath()
                                + " -o " + swfFile.getPath() + " -T 9");
                        System.out.print(loadStream(p.getInputStream()));
                        System.err.print(loadStream(p.getErrorStream()));
                        System.err.println("****swf转换成功,文件输出:"
                                + swfFile.getPath() + "****");
                        if (pdfFile.exists()) {
                            pdfFile.delete();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        throw e;
                    }
                }
            } else {
                System.out.println("****pdf不存在,无法转换****");
            }
        } else {
            System.out.println("****swf已经存在不需要转换****");
        }
    }

    static String loadStream(InputStream in) throws IOException {

        int ptr = 0;
        in = new BufferedInputStream(in);
        StringBuffer buffer = new StringBuffer();

        while ((ptr = in.read()) != -1) {
            buffer.append((char) ptr);
        }

        return buffer.toString();
    }
    /**
     * 转换主方法
     */
    @SuppressWarnings("unused")
    public boolean conver() {

        if (swfFile.exists()) {
            System.out.println("****swf转换器开始工作,该文件已经转换为swf****");
            return true;
        }

        if (environment == 1) {
            System.out.println("****swf转换器开始工作,当前设置运行环境windows****");
        } else {
            System.out.println("****swf转换器开始工作,当前设置运行环境linux****");
        }
        try {
            doc2pdf();
            pdf2swf();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

        if (swfFile.exists()) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 返回文件路径
     *
     */
    public String getswfPath() {
        if (swfFile.exists()) {
            String tempString = swfFile.getPath();
            tempString = tempString.replaceAll("\\\\", "/");
            return tempString;
        } else {
            return "";
        }

    }
    /**
     * 设置输出路径
     */
    public void setOutputPath(String outputPath) {
        this.outputPath = outputPath;
        if (!outputPath.equals("")) {
            String realName = fileName.substring(fileName.lastIndexOf("/"),
                    fileName.lastIndexOf("."));
            if (outputPath.charAt(outputPath.length()) == '/') {
                swfFile = new File(outputPath + realName + ".swf");
            } else {
                swfFile = new File(outputPath + realName + ".swf");
            }
        }
    }

}
7. 创建文件在线预览的Controller : ViewController.java

package com.arthur.controller;

import com.arthur.util.DocConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;

/**
 * Created by Administrator on 2017/6/15.
 */
@Controller
public class ViewController {

    @RequestMapping(value = "/upload",method = RequestMethod.GET)
    public String showUploadPage(){
        return "fileUpload";
    }

    @RequestMapping(value = "/viewer",method = RequestMethod.GET)
    public String showViewer(){
        return "documentView";
    }

    @RequestMapping(value = "/convert",method = RequestMethod.POST)
    public String convert(HttpServletRequest request, HttpServletResponse response
            , @RequestParam(value = "file") CommonsMultipartFile file) throws IOException{
        /** 构建文件保存的目录* */
        String saveDirectory =request.getSession().getServletContext().getRealPath("/")+"upload"+"/";
        String filename = ""+System.currentTimeMillis();
        String extname = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        String path = saveDirectory+filename+extname;

        File newFile=new File(path);
        file.transferTo(newFile);

        DocConverter d = new DocConverter(path);
        d.conver();
        String swfpath = "upload"+d.getswfPath().substring(d.getswfPath().lastIndexOf("/"));
        request.getSession().setAttribute("swfpath", swfpath);

        return "redirect:/viewer";
    }
}
8.部署项目到tomcat
Java基于springmvc实现文档预览(openoffice+swftools+flexpaper)_第4张图片

在地址栏中输入:http://localhost:8080/upload,如下图:

Java基于springmvc实现文档预览(openoffice+swftools+flexpaper)_第5张图片

单击选择文件,选择您要上传的文档,然后单击上传,处理完成后,打印如下信息,如下图所示:

Java基于springmvc实现文档预览(openoffice+swftools+flexpaper)_第6张图片

常见问题

若出现swf无法预览,请访问

http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04a.html#119065

将生成swf的文件夹设置为信任文件位置。

最后,若需要去除打印功能及logo,可重新编译 flexpaper 的 flash文件,网上也有下载

FlexPaper参数

参考博客: java实现附件预览(openoffice+swftools+flexpaper)



你可能感兴趣的:(java)