3
    public void onBrowse(View view) {
    Intent chooseFile;
    Intent intent;
    chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
    chooseFile.addCategory(Intent.CATEGORY_OPENABLE);
    chooseFile.setType("file/*");
    intent = Intent.createChooser(chooseFile, "Choose a file");
    startActivityForResult(intent, ACTIVITY_CHOOSE_FILE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode != RESULT_OK) return;
    String path = "";
    if (requestCode == ACTIVITY_CHOOSE_FILE) {
        Uri uri = data.getData();
        Log.v("Path:", uri.getPath());
        try {
            openRenderer(HomeActivity.this, uri.getPath());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


private void openRenderer(Context context, String path) throws IOException {
    // In this sample, we read a PDF from the assets directory.
    File file = new File(path);
    if (!file.exists()) {
        // Since PdfRenderer cannot handle the compressed asset file directly, we copy it into
        // the cache directory.
        InputStream asset = context.getAssets().open(FILENAME);
        FileOutputStream output = new FileOutputStream(file);
        final byte[] buffer = new byte[1024];
        int size;
        while ((size = asset.read(buffer)) != -1) {
            output.write(buffer, 0, size);
        }
        asset.close();
        output.close();
    }


    mFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
    if (mFileDescriptor != null) {
        try {
            mPdfRenderer = new PdfRenderer(mFileDescriptor);
        } catch (SecurityException e) {
            Log.v("password", e.getMessage());
            e.printStackTrace();
        }
    }

}

Problem is that password protected pdf is getting Security exception.

java.lang.SecurityException: cannot create document. Error: 4
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:     at android.graphics.pdf.PdfRenderer.nativeCreate(Native Method)
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:     at android.graphics.pdf.PdfRenderer.(PdfRenderer.java:157)
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:     at com.sbw.pdfrendererview.HomeActivity.openRenderer(HomeActivity.java:205)
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:     at com.sbw.pdfrendererview.HomeActivity.onActivityResult(HomeActivity.java:157)
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:     at android.app.Activity.dispatchActivityResult(Activity.java:7273)
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:     at android.app.ActivityThread.deliverResults(ActivityThread.java:4520)
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:     at android.app.ActivityThread.handleSendResult(ActivityThread.java:4567)
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:     at android.app.ActivityThread.-wrap22(ActivityThread.java)
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1695)
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:     at android.os.Looper.loop(Looper.java:154)
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6780)
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)

2 Answers2

3

PdfRenderer is not designed to render arbitrary PDF files. It is designed for print preview of PDF documents created in-app for printing. As such, PdfRenderer has no support for password-protected PDF files.

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
  • so is there any things by which we can open a protected pdf in android for preview? – Sumanta Banerjee Oct 23 '17 at 05:57
  • @SumantaBanerjee: There may be a commercial library that can do that. You can see if [`PDF.js` or `AndroidPdfViewer`](https://commonsware.com/blog/2017/01/04/options-viewing-pdfs.html) have the ability to do that, though I do not recall seeing it. – CommonsWare Oct 23 '17 at 10:19
  • 1
    PdfBox can do it, but is sometimes bugged. What I'm doing is this: If there's a password, use PdfBox, and otherwise the native `PdfRenderer`. An alternative would be to use PdfBox to save the file in the app data cache without the password, and then use the native `PdfRenderer` to display that instead. – 0101100101 Jan 17 '18 at 05:24
2

@Sumanta Banerjee Using iText pdf library you can open a password protected pdf. Follow code snippet

try { 
   PdfReader pdfReader = new PdfReader(String.valueOf(file));
   if (pdfReader.isEncrypted()){
     //Pass your password to view encrypted pdf.
   }
} catch(IOException) {
   e.printStackTrace(); 
}
Shivam
  • 109
  • 2
  • 11