androidpdfrendererparcelfiledescriptor

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


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.


Solution

  • 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();
                }
            }