簡(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ù)
地址外鏈
這個(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

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

所以可以把這個(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();
效果如下:

直接加載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加載:

- pptx加載效果

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

調(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è)自己研究。
