這里十分感謝一位同學的幫助。
一系列百度之后的結果,得到的解決方法 AndroidPdfViewer,PDF.js ...去顯示PDF。
AndroidPdfViewer
AndroidPdfViewer 很多博客指出他的缺點是使APK增大,其實不在我考慮范圍。只要能實現┭┮﹏┭┮ (好沒出息的樣子)
但我是遇到了致命的問題,AndroidPdfViewer 是 jcenter 庫中的,我的Android項目不允許我使用 jcenter。於是放棄了
PDF.js
參考博文:https://blog.csdn.net/taoyuxin1314/article/details/97004996
⭐ 注意這里有些版本用的是PDFJS
使用這種方式我也完美的展現了PDF,但是很快我遇到了問題
PDF文件后期通過程序對PDF編輯插入的文字無法顯示
於是我開始了解決問題之旅···
1、查看未顯示出來的問題與其他文字區別。(該文字通過PDF直接編輯插入)
2、通過WPS插入文件,查看是否能夠正常顯示。(結果:插入的文字能夠顯示,中文無法顯示,但如果對插入的文字進行修改字體,將無法顯示,即使把字體修改回去,再也無法顯示)
3、嘗試更換PDF.js 的版本
參考博文:https://unpkg.com/browse/pdfjs-dist@2.3.200/
更換多個版本之后並不能解決問題,並且有些高版本可能連PDF都加載不出來,可能是版本不同相應的 pdf.js 需要配置的內容不同。沒再做進一步的研究
4、從字體方面去解決問題。在網上有找到說是字體有關的問題,於是我嘗試用程序去編輯PDF插入文字,去查看是否能夠正常顯示。因為這里和實際他們PDF文件插入的字體以及encoding有差異,我插入的文字是能繼續顯示的。
5、難道再返回去修改成AndroidPdfViewer的形式?畢竟很多其他同學都是用這種展現形式,我如果直接使用AndroidPdfViewer 的jar包的話,是不是就不受 jcenter 庫的限制。(但是我並沒有找到···對應的jar包)
6、在我花了這么長時間,最終同學給了我新的思路。把PDF文件保存成圖片呢?我確實沒有考慮到,我想這種方式對我來說應該是實用的,但對於要顯示多頁PDF以及一些PDF基本操作的人,可能未必會適用。但確切地解決了我的問題。
PDF轉圖片(Bitmap)代碼如下:(由於加載的是在線PDF,還是選擇先把PDF下載了下來)
參考博文:https://blog.csdn.net/chaogelilun/article/details/85095821
沒錯,我通過這種方式實現了那部分文字的顯示!然而我遇到了新的問題,我是把圖片放在Photoview里面支持放縮,當放大圖片上面的文字很模糊。而PDF.js的加載PDF放大之后是清楚的。
於是我又代碼切換到PDF.js的上去考慮,放大縮小放大縮小。然后我想,如果我把PDF放大再把大轉成圖片,轉成一個大圖,這樣原先的圖放大到大圖就不會出現模糊的現象。
該怎么把PDF放大后轉圖?
百度上我並未找到答案。
於是我開始通過修改代碼中有關的寬高參數,得到了一些不同的效果。
最終代碼如下:(紅色標注為處理部分)
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) private Bitmap pdfToBitmap(File pdfFile) { Bitmap bitmap = null; try { PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_ONLY)); final int pageCount = renderer.getPageCount(); for (int i = 0; i < pageCount; i++) { PdfRenderer.Page page = renderer.openPage(i); // int width = getResources().getDisplayMetrics().densityDpi / 72 * page.getWidth(); // int height = getResources().getDisplayMetrics().densityDpi / 72 * page.getHeight(); int width = page.getWidth()*2; int height = page.getHeight()*2; Log.e("----------widht", width + ""); Log.e("----------height", height + ""); bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); canvas.drawColor(Color.WHITE); Paint paint = new Paint(); paint.setColor(Color.BLACK); canvas.drawBitmap(bitmap, 0, 0, paint); Rect r = new Rect(0, 0, width, height); Matrix tranform = new Matrix(); tranform.setScale(2,2); page.render(bitmap, r, tranform, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); // close the page page.close(); } // close the renderer renderer.close(); } catch (Exception ex) { ex.printStackTrace(); } return bitmap; }
終於,完美地解決了這個PDF的問題。🙄
還是十分感謝同學提供的思路。