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>
调用文档转换类
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 }
再就是说明文档
文档在线预览
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.开发步骤
- 下载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
- 再安装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
- 下载JODConverter,开发过程中需要依赖JODConverter的依赖包, JODConverter
网址: http://www.artofsolving.com/opensource/jodconverter/,
下载地址: http://sourceforge.net/projects/jodconverter/files/,目前最新的版本是:2.2.2
- 最后一步,下载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代码位置换下就可以了
浙公网安备 33010602011771号