檔案預覽——一路躺過來的那些坑

weixin_34292287發表於2018-04-15

因為最近專案比較緊,所以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

4459384-b3d6a4f1fa9a8f1f.png
maven下載.png

因為本地的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秒左右。

畢竟,人民幣玩家就是強!

相關文章