我正在使用PDFBox验证pdf文档,其中一个验证表明pdf文档是否可打印。
我使用以下代码执行此操作:
PDDocument document = PDDocument.load("<path_to_pdf_file>");
System.out.println(document.getCurrentAccessPermission().canPrint());
但是,这是正确的,但是当打开pdf时,它会显示禁用打印图标。
答案 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");
}