即使我可以打开文件,PDFBox也会返回isEncrypted true

时间:2016-09-19 11:16:29

标签: java pdfbox

我正在使用PDFBox来确定pdf文件是否受密码保护。 这是我的代码:

boolean isProtected = pdfDocument.isEncrypted();

我的文件属性在sceenshot中。 在这里我得到isProtected= true,即使我可以在没有密码的情况下打开它。

注意:此文件包含文档打开密码:否和权限密码:是。

click here to view file

2 个答案:

答案 0 :(得分:0)

您的PDF有一个空的用户密码和一个非空的所有者密码。是的,它是加密的。这样做是为了防止人们做某些事情,例如内容复制。

这不是真正的安全;观察者软件有责任注意不允许“禁止”操作。

您可以找到更长(并且有点有趣)的解释here

要查看文档访问权限,请使用PDDocument.getCurrentAccessPermission()

在2.0。*中,如果此调用成功,用户将能够查看文件:

PDDocument doc = PDDocument.load(file);

如果抛出InvalidPasswordException,则表示需要非空密码。

答案 1 :(得分:0)

我之所以发布此答案,是因为在Stack Overflow和网络上的其他地方,您可能会看到使用PDDocument#isEncrypted()来检查PDFBox中受密码保护的PDF的建议方法。我们发现的问题是某些未提示输入密码的PDF仍被标记为加密。有关为什么会发生这种情况的一种解释,请参见已接受的答案,但是无论如何,我们都使用以下模式作为解决方法:

boolean isPDFReadable(byte[] fileContent) {
    PDDocument doc = null;
    try {
        doc = PDDocument.load(fileContent);
        doc.getPages();  // perhaps not necessary
        return true;
    }
    catch (InvalidPasswordException invalidPasswordException) {
        LOGGER.error("Unable to read password protected PDF.", invalidPasswordException);
    }
    catch (IOException io) {
        LOGGER.error("An error occurred while reading a PDF attachment during account submission.", io);
    }
    finally {
        if (!Objects.isNull(doc)) {
            try {
                doc.close();
                return true;
            }
            catch (IOException io) {
                LOGGER.error("An error occurred while closing a PDF attachment ", io);
            }
        }
    }

    return false;
}

如果对PDDocument#getPages()的调用成功,那么这也意味着应该可以通过双击或没有密码的浏览器打开PDF。