権限を設定し、PDFファイルを暗号化および復号化する

既存のPDFファイルに権限を設定する

PDFファイルに権限を設定するには、DocumentPrivilegeクラスのオブジェクトを作成し、ドキュメントに適用したい権利を指定します。

特権が定義されたら、このオブジェクトをDocumentオブジェクトのEncryptメソッドに引数として渡します。次のコードスニペットは、PDFファイルの特権を設定する方法を示しています。

  public static void SetPrivilegesOnExistingPDF()
  {
   // ソースPDFファイルを読み込む
   Document document = new Document(_dataDir + "input.pdf");

   // Document Privilegesオブジェクトをインスタンス化
   // すべての特権に制限を適用
   DocumentPrivilege documentPrivilege = DocumentPrivilege.getForbidAll();
   // 画面読み取りのみを許可
   documentPrivilege.setAllowScreenReaders(true);
   // ユーザーとオーナーのパスワードでファイルを暗号化する。
   // ユーザーパスワードでファイルを表示するときに、
   // 画面読み取りオプションのみが有効になるようにパスワードを設定する必要があります
   document.encrypt("user", "owner", documentPrivilege, CryptoAlgorithm.AESx128, false);
   // 更新されたドキュメントを保存
   document.save(_dataDir + "SetPrivileges_out.pdf");
  }

異なる暗号化タイプとアルゴリズムを使用してPDFファイルを暗号化する

Document オブジェクトの Encrypt メソッドを使用してPDFファイルを暗号化することができます。ユーザーパスワード、オーナーパスワード、および権限を Encrypt メソッドに渡すことができます。それに加えて、CryptoAlgorithm 列挙型の任意の値を渡すことができます。この列挙型は、暗号化アルゴリズムとキーサイズの異なる組み合わせを提供します。お好きな値を渡すことができます。最後に、Document オブジェクトの save(..) メソッドを使用して暗号化されたPDFファイルを保存します。

PDFファイルを暗号化する際は、異なるユーザーとオーナーのパスワードを指定してください。

以下のコードスニペットは、PDFファイルを暗号化する方法を示しています。

public static void EncryptPDFFile() {
   // ソースPDFファイルを読み込む
   Document document = new Document(_dataDir + "input.pdf");

   // Document Privilegesオブジェクトをインスタンス化する
   // すべての権限に制限を適用する
   DocumentPrivilege documentPrivilege = DocumentPrivilege.getForbidAll();
   // スクリーンリーディングのみを許可する
   documentPrivilege.setAllowScreenReaders(true);
   // ユーザーおよびオーナーパスワードでファイルを暗号化する。
   // ユーザーがユーザーパスワードでファイルを表示した場合、
   // スクリーンリーディングオプションのみが有効になるようにパスワードを設定する必要がある
   document.encrypt("user", "owner", documentPrivilege, CryptoAlgorithm.AESx128, false);
   // 更新されたドキュメントを保存する
   document.save(_dataDir + "SetPrivileges_out.pdf");
  }

オーナーパスワードを使用してPDFファイルを復号化する

PDFファイルを復号化するには、まずDocumentオブジェクトを作成し、オーナーパスワードを使用してPDFを開く必要があります。 その後、Document オブジェクトの Decrypt メソッドを呼び出す必要があります。最後に、Document オブジェクトの Save メソッドを使用して更新されたPDFファイルを保存します。次のコードスニペットは、PDFファイルを復号化する方法を示しています。

public static void DecryptPDFFile() {
   // ドキュメントを開く
   Document document = new Document(_dataDir + "Decrypt.pdf", "password");
   // PDFを復号化
   document.decrypt();

   // 更新されたPDFを保存
   document.save(_dataDir + "Decrypt_out.pdf");
  }

PDFファイルのパスワードを変更する

PDFファイルのパスワードを変更したい場合は、まずDocument オブジェクトを使用してオーナーパスワードでPDFファイルを開く必要があります。 その後、Document オブジェクトの ChangePasswords メソッドを呼び出す必要があります。このメソッドには、現在のオーナーパスワードと新しいユーザーパスワード、新しいオーナーパスワードを渡す必要があります。最後に、Document オブジェクトの Save メソッドを使用して、更新されたPDFファイルを保存します。

次のコードスニペットは、PDFファイルのパスワードを変更する方法を示しています。

public static void ChangePassword_PDF_File() {
   // ドキュメントを開く
   Document document = new Document(_dataDir+ "ChangePassword.pdf", "owner");
   // パスワードを変更する
   document.changePasswords("owner", "newuser", "newowner");
   // 更新されたPDFを保存する
   document.save(_dataDir + "ChangePassword_out.pdf");
  }

方法 - ソースPDFがパスワードで保護されているかどうかを判断する

Aspose.PDF for Java は、PDFドキュメントを扱うための優れた機能を提供します。 When using Document class of com.aspose.pdf package to open a PDF document which is password protected, we need to provide the password information as an argument to Document constructor and in case this information is not provided, an error message is generated. In fact when trying to open a PDF file with Document object, the constructor is trying to read the contents of PDF file and in case correct password is not provided, an error message is generated (it happens to prevent unauthorised access of document)

// com.aspose.pdfパッケージのDocumentクラスを使用して、パスワードで保護されたPDFドキュメントを開く場合、Documentコンストラクタへの引数としてパスワード情報を提供する必要があります。この情報が提供されない場合、エラーメッセージが生成されます。実際にDocumentオブジェクトでPDFファイルを開こうとすると、コンストラクタはPDFファイルの内容を読み取ろうとし、正しいパスワードが提供されない場合、エラーメッセージが生成されます(これはドキュメントへの不正アクセスを防ぐために発生します)。

When dealing with encrypted PDF files, you may come across the scenario where you would be interested to detect if a PDF has an open password and/or an edit password.

// 暗号化されたPDFファイルを扱う場合、PDFにオープンパスワードや編集パスワードがあるかどうかを検出したい場合があります。
 時々開く際にパスワード情報を必要としないドキュメントがありますがファイルの内容を編集するための情報が必要ですしたがって上記の要件を満たすためにcom.aspose.pdf.facadesパッケージに存在するPdfFileInfoクラスは必要な情報を特定するのに役立つメソッドを提供します

### PDFドキュメントのセキュリティに関する情報を取得する

PdfFileInfoにはPDFドキュメントのセキュリティに関する情報を取得するための3つのメソッドがあります

1. getPasswordType()メソッドはPasswordType列挙値を返します
    1. PasswordType.None - ドキュメントはパスワードで保護されていません
    1. PasswordType.User - ドキュメントはユーザーまたはドキュメントオープンパスワードで開かれました
    1. PasswordType.Owner - ドキュメントはオーナーまたは権限編集パスワードで開かれました
    1. PasswordType.Inaccessible - ドキュメントはパスワードで保護されていますが開くためにはパスワードが必要であり無効なパスワードまたはパスワードなしが提供されました
1. `hasOpenPassword()` メソッドは入力ファイルを開く際にパスワードが必要かどうかを判断するために使用されます
1. `hasEditPassword()` メソッドは入力ファイルの内容を編集するためにパスワードが必要かどうかを判断するために使用されます

### 配列から正しいパスワードを特定する

時々パスワードの配列から正しいパスワードを特定しその正しいパスワードでドキュメントを開く必要があります次のコードスニペットはパスワードの配列を反復処理し正しいパスワードでドキュメントを開こうとする手順を示しています

```java
public static void DetermineCorrectPasswordFromArray() {
    // ソースPDFファイルをロード
    PdfFileInfo info = new PdfFileInfo();
    info.bindPdf(_dataDir + "IsPasswordProtected.pdf");
    // ソースPDFが暗号化されているかどうかを判断
    System.out.println("ファイルはパスワード保護されています " + info.isEncrypted());
    String[] passwords = { "test", "test1", "test2", "test3", "sample" };
    for (int passwordcount = 0; passwordcount < passwords.length; passwordcount++)
    {
        try
        {
            Document doc = new Document(_dataDir + "IsPasswordProtected.pdf", passwords[passwordcount]);
            if (doc.getPages().size() > 0)
                System.out.println("ドキュメントのページ数 = " + doc.getPages().size());
        }
        catch (InvalidPasswordException ex)
        {
            System.out.println("パスワード = " + passwords[passwordcount] + " は正しくありません");
        }
    }