先附上本人参考的文章,基于的 flexpaper版本 为 1.5,本人由于使用的是 2.1.9 ,故之后说明:

已经支持加载中文文件名

代码下载

1.概述

主要原理

1.通过第三方工具openoffice,将word、excel、ppt、txt等文件转换为pdf文件

2.通过swfTools将pdf文件转换成swf格式的文件

3.通过FlexPaper文档组件在页面上进行展示

2.安装包下载

1.openoffice是Apache下的一个开放免费的文字处理软件

下载地址:Apache oppenoffice 官网下载 版本-3.4.1

2.SWFTools是一组用来处理Flash的swf文件的工具包,我们使用它将pdf文件转成swf文件!

下载地址:SWFTools官网下载 swftools-2013-04-09-1007.exe

3.FlexPaper是一个开源轻量级的在浏览器上显示各种文档的组件

下载地址:FlexPaper官网下载 版本1.5.1

4.JODConverter一个Java的OpenDocument 文件转换器,在此我们只用到它的jar包

下载地址:JODCConverter下载

3.安装文件

1.将所下载的文件(JODConverter除外)进行安装,盘符可随自己设定!需要注意的是在openoffice安装完成后,当我们使用它时,需将它的服务打开。在次我们需要以命令的方式打开:

打开dos窗口,进入openoffice安装盘符,输入以下代码来启动服务:

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

注意最后一个命令前边的‘—’,可不要写错!服务起不来,项目可是继续不下去的哦.

官网启动服务截图如下:

本地截图:

3.开发过程

1.新建项目,将flexpaper文件中的js文件夹(包含了flexpaper_flash_debug.js,flexpaper_flash.js,jquery.js,这三个js文件主要是预览swf文件的插件)拷贝至网站根目录;将FlexPaperViewer.swf拷贝至网站根目录下(该文件主要是用在网页中播放swf文件的播放器),目录结构如下图:

注:需创建upload文件夹

2.创建fileUpload.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>

3.创建转换页docUploadConvertAction.jsp

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

4.创建查看页documentView.jsp

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

5.创建转换类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. }

6.部署发布

启动tomcat,部署当前web应用

地址栏输入http://localhost:8080/ctcesims/documentUpload.jsp 如下图:

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

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

4.常见问题

若出现swf无法预览,请访问

http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04a.html#119065

将生成swf的文件夹设置为信任文件位置。

以下给出 flexpaper 2.1.9 的不同之处:初始化方式改变,若文件目录与项目目录不在一起,可将附件目录在服务器中设置为虚拟目录

[html]view plaincopy
  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.min.js"></script>
  11. <script type="text/javascript" src="js/flexpaper.js"></script>
  12. <script type="text/javascript" src="js/flexpaper_handlers.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. <div id="documentViewer" class="flexpaper_viewer" style="width:770px;height:500px"></div>
  23. <script type="text/javascript">
  24. var startDocument = "Paper";
  25. $('#documentViewer').FlexPaperViewer(
  26. { config : {
  27. SWFFile : 'upload/ddd3.swf',
  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 : 'Portrait',
  40. RenderingOrder : 'flash',
  41. StartAtPage : '',
  42. ViewModeToolsVisible : true,
  43. ZoomToolsVisible : true,
  44. NavToolsVisible : true,
  45. CursorToolsVisible : true,
  46. SearchToolsVisible : true,
  47. WMode : 'window',
  48. localeChain: 'en_US'
  49. }}
  50. );
  51. </script>
  52. </div>
  53. </body>
  54. </html>

最后,若需要去除打印功能及logo,可重新编译 flexpaper 的 flash文件,网上也有下载

FlexPaper参数
引自:http://blog.csdn.net/z69183787/article/details/17468039

java实现附件预览(openoffice+swftools+flexpaper)相关推荐

  1. java 调用 swf 文件上传_java SpringMvc 实现文件在线预览(openoffice+swftools+flexpaper)

    项目需求:服务器接受的文件当下只能下载之后才能浏览内容,现需要后台能在线浏览到文件内容,避免繁琐无用文件下载操作. 通过几天网上资料搜索,目前免费的在线预览开发技术使用最多还是(openoffice+ ...

  2. java使用 openoffice+swftools+flexpaper 在window下完成简单的文件预览

    1.转载自 : java实现附件预览(openoffice+swftools+flexpaper) 1.概述 主要原理 1.通过第三方工具openoffice,将word.excel.ppt.txt等 ...

  3. Java基于springmvc实现文档预览(openoffice+swftools+flexpaper)(排坑记录)

    Java基于springmvc实现文档预览(openoffice+swftools+flexpaper)(排坑记录) 本文代码来源已在末尾标注,写本文的目的在于记录自己在实践过程中遇到的问题及解决方案 ...

  4. java实现文件预览(Office转PDF)

    一.首先下载安装openOffice软件,下载地址:http://www.openoffice.org/download/index.html 当然,下载速度特别慢,下面是百度网盘地址. 链接:htt ...

  5. Java实现在线预览功能

    java实现在线预览功能,需要用到  jacob.dll jacob.jar   预览pdf所需js  pdfobject.min.js 将上传文件转为pdf保存. <divclass=&quo ...

  6. 关于surface安装foxmail附件预览失效解决方案

    surface安装foxmail附件预览失效/没反应 说在前面的:为了支持与体验微软,买了一台surface,确实刷新了对笔记本电脑的认知,轻薄,触屏.键盘磁吸这才是正儿八经的的体验win10,同时已 ...

  7. 前端手把手教你js实现附件预览和下载得功能实现

    在项目中,经常会遇到做项目关于实现附件预览和下载得功能,那么怎么来实现呢: 在学习之前,首先会应用到Blob相关得知识点: 那么blob到底是什么呢 先让我们看看官方关于blob得介绍 文章来自于Bl ...

  8. odoo14 ir.attachment附件上传与附件预览功能

    一.附件上传 这里收集了三种附件上传方式: 1.odoo自带附件上传 安装odoo自带的附件列出及文档模块 这样在编辑界面就可以看到附件上传按钮了(odoo14自己测试没成功,暂时不知道原因) 2. ...

  9. 附件预览(可用于图片、word文档、pdf、.xls表格等预览)

    一.fileView.vue文件里的完整代码(fileView.vue即为抽离出的附件预览组件) 1.html部分 <template><div class="docCon ...

最新文章

  1. pytorch MaxUnpool2d
  2. 传统公司部署OpenStack(t版)简易介绍(六)——neutron模块部署
  3. MFC 网络编程小结
  4. html广告条效果,css3炫酷网站banner广告动画特效
  5. 调用android自带的下载功能,进度在消息通知栏上显示
  6. NLP︱高级词向量表达(二)——FastText(简述、学习笔记)
  7. 各国“未雨绸缪”致网络安全陷入困境 安全防御诱发“防御性入侵”
  8. 打造世界领先的智能运维大脑,必示科技获顺为资本领投数千万A轮融资
  9. ES6变量的解构赋值注意点及用途(补充)
  10. Android NDK开发之旅12 JNI JNI引用
  11. java架构专题涨价_关于单量预测和动态定价的一些思考
  12. HDU Problem 1285 确定比赛名次【拓扑排序】
  13. JAVA实现邮件发送
  14. C#导出EXCEL没有网格线的解决方法
  15. oracle复杂sql 分页,oracle sql 分页
  16. 三、向量的加减乘除法
  17. Solaris中文FAQ
  18. 混沌工程——各大厂实践分享汇总(上篇)
  19. 如何利用Syncthing+蒲公英快速实现异地文件同步
  20. Codeforces Round #708 (Div. 2)B. M-arrays

热门文章

  1. 基于STM32F103单片机的智能扫地机器人 循迹避障车 原理图PCB设计
  2. Java系统线上生产问题排查一把梭
  3. 人工智能的发展趋势综述
  4. scrapy 爬取淘宝商品评论信息
  5. 2021年上半年软件设计师考试评估解析
  6. 爬虫基础知识记录の二
  7. 基于bs架构的办公自动化系统毕业设计
  8. linux字体渲染比不上windows,各位是怎么解决字体渲染问题的
  9. O-RAN,真的会成功吗?[转载]
  10. element ui 前台模板_一个干净优雅的 Element UI Admin 模板