Android 查看PDF 部分文字无法显示 放大PDF再转图片BitMap
一系列百度之后的结果,得到的解决方法 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的问题。🙄