java jsp文档在线预览,仿百度文库的那种

之前公司要做文档在线预览,且要开源免费的,找了好长时间,做出来了,谁知道公司有个狗屁都不懂得上司领导,啥都不知道也就算了,还喜欢装逼,尼玛装逼也就算了,别人做事他有事没事的插一脚,搞得你事情都做不成,后来把这个文档预览做出来了,但是被那个傻逼领导给毙掉了,作为自己的技术存储把,就当练练手了

不说了上代码

文档转换工具类

package com.taixin.utils.docconvert;

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

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;

/**
 * @description 文档转换工具类
 * 该类有两个功能,其最终都是为了将doc xls,ppt,pdf文件转换成.swf文件供flexpaper在网页中预览,类似百度文库那样,
 * 1.将doc xls,ppt文件转换成pdf文件,故若该文件本身就是pdf文件则不需要再转换了,
 * 2.将上一步骤的pdf文件再转换成swf文件
 * 
 * @date 2013/07/18 14:16
 * 
 * @author Teach3
 * 
 */
public class DocConverter {
    //private static final int environment = 1;// 环境1:windows  2:linux(涉及pdf2swf路径问题)
    @SuppressWarnings("unused")
    private String fileString;
    @SuppressWarnings("unused")
    private String outputPath = "";// 输入路径,如果不设置就输出在默认位置
    private String fileName;
    private File pdfFile;
    private File swfFile;
    private File docFile;
    
    //默认构造器
    public DocConverter() {
        
    }

    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(
                        8100);
                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) {
                    // ToDo Auto-generated catch block
                    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
     */
    private void pdf2swf() throws Exception {
        DocConverter docConverter = new DocConverter();
        InputStream in = docConverter.getClass().getResourceAsStream("/pdf2swf.properties");//读取配置文件获得pdf2swf的安装路径
        Properties prop = new Properties();
        prop.load(in);
        Runtime r = Runtime.getRuntime();
        if (!swfFile.exists()) {
            if (pdfFile.exists()) {
                try {
                    Process p = r
                            .exec(prop.getProperty("pdf2swfPath") + " "
                                    + 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()) {//因为pdf文件只是一个中间转换的文件,故在将pdf转换成swf文件之后将pdf文件删除,避免浪费硬盘资源
//                        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();
    }

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

        System.out.println("****swf转换器开始工作****");

        try {
            doc2pdf();
            pdf2swf();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

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

    /*
     * 返回文件路径
     * 
     * @param s
     */
    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");
            }
        }
    }

    /**
     * 写个main函数测试文件的转换是否成功
     * @param args
     */
    public static void main(String args[]) {
        DocConverter d = new DocConverter(
                "C:\\Users\\Tech3\\Desktop\\pro\\PDF-20130531152724-K1JiYingW1nXi1ZuoYuJiangYan.pdf");
        d.conver();
    }
}

 

注意,这里面用到了很多第三方的工具转换文档预览文档啥的,没办法,要免费开源的,搞了我好长时间,想到最后这个技术没被用到项目中就蛋疼(因为那个傻逼领导除了文档在线预览还得要编辑,复制粘贴,我擦,百度文库我哪能搞出来啊,就我一个人单枪匹马的

)只能用别人的工具了,然后是jsp预览,

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 4 <html>
 5 <head>
 6     <title>FlexPaper</title>
 7     <link rel="stylesheet" type="text/css" href="/DOC_PREVIEW_DEMO/FlexPaper_2.1.2/css/flexpaper.css" />
 8     <script type="text/javascript" src="/DOC_PREVIEW_DEMO/FlexPaper_2.1.2/js/jquery.min.js"></script>
 9     <script type="text/javascript" src="/DOC_PREVIEW_DEMO/FlexPaper_2.1.2/js/flexpaper.js"></script>
10     <script type="text/javascript" src="/DOC_PREVIEW_DEMO/FlexPaper_2.1.2/js/flexpaper_handlers.js"></script>
11 </head>
12 <body>
13 <input type="hidden" id="previewDocumName"  value=${previewDocumName} />
14 <div id="documentViewer" class="flexpaper_viewer" style="width:1000px;height:1000px; margin-left: auto;margin-right: auto;">
15 <script type="text/javascript">
16 var previewDocumName = document.getElementById("previewDocumName").value;
17     $('#documentViewer').FlexPaperViewer(
18             { config : {
19                 SWFFile : '/DOC_PREVIEW_DEMO/upload/'+previewDocumName,
20                 Scale : 0.6,
21                 ZoomTransition : 'easeOut',
22                 ZoomTime : 0.5,
23                 ZoomInterval : 0.2,
24                 FitPageOnLoad : true,
25                 FitWidthOnLoad : false,
26                 FullScreenAsMaxWindow : false,
27                 ProgressiveLoading : false,
28                 MinZoomSize : 0.2,
29                 MaxZoomSize : 5,
30                 SearchMatchAll : false,
31                 InitViewMode : 'Portrait',
32                 RenderingOrder : 'flash',
33                 StartAtPage : '',
34                 ViewModeToolsVisible : true,
35                 ZoomToolsVisible : true,
36                 NavToolsVisible : true,
37                 CursorToolsVisible : true,
38                 SearchToolsVisible : true,
39                 WMode : 'window',
40                 localeChain: 'zh_CN'
41             }}
42     );
43 </script>
44 </div>
45 </body>
46 </html>
View Code

调用文档转换类

  1 package com.taixin.action;
  2 
  3 import java.io.File;
  4 import java.text.SimpleDateFormat;
  5 import java.util.Date;
  6 import java.util.List;
  7 
  8 import javax.servlet.http.HttpServletRequest;
  9 import javax.servlet.http.HttpServletResponse;
 10 import javax.servlet.http.HttpSession;
 11 
 12 import org.apache.commons.io.FileUtils;
 13 import org.apache.struts2.ServletActionContext;
 14 import org.apache.struts2.interceptor.ServletRequestAware;
 15 import org.apache.struts2.interceptor.ServletResponseAware;
 16 
 17 import com.opensymphony.xwork2.ActionSupport;
 18 import com.taixin.pojo.DocPreview;
 19 import com.taixin.service.DocPreviewService;
 20 import com.taixin.utils.docconvert.DocConverter;
 21 
 22 /**
 23  * @description 文档预览Action
 24  * 
 25  * @date 2013/07/17 16:28
 26  * 
 27  * @author 刘泽敏
 28  *
 29  */
 30 
 31 public class DocPreviewAction extends ActionSupport implements
 32         ServletRequestAware, ServletResponseAware {
 33 
 34     private static final long serialVersionUID = 1L;
 35     
 36     protected HttpServletRequest request;
 37     protected HttpServletResponse response;
 38     protected HttpSession session;
 39     
 40     private DocPreviewService docPreviewService;
 41     
 42     private List<DocPreview> docPreviewList;//文档集合,用于存储查询后的所有文档
 43     
 44     private DocPreview docPreview;//文档预览实体对象,添加或者修改直接操作该对象
 45     
 46     private File docName;//上传的文件
 47     private String docNameFileName;//上传的文件名
 48 
 49     /**
 50      * 查询所有文档
 51      * @return docPreviewMain 查询后返回到文档列表页面
 52      */
 53     public String initMain(){
 54         
 55         docPreviewList = docPreviewService.queryAllDoc();
 56         return "docPreviewMain";
 57     }
 58     
 59     /**
 60      * 跳转到添加页面
 61      * @return docPreviewAdd 跳转到添加页面
 62      */
 63     public String initAddDoc(){
 64         return "docPreviewAdd";
 65     }
 66     
 67     /**
 68      * 添加文档
 69      * @return toDocPreviewMain 添加完成后跳到文档列表页面
 70      */
 71     public String doAddDoc() throws Exception{
 72         String path = ServletActionContext.getServletContext().getRealPath("upload");//上传的路径
 73         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssS");// 格式化时间输出
 74         String reName = sdf.format(new Date());// 取得当前时间,Date()是java.util包里的,这作为要预览文件的真实名称
 75         //将上传的文档重命名是因为flexpaper不支持中文名文件的预览,所以此处将上传的文档根据时间串重命名
 76         int i = docNameFileName.lastIndexOf(".");//截取到后缀位置
 77         String suffix = docNameFileName.substring(i);//文件后缀名
 78         if (docName!=null) {//如果上传的文件不为空
 79             File saveFile = new File(new File(path), reName+suffix);//时间串加上后缀名拼接成新的文件名
 80             if (!saveFile.getParentFile().exists()) {//如果文件夹不存在
 81                 saveFile.getParentFile().mkdirs();//创建上传文件夹
 82             }
 83             FileUtils.copyFile(docName, saveFile);//将上传的文件复制到上传文件夹中
 84             String docLocaAndName = path + "\\" + reName + suffix;//上传文件(包括文件名和文件所在的全路径)
 85             DocConverter docConverter = new DocConverter(docLocaAndName);//创建文档转换工具类对象
 86             docConverter.conver();//调用转换方法
 87         }
 88         docPreview.setDocName(docNameFileName);//存入文档名称
 89         docPreview.setEnglishDocName(reName+suffix);
 90         docPreviewService.addDoc(docPreview);
 91         return "toDocPreviewMain";
 92     }
 93     
 94     /**
 95      * 文档预览
 96      * @return docPreview 点击文档名跳转到文档预览页面
 97      * @throws Exception
 98      */
 99     public String docPreview() throws Exception {
100         String englishDocName = request.getParameter("englishDocName");//获取要预览的文件名
101         if (englishDocName != null) {
102             StringBuffer buff = new StringBuffer(englishDocName);
103             StringBuffer buff1 = buff.delete(englishDocName.lastIndexOf('.'),englishDocName.length());//去掉文档后缀名
104             String previewDocumName = buff1.append(".").append("swf").toString();//追加swf后缀,因为flexpaper预览的是swf后缀格式的文件
105             request.setAttribute("previewDocumName", previewDocumName);
106         }
107 
108         return "docPreview";
109     }
110     
111     /**
112      * 删除文档
113      * @return toDocPreviewMain 删除完成后跳转到文档列表页面
114      */
115     public String doDelDoc(){
116         docPreviewService.deleteDoc(docPreview.getDocId());
117         return "toDocPreviewMain";
118     }
119     
120     /**
121      * 跳转到修改页面
122      * @return docPreviewUpdate 跳转到修改页面
123      */
124     public String initUpdDoc(){
125         docPreview = docPreviewService.queryDocByDocId(docPreview.getDocId());
126         return "docPreviewUpdate";
127     }
128     
129     /**
130      * 修改文档
131      * @return toDocPreviewMain 修改完成后跳转到文档列表页面
132      */
133     public String doUpdDoc(){
134         docPreviewService.updateDoc(docPreview);
135         return "toDocPreviewMain";
136     }
137     
138     
139     @Override
140     public void setServletResponse(HttpServletResponse httpResponse) {
141         response = httpResponse;
142 
143     }
144 
145     @Override
146     public void setServletRequest(HttpServletRequest httpRequest) {
147         request = httpRequest;
148         session = request.getSession();
149     }
150 
151     public DocPreviewService getDocPreviewService() {
152         return docPreviewService;
153     }
154 
155     public void setDocPreviewService(DocPreviewService docPreviewService) {
156         this.docPreviewService = docPreviewService;
157     }
158 
159     public List<DocPreview> getDocPreviewList() {
160         return docPreviewList;
161     }
162 
163     public void setDocPreviewList(List<DocPreview> docPreviewList) {
164         this.docPreviewList = docPreviewList;
165     }
166 
167     public DocPreview getDocPreview() {
168         return docPreview;
169     }
170 
171     public void setDocPreview(DocPreview docPreview) {
172         this.docPreview = docPreview;
173     }
174 
175     public File getDocName() {
176         return docName;
177     }
178 
179     public void setDocName(File docName) {
180         this.docName = docName;
181     }
182 
183     public String getDocNameFileName() {
184         return docNameFileName;
185     }
186 
187     public void setDocNameFileName(String docNameFileName) {
188         this.docNameFileName = docNameFileName;
189     }
190 }
View Code

再就是说明文档

 

文档在线预览

 

1.开发环境

a.操作系统:Windows 7   64位

b.开发工具: MyEclipse 10,Tomcat7,JDK7,sqlserver2008R2

c.开发框架Struts-2.3.15,hibernate-4.2.3,spring-3.2.3

d.所需第三方软件或依赖包及对应的版本号

1).Apache_OpenOffice_incubating_3.4.1_Win_x86_install_en-US.exe,

2). swftools-0.9.0.exe,

3).jodconverter-tomcat-2.2.2.zip,

4). FlexPaper_2.1.2.zip

2.开发步骤

a.开发简介

文档在线预览主要是将用户上传的文件,如doc,docx,ppt,pdf,xls格式的文件在浏览器中预览,其主要原理是使用openoffice将doc xls,ppt,文件转换成pdf格式,(若用户上传的文件已经是pdf格式则不需要在转换,)然后使用pdf2swf将pdf格式的文件转换成swf文件,然后使用flexpaper技术在网页中预览生成的swf文件,其具体步骤如下:

 

b.开发步骤

  1. 下载OpenOffice软件,因为需要该软件将用户上传的文档转换成pdf格式文件, openoffice的网址是: http://www.openoffice.org/,

下载地址是: http://www.openoffice.org/download/index.html,目前最新的版本是3.4.1

安装很简单都是默认一路下一步完成即可,因为该软件的服务默认是关闭的(即非自动开启服务的)安装完成后记得手动开启OpenOffice服务,开启服务的方法:

打开windows 命令行, 进入<OpenOffice安装目录>/program/目录并运行以下命令启动OpenOffice服务:

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

 

  1. 再安装swftools软件,因为要使用该软件将上一步骤生成的pdf文件转换成swf文件供flexpaper在浏览器中预览, swftools网址是: http://www.swftools.org/,

下载地址: http://www.swftools.org/download.html,注意,该软件根据操作系统划分了很多版本,因我们项目是运行在windows平台上的,现在windows平台的最新版本是0.9.0,安装该软件时注意不要安装在带中文和空格的路径下,否则后面文件转换会报错,导致文件转换失败,如:安装目录: C:\Users\Tech3\Desktop\testcon

 

  1. 下载JODConverter,开发过程中需要依赖JODConverter的依赖包, JODConverter

网址: http://www.artofsolving.com/opensource/jodconverter/,

下载地址: http://sourceforge.net/projects/jodconverter/files/,目前最新的版本是:2.2.2

 

  1. 最后一步,下载flexpaper,因为转换后的swf文件最终是在flexpaper里面预览, flexpaper 网址:http://flexpaper.devaldi.com/,下载地址: http://flexpaper.devaldi.com/download/,注意是下载依赖库不是软件,选项是: Download Web Server Package,完成上述步骤后,在工程中需要导入JODConverter/lib的所有jar包和flexpaper/css, flexpaper/js下的所有文件,具体内容可参考svn上的demo.

 

3.具体的开发细节

a.备注说明

以下具体的开发步骤是基于SVN上成型的demo而言,个人可根据自己电脑的相关环境自行定义

b. 搭建一个SSH(struts,hibernate,spring框架)

因为该技术demo是基于SSH架构,SSH版本可参见第一章的开发环境,SVN上的技术demo项目名: DOC_PREVIEW_DEMO

 

c.导入相关资源文件到项目中

  1.在WebContent创建一个FlexPaper_2.1.2文件夹,该文件夹包含如下内容文件:

 

上图中的文件来源于本文档第一章中下载的FlexPaper_2.1.2.zip。引入的都是一些文档预览所需的css样式和js文件和一个FlexPaper预览器,若想查看其源码可参见SVN上的demo,里面有成型的demo以及相关的代码注释

2.在应用下创建应用所需的视图文件,如图:

 

一个文档预览基本增删查改所需的页面

3.然后导入项目所需的依赖jar包到web应用的lib文件夹下,并配置好应用的web.xml文件,具体配置可参考SVN的demo。

4.编写java代码,demo是基于SSH三层架构,所以要完成service和dao接口和实现类的编码,然后再编写action层,配置好struts.xml文件,最后编写文档转换器工具类,为了程序的良好的扩展性,我们把pdf2swf安装的路径以配置文件的方式来读取,这样方便也灵活,项目结构如下:

 

 

4.创建数据库

 a.创建数据库,库名:testssh

数据库脚本如下(该项目是用的数据库是sqlserver2008R2):

 

USE [testssh]

GO

/****** Object:  Table [dbo].[tb_DocPreview]    Script Date: 12/23/2013 11:50:39 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_PADDING ON

GO

CREATE TABLE [dbo].[tb_DocPreview](

         [docId] [int] IDENTITY(1,1) NOT NULL,

         [docBz] [varchar](100) NULL,

         [docName] [varchar](100) NULL,

         [englishDocName] [varchar](100) NULL,

PRIMARY KEY CLUSTERED

(

         [docId] ASC

)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

) ON [PRIMARY]

GO

SET ANSI_PADDING OFF

GO

 

5.部署项目

a.把应用部署到tomcat

然后启动服务,在IE地址栏输入我们的应用地址,然后上传文件,如:excel,pdf,ppt,word,系统也支持microsoftoffice07和10或更高的版本。

预览效果如下:

 

 

 

b.可能出现的问题以及解决方法

若在上传文件的时候系统后台出现如下错误,

 

则说明OpenOffice的服务未打开,可参照本文档第二章的b步骤,即可开启OpenOffice服务。

 

貌似第二段和第三段代码位置贴反了,2和3代码位置换下就可以了

posted @ 2014-02-24 12:32  33hehe  阅读(267)  评论(0)    收藏  举报