【问题标题】:Password Protected pdf is not accessed by PdfRendererPdfRenderer 无法访问受密码保护的 pdf
【发布时间】:2017-10-18 13:20:25
【问题描述】:
    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();
        }
    }

}

问题是受密码保护的 pdf 出现安全异常。

java.lang.SecurityException:无法创建文档。错误:4 10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:在 android.graphics.pdf.PdfRenderer.nativeCreate(本机方法) 10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err: 在 android.graphics.pdf.PdfRenderer.(PdfRenderer.java:157) 10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err: 在 com.sbw.pdfrendererview.HomeActivity.openRenderer(HomeActivity.java:205) 10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err: 在 com.sbw.pdfrendererview.HomeActivity.onActivityResult(HomeActivity.java:157) 10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err: 在 android.app.Activity.dispatchActivityResult(Activity.java:7273) 10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err: 在 android.app.ActivityThread.deliverResults(ActivityThread.java:4520) 10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err: 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:4567) 10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err: 在 android.app.ActivityThread.-wrap22(ActivityThread.java) 10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err: 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1695) 10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err: 在 android.os.Handler.dispatchMessage(Handler.java:102) 10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err: 在 android.os.Looper.loop(Looper.java:154) 10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err: 在 android.app.ActivityThread.main(ActivityThread.java:6780) 10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:在 java.lang.reflect.Method.invoke(本机方法) 10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err: 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496) 10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err: 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)

【问题讨论】:

    标签: android security pdf pdfrenderer


    【解决方案1】:

    @Sumanta Banerjee 使用 iText pdf 库,您可以打开受密码保护的 pdf。关注代码sn-p

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

    【讨论】:

    • 那么,请问我们如何传递密码
    【解决方案2】:

    PdfRenderer 不是为呈现任意 PDF 文件而设计的。它专为打印在应用程序内创建的 PDF 文档的打印预览而设计。因此,PdfRenderer 不支持受密码保护的 PDF 文件。

    【讨论】:

    • 那么有什么东西可以让我们在android中打开受保护的pdf进行预览吗?
    • @SumantaBanerjee:可能有一个商业图书馆可以做到这一点。你可以看看PDF.js or AndroidPdfViewer是否有能力做到这一点,虽然我不记得见过。
    • PdfBox 可以做到,但有时会被窃听。我正在做的是:如果有密码,请使用 PdfBox,否则使用本机 PdfRenderer。另一种方法是使用 PdfBox 将文件保存在应用程序数据缓存中而无需密码,然后使用本机 PdfRenderer 来显示它。
    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多