PdfRenderer Error : java.io.IOException: cannot create document. Error: 3

5.2k Views Asked by At

I am trying to convert PDF To image Bitmap.. and for that I am Using this Code Below.

pdfFile = Environment.getExternalStorageDirectory().toString() + "/" + "imagepdf.pdf"

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

            try {
                Uri uri = MainActivity.getUriFromFile(PdfExtrectorActivity.this,new File(pdfFile));
                final ParcelFileDescriptor parcelFileDescriptor = getContentResolver().openFileDescriptor(
                        uri, "r");
                final FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
                pdfRenderer = new PdfRenderer(parcelFileDescriptor);
            } catch (IOException e) {
                e.printStackTrace();
            }
            Bitmap bitmap;
            final int pageCount = pdfRenderer.getPageCount();
            for (int i = 0; i < pageCount; i++) {
                PdfRenderer.Page page = pdfRenderer.openPage(i);


                bitmap = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888);
                page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);



                // close the page
                page.close();
            }

            // close the renderer
            pdfRenderer.close();
        }

when I send ParcelFileDescriptor to pdfRenderer it will throws exception

java.io.IOException: cannot create document. Error: 3

I found Some Link from GitHub issues. https://github.com/googlesamples/android-PdfRendererBasic/issues/15 but it wont help me.

Any Help Accepted. thank you.

1

There are 1 best solutions below

1
Learning Always On BEST ANSWER

my Problem solved with this solutions to convert Image Bitmap from PDF which are in SD card.,

And this will worked fine for me

  File file = new File(getCacheDir(), PDF_FILE_NAME);
        //if (!file.exists()) {
        // Since PdfRenderer cannot handle the compressed asset file directly, we copy it into
        // the cache directory.
        //InputStream asset = context.getAssets().open("imagepdf.pdf");
        FileInputStream fileInputStream = null;
        FileOutputStream output = null;
        try {
            fileInputStream = new FileInputStream( Environment.getExternalStorageDirectory().toString() +  "/imagepdf.pdf");
            output = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        final byte[] buffer = new byte[1024];
        int size;
        while ((size = fileInputStream.read(buffer)) != -1) {
            output.write(buffer, 0, size);
        }
        fileInputStream.close();
        output.close();
        //}
        ParcelFileDescriptor mFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
        // This is the PdfRenderer we use to render the PDF.
        PdfRenderer renderer = null;
        if (mFileDescriptor != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                renderer = new PdfRenderer(mFileDescriptor);
                Bitmap bitmap;
                final int pageCount = renderer.getPageCount();
                for (int i = 0; i < pageCount; i++) {
                    PdfRenderer.Page page = renderer.openPage(i);

                    // say we render for showing on the screen
                    bitmap = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888);
                    page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
                    myImageBitmap.add(bitmap);
                    // do stuff with the bitmap

                    // close the page
                    page.close();
                }

                // close the renderer
                renderer.close();
            }
        }