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

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

内容简介: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文件,网上也有下载


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

查看所有标签

猜你喜欢:

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

Discrete Mathematics and Its Applications

Discrete Mathematics and Its Applications

Kenneth H Rosen / McGraw-Hill Science/Engineering/Math / 2003-04-22 / USD 132.81

Discrete Mathematics and its Applications is a focused introduction to the primary themes in a discrete mathematics course, as introduced through extensive applications, expansive discussion, and deta......一起来看看 《Discrete Mathematics and Its Applications》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具