因?yàn)樽罱?xiàng)目比較緊,所以dubbo源碼系列是顧不上了。
恰巧這周花了幾天在做文件預(yù)覽這塊,兩三天的時(shí)間下來(lái),有過(guò)一些走彎路的經(jīng)驗(yàn)教訓(xùn)(準(zhǔn)確說(shuō),全都是彎路),在這里給大家分享下~
背景
基于產(chǎn)品需求,需要支持文件預(yù)覽的功能。顧名思義,要支持類似word、excel、TXT、PDF等格式文件的在線預(yù)覽。
業(yè)界對(duì)于文件預(yù)覽功能的實(shí)現(xiàn)也是各顯神通。大體主要分為兩種,一種是自主研發(fā),另外就是購(gòu)買成熟預(yù)覽服務(wù)提供商的服務(wù)。
既然說(shuō)到躺坑,那自然是屬于第一種自主研發(fā)的情況。
自主研發(fā)主要還是借用現(xiàn)有的軟件和類庫(kù)組合,加上編碼實(shí)現(xiàn)。網(wǎng)上搜羅一通,資料相對(duì)老舊,很多組件也有超過(guò)5年沒(méi)有更新迭代了。解決方案大致分為兩種:
1、以O(shè)penoffice + swftools + Flexmapper + jodconverter技術(shù)組合的預(yù)覽實(shí)現(xiàn)
大體思路是將如doc等文件格式轉(zhuǎn)為pdf格式,再將pdf經(jīng)過(guò)swftools工具轉(zhuǎn)為swf格式,有flexmapper負(fù)責(zé)最后的預(yù)覽。
上面這四個(gè)組件,沒(méi)有一個(gè)是好惹的,各個(gè)脾氣古怪,稍不順心,就給你報(bào)個(gè)錯(cuò),讓你折騰半天。
2、以https://github.com/kekingcn/kkFileView(下面簡(jiǎn)稱kkFileView)該項(xiàng)目為首的基于jodconverter-core + Openoffice的解決方案
大體思路是借助jodconverter-core和Openoffice將doc等文件轉(zhuǎn)為pdf格式,再由前端通過(guò)第三方預(yù)覽組件如pdf.js負(fù)責(zé)預(yù)覽展示。
調(diào)研
既然市面上提供多種可行性的方案,那么就需要調(diào)研對(duì)比具體的效果。
kkFileView
首先調(diào)用的是kkFileView,相信只要找文檔格式轉(zhuǎn)換和預(yù)覽相關(guān)的,最終都會(huì)看到這個(gè)項(xiàng)目。
該項(xiàng)目托管在GitHub上,使用spring boot打造文件文檔在線預(yù)覽項(xiàng)目解決方案,支持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等文件在線預(yù)覽。
看上去完美,但是對(duì)接也并非一帆風(fēng)順。一些具體細(xì)節(jié)問(wèn)題可以到QQ群咨詢,在Github上有提供加入方式。
- 環(huán)境配置
該項(xiàng)目的思路是將如doc、xls等格式轉(zhuǎn)為pdf格式供前端展示。但是應(yīng)該是考慮到文件轉(zhuǎn)換耗時(shí)較長(zhǎng)的問(wèn)題,所以使用了Redis做緩存,如果發(fā)現(xiàn)緩存中已經(jīng)有轉(zhuǎn)換過(guò)的記錄就不再執(zhí)行耗時(shí)的轉(zhuǎn)換操作。所以需要配置Redis環(huán)境。
該項(xiàng)目同樣依賴Openoffice服務(wù),所以要安裝Openoffice軟件。安裝完成需要在項(xiàng)目的配置文件中配置安裝軟件路徑。
最后kkFileView項(xiàng)目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設(shè)置密碼,需要配置“spring.redisson.password”屬性
另外,本機(jī)系統(tǒng)環(huán)境是macOS,所以啟動(dòng)Openoffice需要執(zhí)行
cd /Applications/OpenOffice.app/Contents/program
./soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
- 文件轉(zhuǎn)換
本地搭建環(huán)境后,啟動(dòng)服務(wù),測(cè)試各種常見(jiàn)文檔如word、excel、ppt等,發(fā)現(xiàn)仍然存在一些問(wèn)題。
當(dāng)上傳word或其他文檔過(guò)大時(shí),預(yù)覽翻頁(yè)的時(shí)候會(huì)有明顯的陰影和卡頓的情況,而且翻頁(yè)速度變快時(shí),會(huì)出現(xiàn)反復(fù)加載的情況。
對(duì)于ppt文檔的支持較差,尤其包含動(dòng)畫(huà)的ppt頁(yè),只是簡(jiǎn)單的疊加,導(dǎo)致內(nèi)容失真。同時(shí)可能是電腦本地字體庫(kù)的原因,有些文件在轉(zhuǎn)換后預(yù)覽的時(shí)候會(huì)出現(xiàn)亂碼的情況。
Openoffice + swftools + Flexmapper + jodconverter方案
為了運(yùn)行起該方案,走了太多彎路。
- 環(huán)境配置
安裝swftools之前,一切都還順利。但是對(duì)于macOS環(huán)境安裝swftools安裝各種報(bào)錯(cuò)。
主要受影響的是需要使用的pdf2swf沒(méi)有安裝,通過(guò)http://blog.chinaunix.net/uid-21374062-id-3031316.html等資料解決了安裝時(shí)不抱這個(gè)錯(cuò)。同時(shí)也換過(guò)使用brew直接安裝的方式,但是最終結(jié)果都是一致的讓人絕望,那就是pdf2swf一直沒(méi)有成功安裝。
后來(lái)只能在虛擬機(jī)的Windows環(huán)境中安裝swftools,安裝過(guò)程中也會(huì)彈出一個(gè)錯(cuò)誤,只需要以管理員的身份重新安裝即可。
最終在Windows環(huán)境下成功實(shí)現(xiàn)從doc->pdf->swf的轉(zhuǎn)換。
如需代碼,請(qǐng)留下郵箱~~~
- 文件轉(zhuǎn)換
該模式與上面方案存在同樣的問(wèn)題,如果需要支持高版本office文檔的轉(zhuǎn)換,也需要jodconverter-core的支持。
而且,該方案,文件轉(zhuǎn)換繁瑣,需要轉(zhuǎn)為pdf,再由pdf轉(zhuǎn)為swf,最后進(jìn)行預(yù)覽。swf已經(jīng)是極為過(guò)時(shí)的技術(shù)。
使用
- kkFileView
剛開(kāi)始僅僅依賴com.artofsolving.jodconverter的jar包完成文檔轉(zhuǎn)換。但是實(shí)際操作發(fā)現(xiàn),該工具包不支持較高版本的office文檔如docx、xlsx和pptx等。
所以后來(lái)找了相關(guān)資料,發(fā)現(xiàn)要么重寫(xiě)B(tài)aseDocumentFormatRegistry類(參見(jiàn)https://blog.csdn.net/make_a_difference/article/details/53771136)或者引用jodconverter-core的jar包(參見(jiàn)http://huangronaldo.iteye.com/blog/1628339)。
其實(shí)這里的orgartofsolving.jodconverter-core就是我們提到的kkFileView項(xiàng)目中的jodconverter-core子項(xiàng)目。
關(guān)于引用jodconverter-core按照網(wǎng)上添加denpendency無(wú)法下載,后來(lái)根據(jù)下面的線索訪問(wèn)http://maven.jahia.org/maven2找到可用的版本是3.0-beta-4-jahia4

因?yàn)楸镜氐膕etting.xml文件沒(méi)有添加這個(gè)repository,所以在當(dāng)前項(xiàng)目的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>
我本地有一個(gè)測(cè)試的完整項(xiàng)目代碼,如果需要,下方留下你的郵箱。
實(shí)測(cè)效果
將一個(gè)近10M的xls文件轉(zhuǎn)為pdf文檔,本地耗時(shí)約為5分鐘左右(不能忍)。
總體,該項(xiàng)目考慮較為完整,但是仍然有不少細(xì)節(jié)需要優(yōu)化和處理。
- Openoffice + swftools + Flexmapper + jodconverter方案
從實(shí)際轉(zhuǎn)換后得到的swf文件可以看出,對(duì)于doc和xls的預(yù)覽效果要比上面的好,不會(huì)出現(xiàn)卡頓的情況,但是對(duì)于ppt格式的支持仍然不理想,只是簡(jiǎn)單的疊加覆蓋。
?
整體對(duì)比下來(lái),這兩種方案都存在問(wèn)題
都依賴相對(duì)較多的第三方庫(kù)和軟件Openoffice、swftools等
庫(kù)和jar的版本沒(méi)有持續(xù)維護(hù),jodconverter的版本最新的是2008年,jodconverter-core最新版本是2012年。swftools最新版本是2012年。
效率較低,從上面測(cè)試效果發(fā)現(xiàn),在文檔轉(zhuǎn)換過(guò)程中占用資源較多,時(shí)間比較長(zhǎng),不能很好的滿足用戶的需求,只能通過(guò)一些補(bǔ)償機(jī)制做補(bǔ)充,如添加緩存或落盤轉(zhuǎn)換后的文件
經(jīng)過(guò)調(diào)研,協(xié)調(diào)運(yùn)維和全后端開(kāi)發(fā)人員,決定采用市面上較為成熟的預(yù)覽服務(wù)提供商,這里就不說(shuō)名稱了,以免有打廣告之嫌。
通過(guò)對(duì)接后發(fā)現(xiàn),只需要完成注冊(cè)+配置域名+拼裝http請(qǐng)求即可,同時(shí)預(yù)覽同等大小的文件僅需5秒左右。
畢竟,人民幣玩家就是強(qiáng)!