上週臨時收到客戶的說明書,說要放在應用裡顯示,本來覺得乙個非常簡單的事情沒想到一波三折。
第一波:我使用了pdfviewer控制項:(相了解的可以檢視:
遇到的坑就是 因為裝置是橫屏的,這個控制項在手機上預覽pdf很不錯,我一下子沒有找到橫向鋪滿的方法,因此顯示起來頁面顯的非常小,由於時間比較急沒有去細細研究所以棄用了。
第二波:到這個時候我就立馬換了乙個思路。改用webview,過程稍微複雜點 但是效果還是不錯的 滿足了需求。
然後就是使用:布局檔案就不貼出來了。
private void loadwebpdf()
webview.loadurl("file:///android_asset/pdfjs/web/viewer.html?file=" + "file:///android_asset/vehicle-help-chinese.pdf");
}
感覺一切都是相當的完美。如果是一般應用到這裡也就沒什麼問題了。
第三波: 執行的時候發現系統一直報 error inflating class android.webkit.webview.這就很尷尬了,然後查了下,試了幾個方法都沒有用,後面仔細看還有for security reasons, webview is not allowed in privileged processesfor security reasons, webview is not allowed in privileged processes(出於安全原因,特權程序中不允許使用webview。出於安全原因,特權程序中不允許使用webview)。這就很尷尬了,忘了說了應用是系統及應用系統版本7.1.2。(android開發系統應用(android.uid.system)使用webview報錯)。
查了下 谷歌不知道從啥時候開始全面禁止系統應用使用webview。檢視原始碼獲悉在webviewfactory**中某個靜態例項初始化之前判斷api版本並丟擲錯誤。知道是這個原因後,心裡有底了,方法總比困難多嘛,既然準備用webview來預覽pdf了就不要輕易放棄。方向如下:
在使用webview之前,使用hook
(鉤子)方法,給該變數賦值。哈哈 這樣就可以避免這個問題了;**如下:
/**
* 使用webview避免系統檢查丟擲異常
*/public static void checkwebview()
method getproviderclassmethod;
if (sdkint > 22) else if (sdkint == 22) else
getproviderclassmethod.setaccessible(true);
class<?> providerclass = (class<?>) getproviderclassmethod.invoke(factoryclass);
class<?> delegateclass = class.forname("android.webkit.webviewdelegate");
constructor<?> providerconstructor = providerclass.getconstructor(delegateclass);
if (providerconstructor != null)
} catch (throwable e)
}
搞定收工,預覽了下效果還是蠻不錯的。只是載入稍微有點點慢。
最近在優化記憶體發現這個由於用的webview記憶體占用比較大,而且退出後記憶體降不下去。導致整個應用記憶體占用比較大。測試了很大方法都不能從根本上解決,最後只好把介面設定成乙個單獨的程序。介面退出的時候直接system.exit(0);
PDF預覽 pdfJS預覽pdf檔案
方式1 檔案流轉為blob let urlsrc window.url.createobjecturl blob this src urlsrc pdf空白頁 else 正確解析了頁碼,但是每頁空白。解決方法 responsetype blob html visible.sync dialo isi...
前端js實現預覽pdf檔案
一 採用pdfobeject.js外掛程式,優點 支援pdf輸入開啟口令,缺點 不支援手機瀏覽器 其實就光看這個 也足夠了,主要 二 採用touchpdf.js外掛程式,實現手機端預覽pdf檔案,缺點 pdf不能設定開啟口令,否則js報錯passwordexception,上網未找到解決辦法 主要參...
使用vue預覽PDF
效果圖 講解之前先看案例,強烈推薦此專案vue pdf.js demo 前端 方法 filepreview row console.log handledownbyurlbypost2 admin sys file getfilebybucket name,then response catch r...