PDFBox无法识别pdf不可打印

时间:2013-11-09 20:18:24

标签: pdf printing pdfbox detection

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

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

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

但是,这是正确的,但是当打开pdf时,它会显示禁用打印图标。

1 个答案:

答案 0 :(得分: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");
}