文件預(yù)覽——一路躺過(guò)來(lái)的那些坑

因?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

maven下載.png

因?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)!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 用到的組件 1、通過(guò)CocoaPods安裝 2、第三方類庫(kù)安裝 3、第三方服務(wù) 友盟社會(huì)化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 15,207評(píng)論 1 180
  • 銀燭鼓瑟錦屏彈,朝柳夕花又復(fù)年。 詠史綺懷皆妙筆,獨(dú)為此客李樊南。
    郁光閱讀 300評(píng)論 0 8
  • 曾看過(guò)《窮爸爸與富爸爸》這本書(shū) 記得當(dāng)時(shí)是看電視節(jié)目知道理財(cái)這回事 從而閱讀了這本書(shū) 書(shū)中的理財(cái)知識(shí)很容易理解...
    霉霉大_美鋁閱讀 462評(píng)論 4 10
  • https://github.com/0532
    王立超閱讀 209評(píng)論 0 5
  • 文/十月五 剛在群里看到一位同學(xué)說(shuō),她在宿舍因?yàn)橐恍﹩?wèn)題和室友爭(zhēng)論起來(lái)。 吵到激烈處,她忍不住對(duì)著室友吼起來(lái):“你...
    十月五閱讀 936評(píng)論 12 34

友情鏈接更多精彩內(nèi)容