因為最近項目比較緊,所以dubbo源碼系列是顧不上了。
恰巧這周花了幾天在做文件預覽這塊,兩三天的時間下來,有過一些走彎路的經驗教訓(准確說,全都是彎路),在這里給大家分享下~
背景
基於產品需求,需要支持文件預覽的功能。顧名思義,要支持類似word、excel、TXT、PDF等格式文件的在線預覽。
業界對於文件預覽功能的實現也是各顯神通。大體主要分為兩種,一種是自主研發,另外就是購買成熟預覽服務提供商的服務。
既然說到躺坑,那自然是屬於第一種自主研發的情況。
自主研發主要還是借用現有的軟件和類庫組合,加上編碼實現。網上搜羅一通,資料相對老舊,很多組件也有超過5年沒有更新迭代了。解決方案大致分為兩種:
1、以Openoffice + swftools + Flexmapper + jodconverter技術組合的預覽實現
大體思路是將如doc等文件格式轉為pdf格式,再將pdf經過swftools工具轉為swf格式,有flexmapper負責最后的預覽。
上面這四個組件,沒有一個是好惹的,各個脾氣古怪,稍不順心,就給你報個錯,讓你折騰半天。
2、以https://github.com/kekingcn/kkFileView(下面簡稱kkFileView)該項目為首的基於jodconverter-core + Openoffice的解決方案
大體思路是借助jodconverter-core和Openoffice將doc等文件轉為pdf格式,再由前端通過第三方預覽組件如pdf.js負責預覽展示。
調研
既然市面上提供多種可行性的方案,那么就需要調研對比具體的效果。
kkFileView
首先調用的是kkFileView,相信只要找文檔格式轉換和預覽相關的,最終都會看到這個項目。
該項目托管在GitHub上,使用spring boot打造文件文檔在線預覽項目解決方案,支持doc、docx、ppt、pptx、xls、xlsx、zip、rar、mp4,mp3以及眾多類文本如txt、html、xml、java、properties、sql、js、md、json、conf、ini、vue、php、py、bat、gitignore等文件在線預覽。
看上去完美,但是對接也並非一帆風順。一些具體細節問題可以到QQ群咨詢,在Github上有提供加入方式。
- 環境配置
該項目的思路是將如doc、xls等格式轉為pdf格式供前端展示。但是應該是考慮到文件轉換耗時較長的問題,所以使用了Redis做緩存,如果發現緩存中已經有轉換過的記錄就不再執行耗時的轉換操作。所以需要配置Redis環境。
該項目同樣依賴Openoffice服務,所以要安裝Openoffice軟件。安裝完成需要在項目的配置文件中配置安裝軟件路徑。
最后kkFileView項目application-dev.properties配置如下
#redis連接
spring.redisson.address = 127.0.0.1:6379
##資源映射路徑
file.dir = downloadfile/
#spring.redisson.password=123
spring.resources.static-locations = classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${file.dir}
## openoffice home路徑
office.home = /Applications/OpenOffice.app/Contents
server.tomcat.uri-encoding = UTF-8
converted.file.charset = GBK
#文件上傳限制
spring.http.multipart.max-file-size=10000MB
##文本類型
simText = txt,html,xml,java,properties,mp3,mp4,sql
#多媒體類型
media=mp3,mp4,flv,rmvb
logging.level.root=debug
如果Redis設置密碼,需要配置“spring.redisson.password”屬性
另外,本機系統環境是macOS,所以啟動Openoffice需要執行
cd /Applications/OpenOffice.app/Contents/program
./soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
- 文件轉換
本地搭建環境后,啟動服務,測試各種常見文檔如word、excel、ppt等,發現仍然存在一些問題。
當上傳word或其他文檔過大時,預覽翻頁的時候會有明顯的陰影和卡頓的情況,而且翻頁速度變快時,會出現反復加載的情況。
對於ppt文檔的支持較差,尤其包含動畫的ppt頁,只是簡單的疊加,導致內容失真。同時可能是電腦本地字體庫的原因,有些文件在轉換后預覽的時候會出現亂碼的情況。
Openoffice + swftools + Flexmapper + jodconverter方案
為了運行起該方案,走了太多彎路。
- 環境配置
安裝swftools之前,一切都還順利。但是對於macOS環境安裝swftools安裝各種報錯。
主要受影響的是需要使用的pdf2swf沒有安裝,通過http://blog.chinaunix.net/uid-21374062-id-3031316.html等資料解決了安裝時不抱這個錯。同時也換過使用brew直接安裝的方式,但是最終結果都是一致的讓人絕望,那就是pdf2swf一直沒有成功安裝。
后來只能在虛擬機的Windows環境中安裝swftools,安裝過程中也會彈出一個錯誤,只需要以管理員的身份重新安裝即可。
最終在Windows環境下成功實現從doc->pdf->swf的轉換。
如需代碼,請留下郵箱~~~
- 文件轉換
該模式與上面方案存在同樣的問題,如果需要支持高版本office文檔的轉換,也需要jodconverter-core的支持。
而且,該方案,文件轉換繁瑣,需要轉為pdf,再由pdf轉為swf,最后進行預覽。swf已經是極為過時的技術。
使用
- kkFileView
剛開始僅僅依賴com.artofsolving.jodconverter的jar包完成文檔轉換。但是實際操作發現,該工具包不支持較高版本的office文檔如docx、xlsx和pptx等。
所以后來找了相關資料,發現要么重寫BaseDocumentFormatRegistry類(參見https://blog.csdn.net/make_a_difference/article/details/53771136)或者引用jodconverter-core的jar包(參見http://huangronaldo.iteye.com/blog/1628339)。
其實這里的orgartofsolving.jodconverter-core就是我們提到的kkFileView項目中的jodconverter-core子項目。
關於引用jodconverter-core按照網上添加denpendency無法下載,后來根據下面的線索訪問http://maven.jahia.org/maven2找到可用的版本是3.0-beta-4-jahia4
因為本地的setting.xml文件沒有添加這個repository,所以在當前項目的pom.xml文件中添加
<repositories>
<repository>
<id>org.artofsolving.jodconverter</id>
<name>Maven jahia Mirror</name>
<url>http://maven.jahia.org/maven2/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
我本地有一個測試的完整項目代碼,如果需要,下方留下你的郵箱。
實測效果
將一個近10M的xls文件轉為pdf文檔,本地耗時約為5分鍾左右(不能忍)。
總體,該項目考慮較為完整,但是仍然有不少細節需要優化和處理。
- Openoffice + swftools + Flexmapper + jodconverter方案
從實際轉換后得到的swf文件可以看出,對於doc和xls的預覽效果要比上面的好,不會出現卡頓的情況,但是對於ppt格式的支持仍然不理想,只是簡單的疊加覆蓋。
整體對比下來,這兩種方案都存在問題
-
都依賴相對較多的第三方庫和軟件Openoffice、swftools等
-
庫和jar的版本沒有持續維護,jodconverter的版本最新的是2008年,jodconverter-core最新版本是2012年。swftools最新版本是2012年。
-
效率較低,從上面測試效果發現,在文檔轉換過程中占用資源較多,時間比較長,不能很好的滿足用戶的需求,只能通過一些補償機制做補充,如添加緩存或落盤轉換后的文件
經過調研,協調運維和全后端開發人員,決定采用市面上較為成熟的預覽服務提供商,這里就不說名稱了,以免有打廣告之嫌。
通過對接后發現,只需要完成注冊+配置域名+拼裝http請求即可,同時預覽同等大小的文件僅需5秒左右。
畢竟,人民幣玩家就是強!
如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作動力!如果您想持續關注我的文章,請掃描二維碼,關注JackieZheng的微信公眾號,我會將我的文章推送給您,並和您一起分享我日常閱讀過的優質文章。