最近做了一个我的文库的项目,需要用到在线预览文档,上网查了很多资料,终于把它搞定,在此分享一下,我尽量会写的很详细,总体思路和网上的都差不多,就是一些细节,如果没有考虑到,效果就不会出来。

1,首先,我们需要安装一个openoffice ,这个资源我会上传上去,安装好之后要记住安装路径,因为要在windows的cmd命令下开启openoffice的服务,这个在每次重新启动windows的时候都要开启一遍,当然我这只是在windows上开发的,项目部署服务器上就不用这么麻烦了,先进入openoffice的安装目录下的/program目录下,直接输入命令:

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

这样我们就开启了openoffice的服务,

2,安装swfTools(安装到 D:\Program Files)swftools作用是将pdf转换为swf文件 这个工具我也会上传上去,这些工具的版本都是我实验过的,所以不会出现问题
以便flexpaper播放。下载地址:http://www.swftools.org/download.html   这个安装路径也要记着,java类中要调用本机安装的这个工具,具体看java那个转换类


3,
下载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包


4,下面我们就开始转换文档了,这里需要补充一下,我们在网页上看到预览的都是.swf格式的,普通的office文档或者txt格式的需要先转换为pdf格式,然后再转换为swf格式进行预览,那么我们就需要写一个java类,调用openoffice的服务来把文档转换为pdf格式的文件,这里我们先利用框架的上传功能上传要转换的文件,我这里用的是上structs的上传工具,相信接触过ssh框架的都会用,


这个是文档转成pdf的java类

package com.zy.library.util;
 import java.io.BufferedInputStream;  
 import java.io.File;  
 import java.io.IOException;  
 import java.io.InputStream;    

 import com.artofsolving.jodconverter.DocumentConverter;
 import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
 import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
 import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;

 public class DocConverter {
     private static final int environment = 1;// 环境 1:windows 2:linux  
     private String fileString;// (只涉及pdf2swf路径问题)  
     private String outputPath = "";// 输入路径 ,如果不设置就输出在默认的位置  
     private String fileName;  
     private File pdfFile;  
     private File swfFile;  
     private File docFile; 

     public DocConverter(String fileString) {  
         ini(fileString);  
     }  
     /** 
      * 重新设置file 
      *  
      * @param fileString 
      */  
     public void setFile(String fileString) {  
         ini(fileString);  
     }  

     /** 
      * 初始化 
      *  
      * @param fileString 
      */  
     private void ini(String fileString) {  
         this.fileString = fileString;  
         fileName = fileString.substring(0, fileString.lastIndexOf("."));  
         docFile = new File(fileString);  
         pdfFile = new File(fileName + ".pdf");  
         swfFile = new File(fileName + ".swf");  
     }  

     /** 
      * 转为PDF 
      *  
      * @param file 
      */  
     private void doc2pdf() throws Exception {  
         if (docFile.exists()) {  
             if (!pdfFile.exists()) {  
                 OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);  
                 try {  
                     connection.connect();  
                     DocumentConverter converter = new OpenOfficeDocumentConverter(connection);  
                     converter.convert(docFile, pdfFile);  
                     // close the connection  
                     connection.disconnect();  
                     System.out.println("****pdf转换成功,PDF输出:" + pdfFile.getPath()+ "****");  
                 } catch (java.net.ConnectException e) {  
                     e.printStackTrace();  
                     System.out.println("****swf转换器异常,openoffice服务未启动!****");  
                     throw e;  
                 } catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) {  
                     e.printStackTrace();  
                     System.out.println("****swf转换器异常,读取转换文件失败****");  
                     throw e;  
                 } catch (Exception e) {  
                     e.printStackTrace();  
                     throw e;  
                 }  
             } else {  
                 System.out.println("****已经转换为pdf,不需要再进行转化****");  
             }  
         } else {  
             System.out.println("****swf转换器异常,需要转换的文档不存在,无法转换****");  
         }  
     }  
     /** 
      * 转换成 swf 
      */  
     @SuppressWarnings("unused")  
     private void pdf2swf() throws Exception {  
         Runtime r = Runtime.getRuntime();  
         if (!swfFile.exists()) {  
             if (pdfFile.exists()) {  
                 if (environment == 1) {// windows环境处理  
                     try {  
                         /*Process p = r.exec("D:/Program File/pdf2swf.exe "+ pdfFile.getPath() + " -o "+ swfFile.getPath() + " -T 9"); */ //这是网上写的命令,但是出不来效果,
                         Process p = r.exec("D:/Program File/pdf2swf.exe"+" -t "+ pdfFile.getPath() +" -s flashversion=9"+ " -o "+ swfFile.getPath());//这个是我修改过的,修改了版本问题,
                         System.out.print(loadStream(p.getInputStream()));  
                         System.err.print(loadStream(p.getErrorStream()));  
                         System.out.print(loadStream(p.getInputStream()));  
                         System.err.println("****swf转换成功,文件输出:"  
                                 + swfFile.getPath());  
                         if (pdfFile.exists()) {  
                             pdfFile.delete();  
                         }  

                     } catch (IOException e) {  
                         e.printStackTrace();  
                         throw e;  
                     }  
                 } else if (environment == 2) {// linux环境处理  
                     try {  
                         Process p = r.exec("pdf2swf " + pdfFile.getPath()  
                                 + " -o " + swfFile.getPath() + " -T 9");  
                         System.out.print(loadStream(p.getInputStream()));  
                         System.err.print(loadStream(p.getErrorStream()));  
                         System.err.println("****swf转换成功,文件输出:"  
                                 + swfFile.getPath() + "****");  
                         if (pdfFile.exists()) {  
                             pdfFile.delete();  
                         }  
                     } catch (Exception e) {  
                         e.printStackTrace();  
                         throw e;  
                     }  
                 }  
             } else {  
                 System.out.println("****pdf不存在,无法转换****");  
             }  
         } else {  
             System.out.println("****swf已经存在不需要转换****");  
         }  
     }  

     static String loadStream(InputStream in) throws IOException {  

         int ptr = 0;  
         in = new BufferedInputStream(in);  
         StringBuffer buffer = new StringBuffer();  

         while ((ptr = in.read()) != -1) {  
             buffer.append((char) ptr);  
         }  

         return buffer.toString();  
     }  
     /** 
      * 转换主方法 
      */  
     @SuppressWarnings("unused")  
     public boolean conver() {  

         if (swfFile.exists()) {  
             System.out.println("****swf转换器开始工作,该文件已经转换为swf****");  
             return true;  
         }  

         if (environment == 1) {  
             System.out.println("****swf转换器开始工作,当前设置运行环境windows****");  
         } else {  
             System.out.println("****swf转换器开始工作,当前设置运行环境linux****");  
         }  
         try {  
             doc2pdf();  
             pdf2swf();  
         } catch (Exception e) {  
             e.printStackTrace();  
             return false;  
         }  

         if (swfFile.exists()) {  
             return true;  
         } else {  
             return false;  
         }  
     }  
     /** 
      * 返回文件路径 
      *  
      * @param s 
      */  
     public String getswfPath() {  
         if (swfFile.exists()) {  
             String tempString = swfFile.getPath();  
             tempString = tempString.replaceAll("\\\\", "/");  
             return tempString;  
         } else {  
             return "";  
         }  

     }  
     /** 
      * 设置输出路径 
      */  
     public void setOutputPath(String outputPath) {  
         this.outputPath = outputPath;  
         if (!outputPath.equals("")) {  
             String realName = fileName.substring(fileName.lastIndexOf("/"),  
                     fileName.lastIndexOf("."));  
             if (outputPath.charAt(outputPath.length()) == '/') {  
                 swfFile = new File(outputPath + realName + ".swf");  
             } else {  
                 swfFile = new File(outputPath + realName + ".swf");  
             }  
         }  
     }  

  

 }



这个是上传的页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>

 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

 <html>

 <head>

 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

 <title>文档在线预览系统</title>
 <style>
 body {
     margin-top: 100px;
     background: #fff;
     font-family: Verdana, Tahoma;
 }

 a {
     color: #CE4614;
 }

 #msg-box {
     color: #CE4614;
     font-size: 0.9em;
     text-align: center;
 }

 #msg-box .logo {
     border-bottom: 5px solid #C5C1AA;
     margin-bottom: 20px;
     padding-bottom: 10px;
 }

 #msg-box .title {
     font-size: 1.4em;
     font-weight: bold;
     margin: 0 0 30px 0;
 }

 #msg-box .nav {
     margin-top: 20px;
 }
 </style>

 </head>

 <body>

     <div id="msg-box">

         <form name="form1" method="post" enctype="multipart/form-data"
             action="up.action">

             <div class="title"> 请上传要处理的文件,过程可能需要几分钟,请稍候片刻。</div>

             <p>
                 <input name="file1" type="file">
             </p>

             <p>
                 <input type="submit" name="Submit" value="上传">
             </p>

         </form>

     </div>

 </body>

 </html>



这个是上传的action

package com.zy.library.hadoop.action;

 import java.io.File;

 import org.apache.commons.io.FileUtils;
 import org.apache.struts2.ServletActionContext;

 import com.zy.library.core.action.BaseAction;
 import com.zy.library.hadoop.mapreduce.collect.LibraryCollectThread;
 import com.zy.library.hadoop.util.HadoopUtil;
 import com.zy.library.util.Constants;
 import com.zy.library.util.DocConverter;
 import com.zy.library.util.PropUtil;

 public class UploadAction extends BaseAction {

     private String libraryContentType;
     public File file1;
     public String file1FileName;
     private String path;
     public String upload() throws Exception{
         
         String filename = HadoopUtil.upload(file1,file1FileName);//返回的是上传文件的原文件名
         setMessage(getUploadJson(filename,file1FileName));
         
         String saveDirectory =ServletActionContext.getServletContext().getRealPath("/upload123");
         System.out.println(saveDirectory);
         String realFilePath=saveDirectory+"\\"+file1FileName;//文件全路径
         System.out.println(realFilePath);
         File file=new File(realFilePath);
         if(!file.getParentFile().exists()){
                 File pFile=new File(saveDirectory);
         }
         FileUtils.copyFile(file1, file);
         String exename=file1FileName.substring(file1FileName.lastIndexOf(".")+1);//获取后缀名
         System.out.println(exename);
         //获取需要转换的文件名,将路径名中的'\'替换为'/'  
         String converFilePath=saveDirectory.replace("\\", "/")+"/"+file1FileName;
         System.out.println(converFilePath);
         //调用转换类DocConverter,并将需要转换的文件传递给该类的构造方法 
         DocConverter d = new DocConverter(converFilePath);
         //调用conver方法开始转换,先执行doc2pdf()将office文件转换为pdf;再执行pdf2swf()将pdf转换为swf;  
         d.conver();
         file.delete();
         //调用getswfPath()方法,打印转换后的swf文件路径  
         System.out.println(d.getswfPath());
         String spath="/upload123/"+file1FileName.substring(0,file1FileName.lastIndexOf(".")+1)+"swf";
         setPath(spath);
         System.out.println("本地转换成功! 路径:"+path);
         
         return "success";
     }

     
     
     public File getFile1() {
         return file1;
     }



     public void setFile1(File file1) {
         this.file1 = file1;
     }



     public String getFile1FileName() {
         return file1FileName;
     }



     public void setFile1FileName(String file1FileName) {
         this.file1FileName = file1FileName;
     }



     public String getPath() {
         return path;
     }



     public void setPath(String path) {
         this.path = path;
     }


     public String getLibraryContentType() {
         return libraryContentType;
     }

     public void setLibraryContentType(String libraryContentType) {
         this.libraryContentType = libraryContentType;
     }
     
 }


5,生成swf格式的文件后然后我们就可以用flexpaper预览了

下载flexpaper,下载地址:http://flexpaper.devaldi.com/download/

这个包我也上传了,可以直接拷到项目的WebContent下(我用的是eclipse),

示例展示jsp

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <!-- FlexPaperViewer flash version debug template -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
 <title>FlexPaper</title>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <style type="text/css" media="screen">
 html, body {
     height: 100%;
 }

 body {
     margin: 0;
     padding: 0;
     overflow: auto;
 }

 #flashContent {
     display: none;
 }
 </style>

 <script type="text/javascript" src="../js/flexpaper_flash_debug.js"></script>
 <script type="text/javascript" src="../js/jquery.js"></script>

 </head>
 <body>
     <div style="position: absolute; left: 10px; top: 10px;">
         <a id="viewerPlaceHolder"
             style="width: 680px; height: 480px; display: block"></a>

         <script type="text/javascript"> 
                 var fp = new FlexPaperViewer(    
                          '../FlexPaperViewer',
                          'viewerPlaceHolder', { config : {
                          SwfFile :escape('/library123/upload123/jjjj.swf'),
                          Scale : 0.6, 
                          ZoomTransition : 'easeOut',
                          ZoomTime : 0.5,
                          ZoomInterval : 0.2,
                          FitPageOnLoad : false,
                          FitWidthOnLoad : false,
                          FullScreenAsMaxWindow : false,
                          ProgressiveLoading : false,
                          MinZoomSize : 0.2,
                          MaxZoomSize : 5,
                          SearchMatchAll : false,
                          InitViewMode : 'Portrait',
                          
                          ViewModeToolsVisible : true,
                          ZoomToolsVisible : true,
                          NavToolsVisible : true,
                          CursorToolsVisible : true,
                          SearchToolsVisible : true,
                           
                            localeChain: 'en_US'
                          }});
             </script>
     </div>

 </body>
 </html>



用的时候只需要改变这个:SwfFile :escape('/library123/upload123/jjjj.swf')   里面的路径,library123是我的项目名,upload123是我设置的上传后的文件夹,这个是要展示的swf

其实这些小细节让我弄了好长时间,所以我特别要提一下。

我上传的文件中openoffice文件夹中的有两个exe文件,其中下面的那个是openoffice的中文语言包,最好也安装一下,因为有时候txt转pdf会出现中文乱码