最近項目需要用到文件的預覽功能,就開始在網上收集資料,學習了幾種文件預覽的方法。我集成到我項目內測試的有以下三種,最后使用的是第三種:
- 直接使用別人提供的服務 例如:office web 365
- 使用openoffice+swfTools+flexPaper實現
- 使用openoffice+pdf.js實現
1.使用office web 365第三方服務點擊進入官網;
特點:
- 實現起來簡單,簡單的不能再簡單了,你只需要給它提供一個文件資源的鏈接就可以了。
- 它支持各種文件類型的預覽,而且能保存原有文件的各種動態效果,如PPT的動畫效果,而且連壓縮包都可以預覽。也就是說,你在這上面預覽文件和你在計算機上直接打開沒有任何區別。
- 能實現文件的緩存,減輕你服務器的壓力。
- 有免費版、標准版、高級版等多個版本,不同的版本對應的服務也不一樣,免費版預覽的文件大小不能超過5MB,每天預覽次數(調用接口次數)不能超過500次,對於要求高的系統就必須使用付費版的了。
- 安全問題,雖說office web提供了很高的安全性,但是總感覺將自己的東西放別人那里不會太安全。
- 不適合局域網內的項目。
openoffice示例如下:
不需要部署、不需要編程,不需要做任何事情,只需要做個鏈接:點我預覽,鏈接指向:
http://officeweb365.com/o/?i=您的網站ID&furl=要預覽的Office文件下載地址
例:
1 不需要部署、不需要編程,不需要做任何事情,只需要做個鏈接:點我預覽,鏈接指向: 2 http://officeweb365.com/o/?i=您的網站ID&furl=要預覽的Office文件下載地址 3 例:<a href="http://officeweb365.com/o/?i=1&furl=http://a.com/downfile/a.doc" target="_blank">點我預覽</a>
2.使用openoffice+swfTools+flexPaper實現
使用openOffice+swfTools+flexPaper實現文件預覽功能的主要思想是:通過Java程序調用服務器上安裝的軟件openoffice,來將其它文件類型轉化為pdf,然后調用swfTools將pdf轉化為swf文件,在前端通過flexpaper插件來預覽swf文件。
特點:
- 這個實現起來相對復雜一點,需要在服務器上提前安裝openOffice和swfTools軟件,然后在程序里調用這些軟件來完成文件類型的轉換。
- 好像不支持中文路徑和中文文件名,要想支持中文文件名,需要反編譯flexpaper然后再。。。反正很麻煩
- 這個的資料很多,因此網上可以找很多教程來幫助你完成配置。
具體的實現可以參考下這個博客:OpenOffice+SwfTools+flexpaper實現文件預覽
3.使用openoffice+pdf.js
在我的項目中采用的就是這種方法,pdf.js的顯示效果比較好,而且可以根據自己的項目需要完成相關的配置。下面說一下我的項目中具體使用:
1.首先安裝openOffice,安裝成功之后在命令行啟動該服務,如下圖:進入安裝目錄下的program目錄,然后執行命令:soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;"
查看運行的進程內有沒有soffice.bin,有的話則啟動成功。
2.然后在項目內導入如下jar包:
jodconverter-2.2.2.jar
ridl-3.2.1.jar
commons.io.jar
juh.jar
jurt.jar
unoil.jar
slf4j-api-1.7.13.jarslf4j-jdk14-1.7.13.jarxstream-1.4.1.jar
3.編寫Java代碼完成其它文件到pdf的轉化:直接初始化將源文件路徑,以及要轉化為的pdf的文件路徑傳遞進去即可,代碼如下
1 package com.ams.util.server; 2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.BufferedReader; 6 import java.io.File; 7 import java.io.FileInputStream; 8 import java.io.FileOutputStream; 9 import java.io.IOException; 10 import java.io.InputStream; 11 import java.io.InputStreamReader; 12 13 import com.artofsolving.jodconverter.DocumentConverter; 14 import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection; 15 import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; 16 import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter; 17 18 public class DocConverter { 19 20 private String fileName; 21 private File pdfFile; 22 private File docFile; 23 private File odtFile; 24 25 26 27 public DocConverter(String sourceFile,String targetFile) throws Exception { 28 29 fileName = sourceFile.substring(0, sourceFile.lastIndexOf("/")); 30 docFile = new File(sourceFile);//得到轉換前的文件 31 //得到文件的不帶后綴的名字s 32 String s = sourceFile.substring(sourceFile.lastIndexOf("/") + 1,sourceFile.lastIndexOf(".")); 33 fileName = fileName + "/" + s; 34 // 用於處理TXT文檔轉化為PDF格式亂碼,獲取上傳文件的名稱(不需要后面的格式_ 35 String txtName = sourceFile.substring(sourceFile.lastIndexOf(".")); //得到文件格式 36 // 判斷上傳的文件是否是TXT文件 37 if (txtName.equalsIgnoreCase(".txt")) { 38 //是txt則需要轉化為odt,然后再轉為pdf 39 odtFile = new File(fileName + ".odt"); 40 // 將上傳的文檔重新copy丿份,並且修改為ODT格式,然后有ODT格式轉化為PDF格式 41 this.copyFile(docFile, odtFile); 42 pdfFile = new File(targetFile); // 用於處理PDF文檔 43 } else if (txtName.equals(".pdf") || txtName.equals(".PDF")) { 44 pdfFile = new File(targetFile); 45 this.copyFile(docFile, pdfFile); 46 } else{ 47 pdfFile = new File(targetFile); 48 } 49 doc2pdf();//調用函數進行轉換 50 } 51 private void copyFile(File sourceFile,File targetFile)throws Exception{ 52 //新建文件輸入流並對它進行緩沖 53 FileInputStream input = new FileInputStream(sourceFile); 54 BufferedInputStream inBuff = new BufferedInputStream(input); 55 // 新建文件輸出流並對它進行緩沖 56 FileOutputStream output = new FileOutputStream(targetFile); 57 BufferedOutputStream outBuff = new BufferedOutputStream(output); 58 // 緩沖數組 59 byte[]b = new byte[1024 * 5]; 60 int len; 61 while((len = inBuff.read(b)) != -1){ 62 outBuff.write(b,0,len); 63 } 64 // 刷新此緩沖的輸出浿 65 outBuff.flush(); 66 // 關閉浿 67 inBuff.close(); 68 outBuff.close(); 69 output.close(); 70 input.close(); 71 } 72 private void doc2pdf() throws Exception { 73 if (docFile.exists()) { 74 if (!pdfFile.exists()) { 75 OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100); 76 try { 77 connection.connect(); 78 DocumentConverter converter = new OpenOfficeDocumentConverter(connection); 79 converter.convert(docFile, pdfFile); 80 // close the connection 81 connection.disconnect(); 82 System.out.println("****pdf轉換成功,PDF輸出_" + pdfFile.getPath() + "****"); 83 } catch (java.net.ConnectException e) { 84 // ToDo Auto-generated catch block 85 e.printStackTrace(); 86 System.out.println("****swf轉換異常,openoffice服務未啟動!****"); 87 throw e; 88 } catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) { 89 e.printStackTrace(); 90 System.out.println("****swf轉換器異常,讀取轉換文件失敗****"); 91 throw e; 92 } catch (Exception e) { 93 e.printStackTrace(); 94 throw e; 95 } 96 } else { 97 System.out.println("****已經轉換為pdf,不霿要再進行轉化****"); 98 } 99 } else { 100 System.out.println("****swf轉換器異常,霿要轉換的文檔不存在,無法轉換****"); 101 } 102 }
103 }
4.前端需要導入pdf.js插件,然后將返回的結果動態添加到viewer.js中的DEFAULT_URL中即可,在這里面可以進行各種現實效果的配置。
以上就是我實現文件預覽的幾種方法,希望能和廣大網友共同學習和進步!Fighting!