笔者最近在给客户开发文档管理系统时,客户要求上传到管理系统的文档(包括ppt,word,excel,txt)只能预览不允许下载。笔者想到了百度文库和豆丁网,百度文库和豆丁网的在线预览都是利用flash来播放文档的,在网上查阅了大量资料,终于实现了该项功能,现将自己的设计和实现整理如下。

一、如何将文档转成flash支持的swf文件实现在线播放?
1.先用openOffice把ppt、word、excel、txt类型的文档转换成pdf
2.用swftools将pdf转换成swf,然后利用FlexPaper插件实现在线播放预览。
二、具体实现
1.安装必备工具组件
(1)安装openoffice,openoffice是开源免费的文字处理软件,它可以将office文档转成pdf文件(笔者安装到D:\Program Files),openOffice下载地址http://www.openoffice.org/download/index.html
(2)安装完openoffice后必须启动其server,以命令行方式启动openoffice server。进入cmd命令行提示符D:\Program Files\OpenOffice.org 3\program\
键入如下命令:
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" –nofirststartwizard

进入windows任务管理器查看有个进程soffice.bin,说明openoffice启动成功!

(3)安装swfTools(安装到 D:\Program Files)swftools作用是将pdf转换为swf文件以便flexpaper播放。下载地址:http://www.swftools.org/download.html
(4)下载flexpaper,下载地址:http://flexpaper.devaldi.com/download/
笔者下载的是FlexPaper_1.5.1,下载后将其解压备用。
(5)下载OpenDocument文档转换器 JODConverter,JODConverter是一个java的OpenDucument文件转换器,可以进行许多文件格式的转换,它利用OpenOffice来进行转换工作,它能进行以下的转换工作:
a.Microsoft Office格式转换为OpenDucument,以及OpenDucument转换为Microsoft Office
b.OpenDucument转换为PDF,Word、Excel、PowerPoint转换为PDF,RTF转换为PDF等。
下载地址:http://sourceforge.net/projects/jodconverter/files/
我们后面开发主要用它的jodconverter-2.2.2.jar包

2.软件开发过程
(1)启动Eclipse,新建web项目名称为ctcesims
(2)将上面第4步解压的flexpaper文件中的js文件夹(包含了flexpaper_flash_debug.js,flexpaper_flash.js,jquery.js,这三个js文件主要是预览swf文件的插件)拷贝至网站根目录;将FlexPaperViewer.swf拷贝至网站根目录下(该文件主要是用在网页中播放swf文件的播放器),目录结构如下图

(3)创建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. </head>
  17. <body>
  18. <div id="msg-box">
  19. <form name="form1"  method="post" enctype="multipart/form-data" action="docUploadConvertAction.jsp">
  20. <div class="title">
  21. 请上传要处理的文件,过程可能需要几分钟,请稍候片刻。
  22. </div>
  23. <p>
  24. <input name="file1" type="file">
  25. </p>
  26. <p>
  27. <input type="submit" name="Submit" value="上传">
  28. </p>
  29. </form >
  30. </div>
  31. </body>
  32. </html>

(4)创建文档转换类DocConverter.java

  1. package com.cectsims.util;
  2. import java.io.BufferedInputStream;
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import com.artofsolving.jodconverter.DocumentConverter;
  7. import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
  8. import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
  9. import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
  10. /**
  11. * doc docx格式转换
  12. */
  13. public class DocConverter {
  14. private static final int environment = 1;// 环境 1:windows 2:linux
  15. private String fileString;// (只涉及pdf2swf路径问题)
  16. private String outputPath = "";// 输入路径 ,如果不设置就输出在默认的位置
  17. private String fileName;
  18. private File pdfFile;
  19. private File swfFile;
  20. private File docFile;
  21. public DocConverter(String fileString) {
  22. ini(fileString);
  23. }
  24. /**
  25. * 重新设置file
  26. *
  27. * @param fileString
  28. */
  29. public void setFile(String fileString) {
  30. ini(fileString);
  31. }
  32. /**
  33. * 初始化
  34. *
  35. * @param fileString
  36. */
  37. private void ini(String fileString) {
  38. this.fileString = fileString;
  39. fileName = fileString.substring(0, fileString.lastIndexOf("."));
  40. docFile = new File(fileString);
  41. pdfFile = new File(fileName + ".pdf");
  42. swfFile = new File(fileName + ".swf");
  43. }
  44. /**
  45. * 转为PDF
  46. *
  47. * @param file
  48. */
  49. private void doc2pdf() throws Exception {
  50. if (docFile.exists()) {
  51. if (!pdfFile.exists()) {
  52. OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
  53. try {
  54. connection.connect();
  55. DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
  56. converter.convert(docFile, pdfFile);
  57. // close the connection
  58. connection.disconnect();
  59. System.out.println("****pdf转换成功,PDF输出:" + pdfFile.getPath()+ "****");
  60. } catch (java.net.ConnectException e) {
  61. e.printStackTrace();
  62. System.out.println("****swf转换器异常,openoffice服务未启动!****");
  63. throw e;
  64. } catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) {
  65. e.printStackTrace();
  66. System.out.println("****swf转换器异常,读取转换文件失败****");
  67. throw e;
  68. } catch (Exception e) {
  69. e.printStackTrace();
  70. throw e;
  71. }
  72. } else {
  73. System.out.println("****已经转换为pdf,不需要再进行转化****");
  74. }
  75. } else {
  76. System.out.println("****swf转换器异常,需要转换的文档不存在,无法转换****");
  77. }
  78. }
  79. /**
  80. * 转换成 swf
  81. */
  82. @SuppressWarnings("unused")
  83. private void pdf2swf() throws Exception {
  84. Runtime r = Runtime.getRuntime();
  85. if (!swfFile.exists()) {
  86. if (pdfFile.exists()) {
  87. if (environment == 1) {// windows环境处理
  88. try {
  89. Process p = r.exec("D:/Program Files/SWFTools/pdf2swf.exe "+ pdfFile.getPath() + " -o "+ swfFile.getPath() + " -T 9");
  90. System.out.print(loadStream(p.getInputStream()));
  91. System.err.print(loadStream(p.getErrorStream()));
  92. System.out.print(loadStream(p.getInputStream()));
  93. System.err.println("****swf转换成功,文件输出:"
  94. + swfFile.getPath() + "****");
  95. if (pdfFile.exists()) {
  96. pdfFile.delete();
  97. }
  98. } catch (IOException e) {
  99. e.printStackTrace();
  100. throw e;
  101. }
  102. } else if (environment == 2) {// linux环境处理
  103. try {
  104. Process p = r.exec("pdf2swf " + pdfFile.getPath()
  105. + " -o " + swfFile.getPath() + " -T 9");
  106. System.out.print(loadStream(p.getInputStream()));
  107. System.err.print(loadStream(p.getErrorStream()));
  108. System.err.println("****swf转换成功,文件输出:"
  109. + swfFile.getPath() + "****");
  110. if (pdfFile.exists()) {
  111. pdfFile.delete();
  112. }
  113. } catch (Exception e) {
  114. e.printStackTrace();
  115. throw e;
  116. }
  117. }
  118. } else {
  119. System.out.println("****pdf不存在,无法转换****");
  120. }
  121. } else {
  122. System.out.println("****swf已经存在不需要转换****");
  123. }
  124. }
  125. static String loadStream(InputStream in) throws IOException {
  126. int ptr = 0;
  127. in = new BufferedInputStream(in);
  128. StringBuffer buffer = new StringBuffer();
  129. while ((ptr = in.read()) != -1) {
  130. buffer.append((char) ptr);
  131. }
  132. return buffer.toString();
  133. }
  134. /**
  135. * 转换主方法
  136. */
  137. @SuppressWarnings("unused")
  138. public boolean conver() {
  139. if (swfFile.exists()) {
  140. System.out.println("****swf转换器开始工作,该文件已经转换为swf****");
  141. return true;
  142. }
  143. if (environment == 1) {
  144. System.out.println("****swf转换器开始工作,当前设置运行环境windows****");
  145. } else {
  146. System.out.println("****swf转换器开始工作,当前设置运行环境linux****");
  147. }
  148. try {
  149. doc2pdf();
  150. pdf2swf();
  151. } catch (Exception e) {
  152. e.printStackTrace();
  153. return false;
  154. }
  155. if (swfFile.exists()) {
  156. return true;
  157. } else {
  158. return false;
  159. }
  160. }
  161. /**
  162. * 返回文件路径
  163. *
  164. * @param s
  165. */
  166. public String getswfPath() {
  167. if (swfFile.exists()) {
  168. String tempString = swfFile.getPath();
  169. tempString = tempString.replaceAll("\\\\", "/");
  170. return tempString;
  171. } else {
  172. return "";
  173. }
  174. }
  175. /**
  176. * 设置输出路径
  177. */
  178. public void setOutputPath(String outputPath) {
  179. this.outputPath = outputPath;
  180. if (!outputPath.equals("")) {
  181. String realName = fileName.substring(fileName.lastIndexOf("/"),
  182. fileName.lastIndexOf("."));
  183. if (outputPath.charAt(outputPath.length()) == '/') {
  184. swfFile = new File(outputPath + realName + ".swf");
  185. } else {
  186. swfFile = new File(outputPath + realName + ".swf");
  187. }
  188. }
  189. }
  190. }

(5)创建文档上传转换处理文件docUploadConvertAction.jsp文件

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@page import="java.io.*"%>
  4. <%@page import="java.util.Enumeration"%>
  5. <%@page import="com.oreilly.servlet.MultipartRequest"%>
  6. <%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
  7. <%@page import="com.cectsims.util.DocConverter"%>
  8. <%
  9. //文件上传采用cos组件上传,可更换为commons-fileupload上传,文件上传后,保存在upload文件夹
  10. //获取文件上传路径
  11. String saveDirectory =application.getRealPath("/")+"upload";
  12. //打印上传路径信息
  13. System.out.println(saveDirectory);
  14. //每个文件最大50m
  15. int maxPostSize = 50 * 1024 * 1024 ;
  16. //采用cos缺省的命名策略,重名后加1,2,3...如果不加dfp重名将覆盖
  17. DefaultFileRenamePolicy dfp = new DefaultFileRenamePolicy();
  18. //response的编码为"UTF-8",同时采用缺省的文件名冲突解决策略,实现上传,如果不加dfp重名将覆盖
  19. MultipartRequest multi = new MultipartRequest(request, saveDirectory, maxPostSize,"UTF-8",dfp);
  20. //MultipartRequest multi = new MultipartRequest(request, saveDirectory, maxPostSize,"UTF-8");
  21. //输出反馈信息
  22. Enumeration files = multi.getFileNames();
  23. while (files.hasMoreElements()) {
  24. System.err.println("ccc");
  25. String name = (String)files.nextElement();
  26. File f = multi.getFile(name);
  27. if(f!=null){
  28. String fileName = multi.getFilesystemName(name);
  29. //获取上传文件的扩展名
  30. String extName=fileName.substring(fileName.lastIndexOf(".")+1);
  31. //文件全路径
  32. String lastFileName= saveDirectory+"\\" + fileName;
  33. //获取需要转换的文件名,将路径名中的'\'替换为'/'
  34. String converfilename = saveDirectory.replaceAll("\\\\", "/")+"/"+fileName;
  35. System.out.println(converfilename);
  36. //调用转换类DocConverter,并将需要转换的文件传递给该类的构造方法
  37. DocConverter d = new DocConverter(converfilename);
  38. //调用conver方法开始转换,先执行doc2pdf()将office文件转换为pdf;再执行pdf2swf()将pdf转换为swf;
  39. d.conver();
  40. //调用getswfPath()方法,打印转换后的swf文件路径
  41. System.out.println(d.getswfPath());
  42. //生成swf相对路径,以便传递给flexpaper播放器
  43. String swfpath = "upload"+d.getswfPath().substring(d.getswfPath().lastIndexOf("/"));
  44. System.out.println(swfpath);
  45. //将相对路径放入sessio中保存
  46. session.setAttribute("swfpath", swfpath);
  47. out.println("上传的文件:"+lastFileName);
  48. out.println("文件类型"+extName);
  49. out.println("<hr>");
  50. }
  51. }
  52. %>
  53. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  54. <html>
  55. <head>
  56. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  57. <title>Insert title here</title>
  58. <style>
  59. body {margin-top:100px;background:#fff;font-family: Verdana, Tahoma;}
  60. a {color:#CE4614;}
  61. #msg-box {color: #CE4614; font-size:0.9em;text-align:center;}
  62. #msg-box .logo {border-bottom:5px solid #ECE5D9;margin-bottom:20px;padding-bottom:10px;}
  63. #msg-box .title {font-size:1.4em;font-weight:bold;margin:0 0 30px 0;}
  64. #msg-box .nav {margin-top:20px;}
  65. </style>
  66. </head>
  67. <body>
  68. <div>
  69. <form name="viewForm" id="form_swf" action="documnetView.jsp" method="POST">
  70. <input type='submit' value='预览' class='BUTTON SUBMIT'/>
  71. </form>
  72. </div>
  73. </body>
  74. </html>

(6)创建文档预览文件documentView.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%
  4. String swfFilePath=session.getAttribute("swfpath").toString();
  5. %>
  6. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  7. <html>
  8. <head>
  9. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  10. <script type="text/javascript" src="js/jquery.js"></script>
  11. <script type="text/javascript" src="js/flexpaper_flash.js"></script>
  12. <script type="text/javascript" src="js/flexpaper_flash_debug.js"></script>
  13. <style type="text/css" media="screen">
  14. html, body  { height:100%; }
  15. body { margin:0; padding:0; overflow:auto; }
  16. #flashContent { display:none; }
  17. </style>
  18. <title>文档在线预览系统</title>
  19. </head>
  20. <body>
  21. <div style="position:absolute;left:50px;top:10px;">
  22. <a id="viewerPlaceHolder" style="width:820px;height:650px;display:block"></a>
  23. <script type="text/javascript">
  24. var fp = new FlexPaperViewer(
  25. 'FlexPaperViewer',
  26. 'viewerPlaceHolder', { config : {
  27. SwfFile : escape('<%=swfFilePath%>'),
  28. Scale : 0.6,
  29. ZoomTransition : 'easeOut',
  30. ZoomTime : 0.5,
  31. ZoomInterval : 0.2,
  32. FitPageOnLoad : true,
  33. FitWidthOnLoad : false,
  34. FullScreenAsMaxWindow : false,
  35. ProgressiveLoading : false,
  36. MinZoomSize : 0.2,
  37. MaxZoomSize : 5,
  38. SearchMatchAll : false,
  39. InitViewMode : 'SinglePage',
  40. ViewModeToolsVisible : true,
  41. ZoomToolsVisible : true,
  42. NavToolsVisible : true,
  43. CursorToolsVisible : true,
  44. SearchToolsVisible : true,
  45. localeChain: 'en_US'
  46. }});
  47. </script>
  48. </div>
  49. </body>
  50. </html>

7.启动tomcat,部署当前web应用
8.地址栏输入http://localhost:8080/ctcesims/documentUpload.jsp 如下图:

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

单击预览按钮,就会生成预览界面,如下图:

9.若出现swf无法预览,请访问
http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04a.html#119065将生成swf的文件夹设置为信任文件位置。
由于时间仓促,以上只是简单示例,很多情况还需要进一步考虑!

10.如果pdf文件过大,则需要按页生成一个个swf文件,那么在使用swftools的pdf2swf命令时,对生成的swf的文件命名采用%.swf命名即可,例如pdf2swf test.pdf d:\swf\%.swf

参考资料:
http://blog.csdn.NET/iamduoluo/article/details/6727031
http://www.cnblogs.com/star-studio/archive/2011/12/09/2282411.html#2497889

Java+FlexPaper+swfTools仿百度文库文档在线预览系统设计与实现的更多相关文章

  1. 【ASP.NET 进阶】仿百度文库文档在线预览(支持格式.pdf,.doc,docx,xls,xlsx,.ppt,pptx)

    在[ASP.NET]PDF文件在线预览(类似百度文库)基础上进行了office文件到pdf文件的转换,然后在显示出来,效果如下: 问题说明: 1.请通过以下方式添加 Office COM 组件. 2. ...

  2. Java+FlexPaper+swfTools 文档在线预览demo

    1.概述 主要原理 1.通过第三方工具openoffice,将word.excel.ppt.txt等文件转换为pdf文件 2.通过swfTools将pdf文件转换成swf格式的文件 3.通过FlexP ...

  3. js仿百度文库文档上传页面的分类选择器_第二版

    仿百度文库文档上传页面的多级联动分类选择器第二版,支持在一个页面同一时候使用多个分类选择器. 此版本号把HTML,CSS,以及图片都封装到"category.js"中.解决因文件路 ...

  4. 文档在线预览开源实现方案一:OpenOffice + SwfTools + FlexPaper

    在文档在线预览方面,项目组之前使用的是Microsoft office web apps, 由于该方案需要按照微软License付费,项目经理要我预研一个文档在线预览的开源实现方案.仔细钻入该需求发现 ...

  5. Java实现word文档在线预览,读取office文件

    想要实现word或者其他office文件的在线预览,大部分都是用的两种方式,一种是使用openoffice转换之后再通过其他插件预览,还有一种方式就是通过POI读取内容然后预览. 一.使用openof ...

  6. java 实现word文档在线预览

    一.准备工具 1.通过第三方工具openoffice,将word.excel.ppt.txt等文件转换为pdf文件 下载地址:http://www.openoffice.org/download/in ...

  7. 最好用的js前端框架、组件、文档在线预览插件

    这里收集的都是个人认为比较好的js框架.组件 js前端ui框架 此处列举出个人认为最好的几个框架(排序即排名),现在好点的框架商用都需要付费,以下几个也不例外,但是由于组件丰富,都可以作为企业应用的完 ...

  8. Print2flash在.NET(C#)64位中的使用,即文档在线预览

    转:http://www.cnblogs.com/flowwind/p/3411106.html Print2flash在.NET(C#)中的使用,即文档在线预览   office文档(word,ex ...

  9. asp.net如何实现word文档在线预览

    原文:asp.net如何实现word文档在线预览 实现方式:office文档转html,再在浏览器里面在线浏览 1.首先引入com组件中office库,然后在程序集扩展中引入word的dll 2.将M ...

随机推荐

  1. GNU make规则的命令④书写命令

    命令回显 通常, make 在执行命令行之前会把要执行的命令行输出到标准输出设备.我们称之为"回显",就好像我们在 shell 环境下输入命令执行时一样. 如果规则的命令行以字符& ...

  2. 调用newtonsoft.json反序列出错

    调用newtonsoft.json反序列出错: Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current J ...

  3. Stunnel服务端

    Stunnel on Debian GNU/Linux 6 (squeeze) 传统的POP3, SMTP, Samba等服务,都是不加密的协议(即在网络上明文传输数据),通过stunnel,可以将访 ...

  4. javascript中在链表中向前(向后)移动n个节点

     1.概念 在链表上移动n个节点,我第一眼看到这个需求的时候首先想到的是当前节点.使用这个当前节点作为参考来移动,没有这个当前节点的话是没有办法在链表上前进和后退的.初始化定义链表的时候定义一个当前节 ...

  5. 单机多实例Tomcat部署

    单机单用户基础上, 如何运行多个tomcat实例. 首先是tomcat的目录结构 bin    – 包含所有运行tomcat的二进制和脚本文件 lib     – 包含tomcat使用的所有共享库 c ...

  6. Java:对象的强、软、弱和虚引用

    1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK ...

  7. Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例

    概要 这一章,我们对HashMap进行学习.我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.内容包括:第1部分 HashMap介绍第2部分 HashMa ...

  8. ASP.NET MVC铵钮Click后下载文件

    本篇Insus.NET练习的是FilePathResult和FileStreamResult操作.本篇也算是<如何把Json格式字符写进text文件中>http://www.cnblogs ...

  9. Palindrome Linked List

    Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...

  10. web—第四章css&第五章

     web—第四章css&第五章 终于迎接等待已久的CSS,在没学这个之前,我们只会用一点img,查一点小图片,或者是用style改一下颜色,而且比较麻烦.现在多了个css在文件夹在创建一个cs ...