笔者最近在给客户开发文档管理系统时,客户要求上传到管理系统的文档(包括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. windows下 git配置ssh

    1. 打开 git bash 2. cd ~/.ssh 3. ssh-genkey (一致next),  会生成 id_rsa (密钥); id_rsa.pub(公钥) 4. 用记事本打开 id_rs ...

  2. 修复垂直滑动RecyclerView嵌套水平滑动RecyclerView水平滑动不灵敏问题

    在 Android 应用中,大部分情况下都会使用一个垂直滚动的 View 来显示内容(比如 ListView.RecyclerView 等).但是有时候你还希望垂直滚动的View 里面的内容可以水平滚 ...

  3. HTML 学习笔记(链接)

    HTML链接 超链接可以是一个字,一个词,或者一组词,也可以是一幅图像,您可以点击这些内容来跳转到新的文档或者当前文档中的某个部分. 当您把鼠标指针移动到网页中的某个链接上时,箭头会变为一只小手. 我 ...

  4. githup上传代码

    把自己本地东西上传到GitHup上. 本文内容来自于http://blog.csdn.net/yuanzichao/article/details/44922593 1.安装msysgit和Torto ...

  5. Java7并发编程实战(一) 线程的中断

    控制线程中断的方法一般常规是定义一个布尔值,然后while(布尔值) 去执行,当想停止该线程时候,把布尔值设为false. 这里我们来看第二种,Interrupt 该例子模拟一个线程从1打印到10,然 ...

  6. Use Dapper ORM With ASP.NET Core

    Dapper.NET is not just another ORM tool, it's considered as the king of ORM. Because it's fast, easy ...

  7. APP架子迁移指南(一)

    搭架子是脑垂体在放烟花 俗话说吃多少饭,走多少路,上学的时候捧着<设计模式>就想睡觉,现在轮子看得多了,自然有心领神会之感.搭架子就像谈哲学,如高山流水,遇弯则急.遇潭则深.我印象最深的是 ...

  8. bootstrap的popover插件在focus模式时在Safari浏览器无法使用的bug解决方案

    前言 最近在使用bootstrap的popover插件,效果如下: popover插件的focus模式时表现为当点击按钮时弹出浮动层,在点击浮动层外的任何一处,都隐藏浮动层. 但是在mac下的Safa ...

  9. .Net分布式异常报警系统-简介

    系统简介 分布式异常报警系统就是收集系统运行过程中产生的未处理异常,检查系统运行的状态,并将异常信息统一发送到服务端,由服务端将信息通知到相关的责任人.  问题 我们在项目开发中可能遇到以下几个问题: ...

  10. word2vec 实践

    关于word2vec,这方面无论中英文的参考资料相当的多,英文方面既可以看官方推荐的论文,也可以看gensim作者Radim Řehůřek博士写得一些文章.而中文方面,推荐 @licstar的< ...