java實現附件預覽(openoffice+swftools+flexpaper)


先附上本人參考的文章,基於的 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   
17 </head>  
18 <body>  
19 <div id="msg-box">  
20     <form name="form1"  method="post" enctype="multipart/form-data" action="docUploadConvertAction.jsp">  
21         <div class="title">  
22             請上傳要處理的文件,過程可能需要幾分鍾,請稍候片刻。  
23         </div>  
24         <p>  
25             <input name="file1" type="file">  
26         </p>  
27         <p>  
28             <input type="submit" name="Submit" value="上傳">  
29         </p>  
30     </form >  
31 </div>  
32 </body>  
33 </html>  

3.創建轉換頁docUploadConvertAction.jsp

 1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
 2   
 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 %>  
54 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
55 <html>  
56 <head>  
57 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
58 <title>Insert title here</title>  
59 <style>  
60     body {margin-top:100px;background:#fff;font-family: Verdana, Tahoma;}  
61     a {color:#CE4614;}  
62     #msg-box {color: #CE4614; font-size:0.9em;text-align:center;}  
63     #msg-box .logo {border-bottom:5px solid #ECE5D9;margin-bottom:20px;padding-bottom:10px;}  
64     #msg-box .title {font-size:1.4em;font-weight:bold;margin:0 0 30px 0;}  
65     #msg-box .nav {margin-top:20px;}  
66 </style>  
67 </head>  
68 <body>  
69     <div>  
70         <form name="viewForm" id="form_swf" action="documentView.jsp" method="POST">  
71             <input type='submit' value='預覽' class='BUTTON SUBMIT'/>  
72         </form>  
73     </div>  
74 </body>  
75 </html>  

創建查看頁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   
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               
24             <script type="text/javascript">   
25                 var fp = new FlexPaperViewer(     
26                          'FlexPaperViewer',  
27                          'viewerPlaceHolder', { config : {  
28                          SwfFile : escape('<%=swfFilePath%>'),  
29                          Scale : 0.6,   
30                          ZoomTransition : 'easeOut',  
31                          ZoomTime : 0.5,  
32                          ZoomInterval : 0.2,  
33                          FitPageOnLoad : true,  
34                          FitWidthOnLoad : false,  
35                          FullScreenAsMaxWindow : false,  
36                          ProgressiveLoading : false,  
37                          MinZoomSize : 0.2,  
38                          MaxZoomSize : 5,  
39                          SearchMatchAll : false,  
40                          InitViewMode : 'SinglePage',  
41                            
42                          ViewModeToolsVisible : true,  
43                          ZoomToolsVisible : true,  
44                          NavToolsVisible : true,  
45                          CursorToolsVisible : true,  
46                          SearchToolsVisible : true,  
47                           
48                          localeChain: 'en_US'  
49                          }});  
50             </script>              
51         </div>  
52 </body>  
53 </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   
  7 import com.artofsolving.jodconverter.DocumentConverter;  
  8 import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;  
  9 import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;  
 10 import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;  
 11   
 12 /** 
 13  * doc docx格式轉換 
 14  */  
 15 public class DocConverter {  
 16     private static final int environment = 1;// 環境 1:windows 2:linux  
 17     private String fileString;// (只涉及pdf2swf路徑問題)  
 18     private String outputPath = "";// 輸入路徑 ,如果不設置就輸出在默認的位置  
 19     private String fileName;  
 20     private File pdfFile;  
 21     private File swfFile;  
 22     private File docFile;  
 23       
 24     public DocConverter(String fileString) {  
 25         ini(fileString);  
 26     }  
 27   
 28     /** 
 29      * 重新設置file 
 30      *  
 31      * @param fileString 
 32      */  
 33     public void setFile(String fileString) {  
 34         ini(fileString);  
 35     }  
 36   
 37     /** 
 38      * 初始化 
 39      *  
 40      * @param fileString 
 41      */  
 42     private void ini(String fileString) {  
 43         this.fileString = fileString;  
 44         fileName = fileString.substring(0, fileString.lastIndexOf("."));  
 45         docFile = new File(fileString);  
 46         pdfFile = new File(fileName + ".pdf");  
 47         swfFile = new File(fileName + ".swf");  
 48     }  
 49       
 50     /** 
 51      * 轉為PDF 
 52      *  
 53      * @param file 
 54      */  
 55     private void doc2pdf() throws Exception {  
 56         if (docFile.exists()) {  
 57             if (!pdfFile.exists()) {  
 58                 OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);  
 59                 try {  
 60                     connection.connect();  
 61                     DocumentConverter converter = new OpenOfficeDocumentConverter(connection);  
 62                     converter.convert(docFile, pdfFile);  
 63                     // close the connection  
 64                     connection.disconnect();  
 65                     System.out.println("****pdf轉換成功,PDF輸出:" + pdfFile.getPath()+ "****");  
 66                 } catch (java.net.ConnectException e) {  
 67                     e.printStackTrace();  
 68                     System.out.println("****swf轉換器異常,openoffice服務未啟動!****");  
 69                     throw e;  
 70                 } catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) {  
 71                     e.printStackTrace();  
 72                     System.out.println("****swf轉換器異常,讀取轉換文件失敗****");  
 73                     throw e;  
 74                 } catch (Exception e) {  
 75                     e.printStackTrace();  
 76                     throw e;  
 77                 }  
 78             } else {  
 79                 System.out.println("****已經轉換為pdf,不需要再進行轉化****");  
 80             }  
 81         } else {  
 82             System.out.println("****swf轉換器異常,需要轉換的文檔不存在,無法轉換****");  
 83         }  
 84     }  
 85       
 86     /** 
 87      * 轉換成 swf 
 88      */  
 89     @SuppressWarnings("unused")  
 90     private void pdf2swf() throws Exception {  
 91         Runtime r = Runtime.getRuntime();  
 92         if (!swfFile.exists()) {  
 93             if (pdfFile.exists()) {  
 94                 if (environment == 1) {// windows環境處理  
 95                     try {  
 96                         Process p = r.exec("D:/Program Files/SWFTools/pdf2swf.exe "+ pdfFile.getPath() + " -o "+ swfFile.getPath() + " -T 9");  
 97                         System.out.print(loadStream(p.getInputStream()));  
 98                         System.err.print(loadStream(p.getErrorStream()));  
 99                         System.out.print(loadStream(p.getInputStream()));  
100                         System.err.println("****swf轉換成功,文件輸出:"  
101                                 + swfFile.getPath() + "****");  
102                         if (pdfFile.exists()) {  
103                             pdfFile.delete();  
104                         }  
105   
106                     } catch (IOException e) {  
107                         e.printStackTrace();  
108                         throw e;  
109                     }  
110                 } else if (environment == 2) {// linux環境處理  
111                     try {  
112                         Process p = r.exec("pdf2swf " + pdfFile.getPath()  
113                                 + " -o " + swfFile.getPath() + " -T 9");  
114                         System.out.print(loadStream(p.getInputStream()));  
115                         System.err.print(loadStream(p.getErrorStream()));  
116                         System.err.println("****swf轉換成功,文件輸出:"  
117                                 + swfFile.getPath() + "****");  
118                         if (pdfFile.exists()) {  
119                             pdfFile.delete();  
120                         }  
121                     } catch (Exception e) {  
122                         e.printStackTrace();  
123                         throw e;  
124                     }  
125                 }  
126             } else {  
127                 System.out.println("****pdf不存在,無法轉換****");  
128             }  
129         } else {  
130             System.out.println("****swf已經存在不需要轉換****");  
131         }  
132     }  
133   
134     static String loadStream(InputStream in) throws IOException {  
135   
136         int ptr = 0;  
137         in = new BufferedInputStream(in);  
138         StringBuffer buffer = new StringBuffer();  
139   
140         while ((ptr = in.read()) != -1) {  
141             buffer.append((char) ptr);  
142         }  
143   
144         return buffer.toString();  
145     }  
146     /** 
147      * 轉換主方法 
148      */  
149     @SuppressWarnings("unused")  
150     public boolean conver() {  
151   
152         if (swfFile.exists()) {  
153             System.out.println("****swf轉換器開始工作,該文件已經轉換為swf****");  
154             return true;  
155         }  
156   
157         if (environment == 1) {  
158             System.out.println("****swf轉換器開始工作,當前設置運行環境windows****");  
159         } else {  
160             System.out.println("****swf轉換器開始工作,當前設置運行環境linux****");  
161         }  
162         try {  
163             doc2pdf();  
164             pdf2swf();  
165         } catch (Exception e) {  
166             e.printStackTrace();  
167             return false;  
168         }  
169   
170         if (swfFile.exists()) {  
171             return true;  
172         } else {  
173             return false;  
174         }  
175     }  
176   
177     /** 
178      * 返回文件路徑 
179      *  
180      * @param s 
181      */  
182     public String getswfPath() {  
183         if (swfFile.exists()) {  
184             String tempString = swfFile.getPath();  
185             tempString = tempString.replaceAll("\\\\", "/");  
186             return tempString;  
187         } else {  
188             return "";  
189         }  
190   
191     }  
192     /** 
193      * 設置輸出路徑 
194      */  
195     public void setOutputPath(String outputPath) {  
196         this.outputPath = outputPath;  
197         if (!outputPath.equals("")) {  
198             String realName = fileName.substring(fileName.lastIndexOf("/"),  
199                     fileName.lastIndexOf("."));  
200             if (outputPath.charAt(outputPath.length()) == '/') {  
201                 swfFile = new File(outputPath + realName + ".swf");  
202             } else {  
203                 swfFile = new File(outputPath + realName + ".swf");  
204             }  
205         }  
206     }  
207   
208 }  

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 的不同之處:初始化方式改變,若文件目錄與項目目錄不在一起,可將附件目錄在服務器中設置為虛擬目錄

 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 
19 <title>文檔在線預覽系統</title>
20 </head>
21 <body> 
22         <div style="position:absolute;left:50px;top:10px;">
23            <div id="documentViewer" class="flexpaper_viewer" style="width:770px;height:500px"></div>
24  
25             <script type="text/javascript"> 
26 
27             var startDocument = "Paper";
28 
29             $('#documentViewer').FlexPaperViewer(
30                     { config : {
31 
32                         SWFFile : 'upload/ddd3.swf',
33 
34                         Scale : 0.6,
35                         ZoomTransition : 'easeOut',
36                         ZoomTime : 0.5,
37                         ZoomInterval : 0.2,
38                         FitPageOnLoad : true,
39                         FitWidthOnLoad : false,
40                         FullScreenAsMaxWindow : false,
41                         ProgressiveLoading : false,
42                         MinZoomSize : 0.2,
43                         MaxZoomSize : 5,
44                         SearchMatchAll : false,
45                         InitViewMode : 'Portrait',
46                         RenderingOrder : 'flash',
47                         StartAtPage : '',
48 
49                         ViewModeToolsVisible : true,
50                         ZoomToolsVisible : true,
51                         NavToolsVisible : true,
52                         CursorToolsVisible : true,
53                         SearchToolsVisible : true,
54                         WMode : 'window',
55                         localeChain: 'en_US'
56                     }}
57             );
58        
59             </script>            
60         </div>
61 </body>
62 </html>

 

最后,若需要去除打印功能及logo,可重新編譯 flexpaper 的 flash文件,網上也有下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM