
廢話
在項目中,有一個功能需要展示PDF文件,而pdf是一個后綴為pdf的url,而Android的WebView做不到ios的WebView那樣可以很方便的直接預(yù)覽pdf文件,當然谷歌文檔也提供了利用WebView預(yù)覽pdf的方法:
mWebView.loadUrl("http://docs.google.com/gviewembedded=true&url=" + pdfUrl);
當然就像你想的那樣,在國內(nèi)的網(wǎng)絡(luò)環(huán)境下,這種方式基本上就GG了,所以換個姿勢再來一次.
在GitHub上搜到了一個PDF的庫叫AndroidPdfViewer,這個是可以實現(xiàn)的,但是缺點也是有的,那就是會造成apk增大10M左右,原因這個庫里有解釋,不說別的光增大10M這事都不能用,于是舍棄...
后來又找到一個庫android-pdfview,對應(yīng)的文章Android 打開本地pdf文件,用了兩個版本還是不錯的,但是后來就莫名奇妙的報錯,用戶反饋手機會有不兼容的問題,這可為了難了,就這一個小功能,折騰過來折騰過去,于是就想一定要一次性解決,一勞永逸,皇天不負程序員啊,終于找了一個,那就是mozilla開源的pdf.js.搞了個demo確實可行,于是全面替換,現(xiàn)已維持了幾個版本.
pdf.js用法
webView setting
private fun initView() {
val webSettings = mBinding.webView.settings
webSettings.javaScriptEnabled = true
webSettings.allowFileAccess = true
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
webSettings.allowFileAccessFromFileURLs = true
webSettings.allowUniversalAccessFromFileURLs = true
}
}
加載pdf
方式一: 使用mozilla部署在github pages上的Viewer
webView.loadUrl("http://mozilla.github.io/pdf.js/web/viewer.html?file=" + pdfUrl);
這種方式和使用google docs是差不多一樣的,重要的是國內(nèi)可以直接訪問,但是會遇到跨域的問題。
方式二: 下載PDF.js放到assets目錄下

如果pdf文件不能跨域訪問的話可以使用這種方式,先把文件下載到本地然后傳入本地文件路徑預(yù)覽pdf:
webView.loadUrl("file:///android_asset/pdfjs/web/viewer.html?file=" + pdfUrl);
因為PDF.js本身是一個比較大的庫,如果全部放到本地的話apk差不多會增大5m左右。如果可以接受的話可以直接接入項目中,如果接受不了的話,可以讓你們H5的小姐姐給你部署到網(wǎng)頁上去,這樣就能像加載H5網(wǎng)頁那樣加載了.
實現(xiàn)效果
ps:因為我是直接使用,其中還涉及到retrofit2下載,OKhttp攔截展示進度,保存本地等問題,具體的可以參考github源碼PdfDisplay