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

Posted

技术标签:

【中文标题】PdfRenderer 在呈现受密码保护的文件后总是抛出“需要密码”SecurityException【英文标题】:PdfRenderer always throwing 'password required' SecurityException after rendering a password-protected file 【发布时间】:2020-04-21 13:39:25 【问题描述】:

我有以下 android 代码:

private void test() throws IOException 
    File f1 = new File("/sdcard/password-protected-pdf.pdf");
    File f2 = new File("/sdcard/normal-pdf.pdf");

    this.renderPDF(f1);
    this.renderPDF(f2);


private void renderPDF(File f) throws IOException 
    PdfRenderer renderer = null;

    try 
        renderer = new PdfRenderer(ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY));
     catch (SecurityException e) 
        e.printStackTrace();
     finally 
        if (renderer != null)
            renderer.close();
    

PDF 文件f1 受密码保护。 PDF 文件f2 不是。当我运行代码时,两个文件都出于某种原因引发了安全异常 (password required or incorrect password)。当我正确地切换顺序(f2 排在第一位,f1 排在第二位)时,只有受密码保护的 PDF 会引发异常。

我做错了什么吗?谢谢。

编辑:我怀疑它与 open() 方法有关,返回一个静态对象。但是我无法找到有效销毁它的方法(我在返回的ParcelFileDescriptor 对象上尝试了close(),但没有成功)。

【问题讨论】:

【参考方案1】:

我也遇到过类似的问题。 您可以使用适用于 Android 的 PDFBox https://github.com/TomRoush/PdfBox-Android 并加载文档并检查密码保护。如果 fil 是安全的,那么它将抛出 IOException

注意:使用此库会增加您的应用程序大小。

private void test() throws IOException 
File f1 = new File("/sdcard/password-protected-pdf.pdf");
File f2 = new File("/sdcard/normal-pdf.pdf");

this.renderPDF(f1);
this.renderPDF(f2);


private void renderPDF(File f) throws IOException 
PdfRenderer renderer = null;

try 
  // That will throw if document is password protected
    PDDocument.load(f)
    renderer = new PdfRenderer(ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY));
 catch (SecurityException e) 
    e.printStackTrace();
 catch (IOException e) 
  // Check for Password
    e.printStackTrace();
 
 finally 
    if (renderer != null)
        renderer.close();

【讨论】:

以上是关于PdfRenderer 在呈现受密码保护的文件后总是抛出“需要密码”SecurityException的主要内容,如果未能解决你的问题,请参考以下文章

页面未呈现;在 react-router-dom 中使用受保护的路由将道具传递给孩子时

使用 Sun PDFRenderer 进行 Java 打印编码

PdfRenderer 错误:java.io.IOException:无法创建文档。错误:3

Golang 创建受密码保护的 zip 文件

在 Powershell 中查找受密码保护的 .ZIP 文件

为啥我在输入dos指令后总显示" 不是内部或外部命令,也不是可运行的程序或批处理文件”?