2

PDF ドキュメントの検証に PDFBox を使用していますが、検証の 1 つは、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 に答える