1.下载安装包
(1)安装openoffice:使用时需要开启服务(命令开启:
cd C:\Program Files (x86)\OpenOffice 4\program
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
)
(2)安装安装swfTools
(3)下载flexpaper(只需要用到js文件和FlexPaperViewer.swf:
flexpaper_flash_debug.js
flexpaper_flash.js
jquery.js
)
(4))下载OpenDocument
2.创建上传documentUpload.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>文档在线预览系统</title> 8 <style> 9 body {margin-top:100px;background:#fff;font-family: Verdana, Tahoma;} 10 a {color:#CE4614;} 11 #msg-box {color: #CE4614; font-size:0.9em;text-align:center;} 12 #msg-box .logo {border-bottom:5px solid #ECE5D9;margin-bottom:20px;padding-bottom:10px;} 13 #msg-box .title {font-size:1.4em;font-weight:bold;margin:0 0 30px 0;} 14 #msg-box .nav {margin-top:20px;} 15 </style> 16 17 </head> 18 <body> 19 <div id="msg-box"> 20 <form name="form1" method="post" enctype="multipart/form-data" action="docUploadConvertAction.jsp"> 21 <div class="title"> 22 正在上传...... 23 </div> 24 <p> 25 <input name="file1" type="file"> 26 </p> 27 <p> 28 <input type="submit" name="Submit" value="上传"> 29 </p> 30 </form > 31 </div> 32 </body> 33 </html>
3.后台文件转化类
package com.upload; 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; 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); 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("D:/Program Files/SWFTools/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"); } //Linux
//else { // System.out.println("swf转换器开始工作,当前设置运行环境linux"); // } 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"); } } } }
4.创建文档上传转换处理文件
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="java.io.*"%> <%@page import="java.util.Enumeration"%> <%@page import="com.oreilly.servlet.MultipartRequest"%> <%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%> <%@page import="com.cectsims.util.DocConverter"%> <% //文件上传采用cos组件上传,可更换为commons-fileupload上传,文件上传后,保存在upload文件夹 //获取文件上传路径 String saveDirectory =application.getRealPath("/")+"upload"; //打印上传路径信息 System.out.println(saveDirectory); //每个文件最大50m int maxPostSize = 50 * 1024 * 1024 ; //采用cos缺省的命名策略,重名后加1,2,3...如果不加dfp重名将覆盖 DefaultFileRenamePolicy dfp = new DefaultFileRenamePolicy(); //response的编码为"UTF-8",同时采用缺省的文件名冲突解决策略,实现上传,如果不加dfp重名将覆盖 MultipartRequest multi = new MultipartRequest(request, saveDirectory, maxPostSize,"UTF-8",dfp); //MultipartRequest multi = new MultipartRequest(request, saveDirectory, maxPostSize,"UTF-8"); //输出反馈信息 Enumeration files = multi.getFileNames(); while (files.hasMoreElements()) { System.err.println("ccc"); String name = (String)files.nextElement(); File f = multi.getFile(name); if(f!=null){ String fileName = multi.getFilesystemName(name); //获取上传文件的扩展名 String extName=fileName.substring(fileName.lastIndexOf(".")+1); //文件全路径 String lastFileName= saveDirectory+"\\" + fileName; //获取需要转换的文件名,将路径名中的'\'替换为'/' String converfilename = saveDirectory.replaceAll("\\\\", "/")+"/"+fileName; System.out.println(converfilename); //调用转换类DocConverter,并将需要转换的文件传递给该类的构造方法 DocConverter d = new DocConverter(converfilename); //调用conver方法开始转换,先执行doc2pdf()将office文件转换为pdf;再执行pdf2swf()将pdf转换为swf; d.conver(); //调用getswfPath()方法,打印转换后的swf文件路径 System.out.println(d.getswfPath()); //生成swf相对路径,以便传递给flexpaper播放器 String swfpath = "upload"+d.getswfPath().substring(d.getswfPath().lastIndexOf("/")); System.out.println(swfpath); //将相对路径放入sessio中保存 session.setAttribute("swfpath", swfpath); out.println("上传的文件:"+lastFileName); out.println("文件类型"+extName); out.println("<hr>"); } } %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</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> <form name="viewForm" id="form_swf" action="documnetView.jsp" method="POST"> <input type='submit' value='预览' class='BUTTON SUBMIT'/> </form> </div> </body> </html>
5.预览页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String swfFilePath=session.getAttribute("swfpath").toString(); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <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:820px;height:650px;display:block"></a> <script type="text/javascript"> var fp = new FlexPaperViewer( 'FlexPaperViewer', //这里是FlexPaperViewer.swf的路径,相对根目录 'viewerPlaceHolder', //这里是要显示Swf的区域的ID
{ config : { SwfFile : escape('<%=swfFilePath%>'), //这里是要显示的swf的位置 Scale : 0.6, //缩放比例 ZoomTransition : 'easeOut', //Flexpaper中缩放样式,它使用和Tweener一样的样式,默认参数值为easeOut.其他可选值包括: easenone, easeo //ut, linear, easeoutquad ZoomTime : 0.5, //从一个缩放比例变为另外一个缩放比例需要花费的时间,该参数值应该为0或更大。 ZoomInterval : 0.2, //缩放比例之间间隔,默认值为0.1,该值为正数。 FitPageOnLoad : true, //初始化的时候自适应页面,与使用工具栏上的适应页面按钮同样的效果。 FitWidthOnLoad : false,//初始化的时候自适应页面宽度,与工具栏上的适应宽度按钮同样的效果。 FullScreenAsMaxWindow : false, //是否支持全屏,当设置为true的时候,单击全屏按钮会打开一个flexpaper最大化的新窗口而不是全屏,当由于fla //sh播放器因为安全而禁止全屏,而使用flexpaper作为独立的flash播放器的时候设置为true是个优先选择。 ProgressiveLoading : false, //当设置为true的时候,展示文档时不会加载完整个文档,而是逐步加载,但是需要将文档转化为9以上的flash版本(使 //用pdf2swf的时候使用-T 9 标签)。 MinZoomSize : 0.2, //最小的缩放比例。 MaxZoomSize : 5, //设置最大的缩放比例。 SearchMatchAll : false, //设置为true的时候,单击搜索所有符合条件的地方高亮显示。 InitViewMode : 'SinglePage', //启动模式 ViewModeToolsVisible : true,//工具栏上是否显示样式选择框(就是显示缩略图或分页显示的工具) ZoomToolsVisible : true, //工具栏上是否显示缩放工具 NavToolsVisible : true, //工具栏上是否显示导航工具(也就是页码工具) CursorToolsVisible : true, //工具栏上是否显示光标工具 SearchToolsVisible : true, //工具栏上是否显示搜索 localeChain: 'en_CN' //语言 }}); </script> </div> </body> </html>
6.flexpaper所需jar:cos.jar