带有 PdfRenderer 的 SecurityException,带有受密码保护的 pdf,即使使用普通 pdf 也会重复

Posted

技术标签:

【中文标题】带有 PdfRenderer 的 SecurityException,带有受密码保护的 pdf,即使使用普通 pdf 也会重复【英文标题】:SecurityException with PdfRenderer, comes with password protected pdfs, and than repeats even with normal pdfs 【发布时间】:2019-04-16 06:09:23 【问题描述】:

如果尝试使用 PdfRenderer API 打开受密码保护的 PDF,则在 catch 块内给出 SecurityException 并进行相应处理,然后进行 onDestroy 基本清理完成,然后返回主活动,然后导航一个简单的不受保护的 PDF,然后再次发生相同的异常。

请注意,只有在打开任何受保护的文件后才会发生这种情况。

参考以下代码:

      @Override
    protected PdfRenderer doInBackground(Uri... uri) 
        Uri uriToProcess = uri[0];
        try 
            contentResolver=getContentResolver();
            parcelFileDescriptor = contentResolver.openFileDescriptor(uriToProcess, "r");
            if(parcelFileDescriptor!=null && mPdfRenderer==null) 
                mPdfRenderer = new PdfRenderer(parcelFileDescriptor);
            
         catch (FileNotFoundException e) 
            exceptionMsg="Sorry! No such file or directory found";
            handleExceptionInUI(exceptionMsg, progressDialog);
            Log.e("$$$$ FNFException", e.toString());

         catch (IOException e) 
            exceptionMsg="Sorry! Something went wrong with IO";
            handleExceptionInUI(exceptionMsg, progressDialog);
            Log.e("$$$$ IOException", e.toString());
         catch (SecurityException e) 
            if (parcelFileDescriptor!=null) 
                try 
                    parcelFileDescriptor.close();
                    parcelFileDescriptor = null;
                    contentResolver=null;
                 catch (IOException e1) 
                    e1.printStackTrace();
                
            

            if (mPdfRenderer!=null)
                mPdfRenderer.close();
                mPdfRenderer=null;
            

            exceptionMsg="Password protected file, This can't be opened";
            handleExceptionInUI(exceptionMsg, progressDialog);
            Log.e("$$$$ SecurityException", e.toString());
         catch (Exception e) 
            exceptionMsg="Sorry! Something went wrong.";
            handleExceptionInUI(exceptionMsg, progressDialog);
            Log.e("$$$$ EXCEPTION", e.toString());
        
        return mPdfRenderer;
    

衷心感谢任何帮助。

【问题讨论】:

【参考方案1】:

我的应用也遇到了同样的问题。我解决它的方法是使用https://github.com/TomRoush/PdfBox-android 并加载文档并检查密码保护。在没有引发 InvalidPasswordException 之后,可以使用 PdfRenderer 安全地加载文件。

【讨论】:

以上是关于带有 PdfRenderer 的 SecurityException,带有受密码保护的 pdf,即使使用普通 pdf 也会重复的主要内容,如果未能解决你的问题,请参考以下文章

PdfRenderer 在呈现受密码保护的文件后总是抛出“需要密码”SecurityException

使用 Sun PDFRenderer 进行 Java 打印编码

java技术开发 ,将pdf文档转成图片,使用PDFRenderer-0.9.0架包

带有 OpenIDAuthenticationFilter 问题的 Spring Security

带有 LDAP 注销的 Spring Security 无法删除会话

带有 Spring Security 登录和身份验证的 Angular