【總結(jié)】- 文件(pdf,ppt,doc等)加載解決方案

簡(jiǎn)介

最近項(xiàng)目需要在線(xiàn)瀏覽PDF文檔,即不是像微信,QQ那樣點(diǎn)擊了下載下來(lái),然后跳轉(zhuǎn)到其它應(yīng)用打開(kāi)。
肯定最快想到的方案就是用瀏覽器打開(kāi),但是發(fā)現(xiàn),在IOS上面是可以正常打開(kāi)的,可能是IOS本身就支持,在Android手機(jī)上卻不行,百度一番,得到的結(jié)果是Android自帶的WebView不支持。那么接下來(lái)就是尋找解決之法了,PDF的加載解決方案之旅就開(kāi)始了。

PDF加載開(kāi)源庫(kù)

PDF-load

地址外鏈

這個(gè)解決方案是什么意思呢?有點(diǎn)抽象,看一下這個(gè)庫(kù)就知道了。pdf.js。
文檔中提到使用方法:

Modern browsers:https://mozilla.github.io/pdf.js/web/viewer.html
Older browsers:https://mozilla.github.io/pdf.js/es5/web/viewer.html

比如用Older browsers這個(gè)外鏈地址:https://mozilla.github.io/pdf.js/es5/web/viewer.html?file=pdf地址,然后用瀏覽器加載。
如果不清楚,可以安裝這么些,如果你是個(gè)想知道答案的人,可以問(wèn)一下做web的朋友。

經(jīng)嘗試這種的確可以加載PDF文件,而且很省事。但是同時(shí)也存在很多問(wèn)題。

  • PDF加載不出來(lái)
    經(jīng)嘗試:
    使用https://mozilla.github.io/pdf.js/web/viewer.html作為外鏈地址,基本上手機(jī)加載不出來(lái)。
    使用https://mozilla.github.io/pdf.js/es5/web/viewer.html可以加載。

  • 外鏈地址不能訪問(wèn)
    用了幾個(gè)Android8.0及一下的手機(jī)測(cè)試了一波,都可以加載,正以為解決了問(wèn)題時(shí),測(cè)試說(shuō),我這邊怎么加載不出來(lái),我說(shuō),我這邊完全沒(méi)有問(wèn)題啊。

    經(jīng)調(diào)試,發(fā)現(xiàn)Android10手機(jī),上面的外鏈地址都不能訪問(wèn)。Android9沒(méi)有試。試著努力解決,無(wú)果,放棄。

  • 性能問(wèn)題
    首先這個(gè)地址可以訪問(wèn),但是訪問(wèn)速度呢,不敢說(shuō);加上用WebView加載PDF文件本來(lái)就存在性能問(wèn)題,所以即便能加載,其實(shí)也不是很好的方案。

使用PDF.js

這個(gè)需要使用到上面說(shuō)的開(kāi)源庫(kù),你說(shuō)外鏈訪問(wèn)不行,那把庫(kù)集成到自己服務(wù)器或者集成到Android工程中,也可以下載到手機(jī)里,加載本地文件或者網(wǎng)絡(luò)文件,不就可以了,這個(gè)方法的確可以解決,但是當(dāng)時(shí)沒(méi)時(shí)間弄,我也就隨便找了一個(gè)解決方案,后面會(huì)說(shuō)。這個(gè)方案可以用于手機(jī)加載網(wǎng)頁(yè)使用。

  • 遇到的問(wèn)題
    用手機(jī)或者瀏覽器加載時(shí)報(bào)錯(cuò):


    截屏2020-10-31 下午11.29.55.png
截屏2020-10-31 下午11.42.37.png

在viewer.js為了安全,對(duì)域名進(jìn)行了判斷:


截屏2020-10-31 下午11.30.53.png

所以可以把這個(gè)函數(shù)(validateFileURL(file))的調(diào)用注釋掉。

接下來(lái)就可以加載pdf
比如:file:///path/viewer.html?file=path/guanxin_paitent_test.pdf

使用AndroidPDF

這個(gè)庫(kù)支持加載網(wǎng)絡(luò)PDF文件,集成后apk大概增加1M多,但是效果嘛,不太好。

使用AndroidPdfViewer

這個(gè)庫(kù)也是基于 PdfiumAndroid開(kāi)始的,算是效果最好的庫(kù)了。但是apk提交增加也很明顯,配置ndk支持某種平臺(tái)后,apk大概增加3.5M多。但是AndroidPdfViewer不能直接加載網(wǎng)絡(luò)PDF文件,也不提供進(jìn)度提示 。所以自己封裝了一個(gè)用于加載網(wǎng)絡(luò)PDF文檔,支持使用默認(rèn),自定義進(jìn)度條的庫(kù)。PDF-load。具體實(shí)現(xiàn)查看開(kāi)源庫(kù)中的LibPdf模塊。
使用:

<com.pds.pdf.core.ExtPDFView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pdfView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
  private void displayFromUrl(String url) {
      pdfFileName = FileUtils.getFileNameByUrl(url);
      pdfView.fromUrl(url)
              .defaultPage(pageNumber)
              .onPageChange(this)
              .enableAnnotationRendering(true)
              .onLoad(this)
              .scrollHandle(new DefaultScrollHandle(this))
              .spacing(10)
              .onPageError(this);
      pdfView.enableCache(true)
              .useDefaultProgressView().go();

效果如下:


截屏2020-10-25 下午4.26.04.png
  • 直接加載Asset,本地文件,參考AndroidPdfViewer

  • 使用默認(rèn)進(jìn)度條

    LibPdf支持進(jìn)度顯示,LibPdf提供了默認(rèn)的進(jìn)度View,即在頂部顯示類(lèi)似加載網(wǎng)頁(yè)一樣的進(jìn)度條,調(diào)用useDefaultProgressView方法即可。

    添加自定義進(jìn)度View,支持3哥方向,分別是加在PDF視圖的頂部,底部和疊在PDF視圖的上面,等PDF加載完成隱藏。

  • 自定義進(jìn)度條

    LibPdf支持自定義進(jìn)度條,調(diào)用addCustomProgress方法加入自己的進(jìn)度View。

使用 騰訊X5瀏覽器

使用騰訊X5引擎加載PDF,doc等文件。如果項(xiàng)目中使用了騰訊X5引擎,那么可以直接使用pdf-x5庫(kù)瀏覽PDF,apk體積基本沒(méi)有什么增加,如果項(xiàng)目中沒(méi)有 使用X5引擎,要用pdf-x5加載PDF,那么需要先集成X5引擎,開(kāi)源庫(kù)中的web庫(kù)提供的簡(jiǎn)單的X5集成。

該庫(kù)一共支持幾十中文件加載,只需要傳入不同文件地址就可以了,下面是我測(cè)試的效果:

使用tbs加載:

截屏2020-10-26 下午6.53.32.png
  • pptx加載效果
截屏2020-10-26 下午6.54.40.png

使用QbSdk加載:

QbSdk加載支持的文件格式更多,具體參考騰訊X5官網(wǎng)

截屏2020-10-26 下午6.56.21.png

調(diào)用之后,優(yōu)先調(diào)起 QQ 瀏覽器打開(kāi)文件。如果沒(méi)有安裝 QQ 瀏覽器,在 X5 內(nèi)核下調(diào)起簡(jiǎn)版 QB 打開(kāi)文件。如果使用的系統(tǒng)內(nèi)核,則調(diào)起文件閱讀器彈框。

使用方法請(qǐng)參考PDF-load

SVG

大概思路就是把PDF文件轉(zhuǎn)成SVG,但是SVG需要大量的計(jì)算量,而且我目前是通過(guò)其它網(wǎng)站進(jìn)行的PDF轉(zhuǎn)SVG

PDF轉(zhuǎn)其它格式文件

比如轉(zhuǎn)圖片等,這個(gè)自己研究。

最后編輯于
?著作權(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ù)。

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