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

来源:互联网 发布:免费淘宝客软件 编辑:程序博客网 时间:2024/05/17 21:49

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

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

官网启动服务截图如下:



本地运行截图:


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


3.开发过程

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

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


注:需创建upload文件夹


2.添加maven pom依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.arthur</groupId>  <artifactId>online-view</artifactId>  <packaging>war</packaging>  <version>1.0-SNAPSHOT</version>  <name>online-view Maven Webapp</name>  <url>http://maven.apache.org</url>  <properties>    <!-- spring版本号 -->    <spring.version>4.1.0.RELEASE</spring.version>    <fileupload.version>1.2.1</fileupload.version>  </properties>  <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>4.11</version>      <scope>test</scope>    </dependency>    <dependency>      <groupId>com.artofsolving</groupId>      <artifactId>jodconverter</artifactId>      <version>2.2.1</version>    </dependency>    <!-- servlet -->    <dependency>      <groupId>javax.servlet</groupId>      <artifactId>servlet-api</artifactId>      <version>2.5</version>      <scope>provided</scope>    </dependency>    <dependency>      <groupId>javax.servlet.jsp</groupId>      <artifactId>jsp-api</artifactId>      <version>2.1</version>      <scope>provided</scope>    </dependency>    <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->    <dependency>      <groupId>org.slf4j</groupId>      <artifactId>slf4j-api</artifactId>      <version>1.6.0</version>    </dependency>    <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->    <dependency>      <groupId>org.slf4j</groupId>      <artifactId>slf4j-nop</artifactId>      <version>1.6.0</version>      <scope>test</scope>    </dependency>    <!-- spring核心包 -->    <!-- springframe start -->    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-context</artifactId>      <version>${spring.version}</version>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-beans</artifactId>      <version>${spring.version}</version>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-core</artifactId>      <version>${spring.version}</version>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-web</artifactId>      <version>${spring.version}</version>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-webmvc</artifactId>      <version>${spring.version}</version>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-context-support</artifactId>      <version>${spring.version}</version>    </dependency>    <!-- springframe end -->    <dependency>      <groupId>commons-fileupload</groupId>      <artifactId>commons-fileupload</artifactId>      <version>${fileupload.version}</version>    </dependency>  </dependencies>  <build>    <finalName>online-view</finalName>  </build></project>
3.创建springmvc.xml配置文件

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">    <!--自动扫描包-->    <context:component-scan base-package="com.arthur.controller"></context:component-scan>        <mvc:annotation-driven />    <!-- 配置视图解析器 如何把handler 方法返回值解析为实际的物理视图 -->     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">         <property name = "prefix" value="/WEB-INF/views/"></property>         <property name = "suffix" value = ".jsp"></property>     </bean>    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">        <property name="defaultEncoding" value="UTF-8"/>        <!--50M-->        <property name="maxUploadSize" value="52428800" />        <property name="maxInMemorySize" value="4096" />    </bean>    <mvc:resources mapping="/js/**" location="/js/" />    <mvc:resources mapping="/upload/**" location="/upload/" />    <mvc:resources mapping="/*.swf" location="/" /></beans>
4.在web.xml中配置好spring mvc
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"         version="2.5">  <display-name>Archetype Created Web Application</display-name>  <!-- Spring字符集过滤器 -->  <filter>    <filter-name>SpringEncodingFilter</filter-name>    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>    <init-param>      <param-name>encoding</param-name>      <param-value>UTF-8</param-value>    </init-param>    <init-param>      <param-name>forceEncoding</param-name>      <param-value>true</param-value>    </init-param>  </filter>  <filter-mapping>    <filter-name>SpringEncodingFilter</filter-name>    <url-pattern>/*</url-pattern>  </filter-mapping>  <servlet>    <servlet-name>springmvc</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <init-param>      <param-name>contextConfigLocation</param-name>      <param-value>classpath:spring/springmvc.xml</param-value>    </init-param>    <load-on-startup>1</load-on-startup>  </servlet>    <servlet-mapping>    <servlet-name>springmvc</servlet-name>    <url-pattern>/</url-pattern>  </servlet-mapping></web-app>
5.创建文件上传视图( fileUpload.jsp )和文档在线预览视图(documentView.jsp)


fileUpload.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"         pageEncoding="UTF-8"%><!DOCTYPE html><html><head>    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">    <title>文档在线预览系统</title>    <style>        body {margin-top:100px;background:#fff;font-family: Verdana, Tahoma;}        a {color:#CE4614;}        #msg-box {color: #CE4614; font-size:0.9em;text-align:center;}        #msg-box .logo {border-bottom:5px solid #ECE5D9;margin-bottom:20px;padding-bottom:10px;}        #msg-box .title {font-size:1.4em;font-weight:bold;margin:0 0 30px 0;}        #msg-box .nav {margin-top:20px;}    </style></head><body><div id="msg-box">    <form name="form1"  method="post" enctype="multipart/form-data" action="/convert">        <div class="title">            请上传要处理的文件,过程可能需要几分钟,请稍候片刻。        </div>        <p>            <input name="file" type="file">        </p>        <p>            <input type="submit" name="Submit" value="上传">        </p>    </form ></div></body></html>
documentView.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%    String swfFilePath=session.getAttribute("swfpath").toString();%><!DOCTYPE html><html><head>    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">    <script type="text/javascript" src="/js/jquery.js"></script>    <script type="text/javascript" src="/js/flexpaper_flash.js"></script>    <script type="text/javascript" src="/js/flexpaper_flash_debug.js"></script>    <style type="text/css" media="screen">        html, body  { height:100%; }        body { margin:0; padding:0; overflow:auto; }        #flashContent { display:none; }    </style>    <title>文档在线预览系统</title></head><body><div style="position:absolute;left:50px;top:10px;">    <a id="viewerPlaceHolder" style="width:1000px;height:700px;display:block"></a>    <script type="text/javascript">        var fp = new FlexPaperViewer(                'FlexPaperViewer',                'viewerPlaceHolder', { config : {                    SwfFile : escape('<%=swfFilePath%>'),                    Scale : 1.4,                    ZoomTransition : 'easeOut',                    ZoomTime : 0.5,                    ZoomInterval : 0.2,                    FitPageOnLoad : true,                    FitWidthOnLoad : false,                    FullScreenAsMaxWindow : false,                    ProgressiveLoading : false,                    MinZoomSize : 0.2,                    MaxZoomSize : 5,                    SearchMatchAll : false,                    InitViewMode : 'SinglePage',                    ViewModeToolsVisible : true,                    ZoomToolsVisible : true,                    NavToolsVisible : true,                    CursorToolsVisible : true,                    SearchToolsVisible : true,                    localeChain: 'zh_CN'                }});    </script></div></body></html>

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. */@Controllerpublic 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


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


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


常见问题

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

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

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

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

FlexPaper参数

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



阅读全文
1 0
原创粉丝点击