Java--office(word......)在线预览(openoffice+swfTools+FlexPaper)

简介: Java--office(word......)在线预览(openoffice+swfTools+FlexPaper)

Java--在线预览(SpringMVC实现)

前言:我废了两天的时间把他做出来的,因为在预览文件的时候,需要进行下载第三方插件,所以在安卓端查看的时候用户体验的效果不好,直接就给否定了,最终选择了另外一种方式。word转为html进行在线预览,果然,转为html的方式确实非常的简单,可能十分钟你就搞定了。


word转为html大家可以进行查看:

https://blog.csdn.net/mcb520wf/article/details/79899622

一.概述

主要原理

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

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

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

二.安装包下载

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

  下载地址:Apache Open Office 4.x

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

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

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

  下载地址:FlexPaper官网下载

三.安装文件

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

打开dos窗口,cdm命令:进入openoffice安装盘符:

C:\Program Files (x86)\OpenOffice 4\program(拷贝就行)


输入以下代码来启动服务:

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


注意:输入后没有任何反应,这样才能继续向下进行


四.开始开发

4.1 建立maven项目。首先要将js文件,以及FlexPaperViewer.swf 拷贝到项目里面(非常重要)


上面的红色叉号不用担心,因为我的maven工程并没有引入jar包,下面是pom文件引入JAR包

<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>  
4.2 SpringMVC配置文件
 <?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.3 web.xml
    <?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>  

4.4 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>  
4.5 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>  
4.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");  
                }  
            }  
        }  
      
    }  
4.7 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";  
        }  
    }  

访问:

http://localhost:8080/upload


参考博客文章:

目录
相关文章
|
1月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
131 5
|
1月前
|
C#
【Azure App Service】使用Microsoft.Office.Interop.Word来操作Word文档,部署到App Service后报错COMException
System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 80040154 Class not registered (0x80040154 (REGDB_E_CLASSNOTREG)).
|
2月前
|
Java Apache Maven
Java将word文档转换成pdf文件的方法?
【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
449 1
|
4月前
|
XML Java 数据格式
基于Java+freemarker实现动态赋值以及生成Word文档
使用Java和Freemarker技术实现动态数据填充到Word文档模板并生成新的Word文档。
296 0
基于Java+freemarker实现动态赋值以及生成Word文档
|
3月前
|
Java Apache Maven
Java中使用poi+poi-tl实现根据模板导出word文档
这个过程不仅简化了文档生成的工作,而且保证了生成文档的一致性与准确性,特别适合于那些需要生成大量文档的自动化场景。通过以上步骤,Java开发人员可以实现高效、可靠的Word文档导出功能。
1592 0
|
4月前
|
C# 开发者 Windows
WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
301 0
|
4月前
【科研技巧】简单的在Office Word 2019中设置页脚的页码从指定页(正文)开始
如何在Microsoft Word 2019中设置页码从指定页面(通常是正文开始页)启动的方法。
136 2
|
4月前
|
iOS开发 MacOS Windows
【Mac 系统】如何在office的Word中使用LaTeX公式
一个在Mac版Microsoft Word中使用LaTeX语法插入公式的间接方法,通过Pages文稿创建和编辑LaTeX公式后再复制到Word中。
325 2
|
5月前
|
JavaScript Java
Java 将Markdown文件转换为Word和PDF文档
【7月更文挑战第5天】Java中使用`Spire.Doc for Java`库可方便地将Markdown转换为Word或PDF。基本步骤包括导入模块,创建`Document`对象,加载Markdown文件,然后保存为目标格式(`.docx`或`.pdf`)。若遇到`Invalid UTF-8 stream`错误,需确保Markdown文件是UTF-8无BOM编码。页面设置可通过`PageSetup`类调整。注意,实际应用会依据具体需求和环境有所调整。
325 6
|
4月前
|
Java 网络安全 开发工具
新手入门Java。如何下载Eclipse、写出最基本的“Hello word”以及如何连接github并且上传项目。
新手入门Java。如何下载Eclipse、写出最基本的“Hello word”以及如何连接github并且上传项目。
64 0
下一篇
DataWorks