pdf文件转bitmap再转图片

在写这篇文章的时候真的是一把鼻涕一把泪,遇到了几个坑,搞了一天半才搞出来,资质愚钝了,网上查找了资料,发现基本上没有pdf转图片相关的,难道都没这个需求么,接下来我先描述下我遇到的问题和现象吧

首先我通过PdfRenderer将pdf文件转成bitmap集合,因为pdf文件可能有几页,所以需要集合装起来

然后将bitmap集合里面的每个bitmap都转化成png或者jpg存储到本地,问题来了

我将每个bitmap用imageview显示是可以的,然后去本地打开图片发现黑色,这个问题卡死我了,先预留着,下面再讲述,上代码逻辑了

  • pdf转bitmap集合
    private ArrayList<Bitmap> pdfToBitmap(File pdfFile) {
        ArrayList<Bitmap> bitmaps = new ArrayList<>();
        try {
            PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_ONLY));

            Bitmap bitmap;
            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();
                bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
                //todo 以下三行处理图片存储到本地出现黑屏的问题,这个涉及到背景问题
                Canvas canvas = new Canvas(bitmap);
                canvas.drawColor(Color.WHITE);
                canvas.drawBitmap(bitmap, 0, 0, null);
                Rect r = new Rect(0, 0, width, height);
                page.render(bitmap, r, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
                bitmaps.add(bitmap);
                // close the page
                page.close();

            }

            // close the renderer
            renderer.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return bitmaps;

    }

通过这个方法就可以得到bitmaps集合

然后将bitmaps集合里的每个bitmap都存储到本地

    /**
     * 将图片保存到文件
     */
    public void saveImageToFile() {
        ArrayList<Bitmap> bitmaps = pdfToBitmap(new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/1/3.pdf"));
        String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/3/";
        for (int i = 0; i < bitmaps.size(); i++) {
            try {
                File file = new File(savePath);
                if (!file.exists()) {
                    file.mkdirs();
                }

                String localFile = file.getAbsolutePath() + "/" + i + ".png";
                Log.i("test_sign", "图片全路径localFile = " + localFile);
                File f = new File(localFile);

                FileOutputStream fos = new FileOutputStream(f);
                bitmaps.get(i).compress(Bitmap.CompressFormat.PNG, 100, fos);
                fos.flush();
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

这样你就能在本地看到图片了,先将pdf转化得到bitmap,再将bitmap转成图片,这期间就有一个问题,就是会出现我上面描述的那种情况,不过我贴出来的代码里面已经处理了,就是TODO那里,有个原理分析,我分析也是基于个人理解,可能有误,如果有问题也希望各位大佬指教下

出现黑色原理分析:有个原理在里面,bitmap转png的时候,他本身有个空白背景是黑色的,然后当你用imageview去显示的时候,imageview会直接把图片背景变成白色,所以你能看得到,但是当你直接存储到本地的时候,那么背景为黑色的时候就会显现出来,所以看到的是黑色,所以我这个时候通过画布canvas把背景强制为白色,图片就有了

Canvas canvas = new Canvas(bitmap);
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(bitmap, 0, 0, null);

看到网上基本都没有pdf转化相关的,希望能帮到大家吧

猜你喜欢

转载自blog.csdn.net/lovelixue/article/details/82863234
今日推荐