關于文件預覽,網(wǎng)上比較流行的方案是: openoffice/libreoffice+swftools+jodconverter+flexpaper(跨平臺) 1.我用的是libreoffice, 因為最開始我用的是openoffice, 但是發(fā)現(xiàn)openoffice有的格式轉換不出來,而且有些復雜的word也轉不成功(不報錯,也沒日志,就是沒反應,這點很惱火,查了好久), 還有ppt,word的一些圖表轉換不出來,比如柱狀圖什么的 后來改用libreoffice就好了,格式也比較準確 轉換的時候不要忘了開啟服務, D:\LibreOffice 4\program\soffice.exe -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard linux下是: ./soffice --headless --accept="socket,host=127.0.0.1,port=8100;urp;" --nofirststartwizard & 注意不要忘了后面的符號 2.swftools 轉換命令sourcePath -o targetPath -T 9 -f sourcePath是你要轉換的文件,targetPath是要轉換成的swf文件,-T 9 是轉成9.0版本,這個版本支持分頁加載(分頁加載自己查吧) -f具體忘了,好像是轉換所有字符,如果不加這參數(shù),再用flexpaper搜索功能的時候有些功能會不正常(比如高亮顯示)
如果在轉換中遇到找不到F0類似的錯誤,這個是因為字體的問題,具體解決辦法如下(以下資源比較好找,不寫地址了): 首先下載xpdf-chinese-simplified.tar.gz,解壓到xpdf目錄下 下載gkai00mp.ttf和gbsn00lp.ttf兩個字體拷貝到xpdf-chinese-simplified/CMap下 更改xpdf-chinese-simplified/add-to-xpdfrc這個文件,替換成以下內(nèi)容:
#----- begin Chinese Simplified support package (2011-sep-02)cidToUnicode Adobe-GB1 xpdf安裝目錄/xpdf-chinese-simplified/Adobe-GB1.cidToUnicodeunicodeMap ISO-2022-CN xpdf安裝目錄/xpdf-chinese-simplified/ISO-2022-CN.unicodeMapunicodeMap EUC-CN xpdf安裝目錄/xpdf-chinese-simplified/EUC-CN.unicodeMapunicodeMap GBK xpdf安裝目錄/xpdf-chinese-simplified/GBK.unicodeMapcMapDir Adobe-GB1 xpdf安裝目錄/xpdf-chinese-simplified/CMaptoUnicodeDir xpdf安裝目錄/xpdf-chinese-simplified/CMapdisplayCIDFontTT Adobe-GB1 xpdf安裝目錄/xpdf-chinese-simplified/CMap/gkai00mp.ttfdisplayCIDFontTT Adobe-GB1 xpdf安裝目錄/xpdf-chinese-simplified/CMap/gbsn00lp.ttf#fontFileCC Adobe-GB1 /usr/..../gkai00mp.ttf#----- end Chinese Simplified support package 此時再用轉換命令的時候,需要指定語言包:pdf2swf preview.pdf -o preview.swf -s languagedir=<span style="font-family: Arial, Helvetica, sans-serif;">xpdf安裝目錄/</span>xpdf-chinese-simplified -T 9 -f
3.jodconverter 我用的是jodconverter2.2.2,為什么用這個版本?因為這個版本之下的不能轉換2007以上的office,而最新版的3.0(3.0還是3.3來著忘了)轉換有bug 我轉換的時候最開始用的就是最新版,結果我一個5m左右的2010word一直轉換不成功,也沒報錯信息,就是上面openoffice那個情況,因為不確定是哪個原因所有寫上面了 如果是maven項目的話: <dependency> <groupId>com.artofsolving</groupId> <artifactId>jodconverter</artifactId> <version>2.2.2</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> 這個包和slf4j有沖突,所有剔除下4.還有就是flexpaper了 我的版本是flexpaper2.2.4,獲取flexpaper對象的方法是$FlexPaper('documentViewer'),documentView就是你的div的id 調用flexpaper的方法當然就是$FlexPaper('documentViewer').getTotalPages()了 如果flexpaper加載時間較長,這時候就需要用到事件了,比如ondocumentloaded(文檔加載完成),直接這樣: jQuery(function() { jQuery('#documentViewer').bind('onExternalLinkClicked',function(e,link){//do something}); jQuery('#documentViewer').bind('onProgress',function(e,loadedBytes,totalBytes){//do something}); jQuery('#documentViewer').bind('onDocumentLoading',function(e){//do something}); jQuery('#documentViewer').bind('onPageLoading',function(e,pageNumber){//do something}); jQuery('#documentViewer').bind('onCurrentPageChanged',function(e,pagenum){//do something}); jQuery('#documentViewer').bind('onDocumentLoaded',function(e,totalPages){//do something}); jQuery('#documentViewer').bind('onPageLoaded',function(e,pageNumber){//do something}); jQuery('#documentViewer').bind('onErrorLoadingPage',function(e,pageNumber){//do something}); jQuery('#documentViewer').bind('onDocumentLoadedError',function(e,errMessage){//do something}); jQuery('#documentViewer').bind('onDocumentPrinted',function(e){//do something});}); 我的版本里是有這么多事件,具體什么用,自己翻譯吧~flexpaper要瀏覽的文件需要放在web環(huán)境下,path要寫相對路徑(因為它不支持絕對路徑,不清楚為什么,反正我是沒找到合適的答案) 如果你覺得麻煩,那它還支持流的方式加載swf,你可以再swfFile這里直接寫上你的處理路徑,比如/doc/preview,然后后臺直接用response寫回來就行了 flexpaper在加載大文檔的時候會拖垮瀏覽器,比如我遇到個307頁的pptx(據(jù)說pptx相對于ppt會小很多,應該是壓縮比較厲害)才4m多,轉換時間就不必說了,無法避免的(建議只轉pdf,雖然可以直接轉html和swf但是轉swf很慢,轉html的話文件會很大,我轉一個4.8m的docx轉完事40m,當然和我里面貼圖多也有關系,并且有時候會出現(xiàn)卡死不斷開soffice連接的問題,pdf最穩(wěn)定,非要轉html的話可以先轉pdf然后用pdf2htmlex這個神器轉換).所以后來就改成分頁加載的方式了(主要當初沒想到這種大文檔會這么多),普通的分頁加載方式就不多說了,網(wǎng)上有很多,而我采用的是流的方式,所以只能找怎么用流分頁加載了.(廢話好多,哈哈) 網(wǎng)上沒合適的答案,自己摸索出flexpaper流的方式分頁加載方法具體可以這么寫 SWFFile:"{/doc_layout/preview_office$!{docFile.id}?pageNum=[*,0],$!{pageNumCount}}" 我用的velocity,這個字符串里的id就是我的業(yè)務id,pageNumCount是flash頁數(shù),頁數(shù)的獲取可以用itext這個jar獲取pdf的頁數(shù)(poi獲取office頁數(shù)不準,除非用openoffice).我們的文件都有個唯一的key,轉換文件的時候就是原文件名加下劃線加頁碼,所以我的辦法是直接獲取以這個key開頭并以.swf結尾的文件的個數(shù),代碼如下:int pageNumCount = new File(path).getParentFile().list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.startsWith(docFileKey.substring(0, docFileKey.lastIndexOf("."))) && name.endsWith(".swf"); } }).length; pageNum是自己隨便取,是要加載的頁碼,就當一個普通參數(shù)就行,但是[*,0]這個一定要這么寫,逗號后沒有空格,之后就是根據(jù)傳到后臺的頁碼自己決定加載哪頁flash吧,
|