2

我正在使用 PDFBox 验证 pdf 文档,其中一项验证说明 pdf 文档是否可打印。

我使用以下代码来执行此操作:

PDDocument document = PDDocument.load("<path_to_pdf_file>");
System.out.println(document.getCurrentAccessPermission().canPrint());

但这让我回归真实,尽管当打开 pdf 时,它显示打印图标已禁用。

4

1 回答 1

3

访问权限通过加密方式集成到文档中。

即使在 Acrobat Reader 中打开时不要求输入密码的 PDF 文档也可能被加密,它们本质上是使用默认密码加密的。您的 PDF 就是这种情况。

PDFBox 仅在解密时确定加密 PDF 的权限,而不是在加载PDDocument. 因此,如果文档已加密,您必须在检查其属性之前尝试解密文档。

在你的情况下:

PDDocument document = PDDocument.load("<path_to_pdf_file>");
if (document.isEncrypted())
{
    document.decrypt("");
}
System.out.println(document.getCurrentAccessPermission().canPrint());

空字符串""表示默认密码。如果文件是使用不同的密码加密的,你会在这里得到一个例外。因此,相应地抓住。

PS:如果您不知道所有有问题的密码,您可能仍然使用PDFBox检查权限,但您必须工作更底层:

PDDocument document = PDDocument.load("<path_to_pdf_file>");
if (document.isEncrypted())
{
    final int PRINT_BIT = 3;
    PDEncryptionDictionary encryptionDictionary = document.getEncryptionDictionary();
    int perms = encryptionDictionary.getPermissions();
    boolean printAllowed = (perms & (1 << (PRINT_BIT-1))) != 0;
    System.out.println("Document encrypted; printing allowed?" + printAllowed);
}
else
{
    System.out.println("Document not encrypted; printing allowed? true");
}
于 2013-11-10T21:12:50.197 回答