java实现附件预览(openoffice+swftools+flexpaper)

栏目: Java · 发布时间: 6年前

内容简介:java实现附件预览(openoffice+swftools+flexpaper)

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

已经支持加载中文文件名

代码下载

1.概述

主要原理

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

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

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

java实现附件预览(openoffice+swftools+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

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

官网启动服务截图如下:

java实现附件预览(openoffice+swftools+flexpaper)

本地截图:

java实现附件预览(openoffice+swftools+flexpaper)

3.开发过程

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

java实现附件预览(openoffice+swftools+flexpaper)

注:需创建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  lastFileNamesaveDirectory +"\\" + 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.     }

6.部署发布

启动tomcat,部署当前web应用

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

java实现附件预览(openoffice+swftools+flexpaper)

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

java实现附件预览(openoffice+swftools+flexpaper)

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

java实现附件预览(openoffice+swftools+flexpaper)

4.常见问题

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

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

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

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

  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文件,网上也有下载


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法导论(原书第2版)

算法导论(原书第2版)

[美] Thomas H.Cormen、Charles E.Leiserson、Ronald L.Rivest、Clifford Stein / 潘金贵 等 / 机械工业出版社 / 2006-9 / 85.00元

这本书深入浅出,全面地介绍了计算机算法。对每一个算法的分析既易于理解又十分有趣,并保持了数学严谨性。本书的设计目标全面,适用于多种用途。涵盖的内容有:算法在计算中的作用,概率分析和随机算法的介绍。书中专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。此书还介绍了对强连通子图......一起来看看 《算法导论(原书第2版)》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具