我正在使用 PDFBox 验证 pdf 文档,其中一项验证说明 pdf 文档是否可打印。
我使用以下代码来执行此操作:
PDDocument document = PDDocument.load("<path_to_pdf_file>");
System.out.println(document.getCurrentAccessPermission().canPrint());
但这让我回归真实,尽管当打开 pdf 时,它显示打印图标已禁用。
访问权限通过加密方式集成到文档中。
即使在 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");
}