PDF文書のパスワードによるセキュリティの情報を取得します。
PDF文書のセキュリティ設定は、PDF文書のトレイラーにある暗号辞書に記録されています。暗号辞書からユーザーパスワードの設定状況とオーナーパスワードの権限設定内容を取得して画面に表示します。ただし入力PDF文書にユーザーパスワードが設定されているとき、PDF文書を開くには正しいパスワードの入力が必要となります。
以下はPtlEncryptPermissionType1, PtlEncryptPermissionType2で同名の関数です。それぞれのクラスで取得する情報が細かく異なります。
package cookbook; import jp.co.antenna.ptl.*; public class GetEncryptInfo { /** * @param args the command line arguments */ public static void main(String[] args) { if (args.length < 1) { System.out.println("usage: java GetEncryptInfo in-pdf-file [in-pdf-password]"); return; } try (PtlParamInput inputFile = new PtlParamInput(args[0]); PtlPDFDocument doc = new PtlPDFDocument()) { if (args.length > 1) { // パスワードのセット doc.setPassword(args[1]); } // PDFファイルをロードします。 doc.load(inputFile); // 暗号化の取得 if (doc.isEncrypted()) { // 暗号化情報の取得 showEncrypt(doc); } else { System.out.println("暗号化されていないファイルです"); } } catch (PtlException pex) { System.out.println("PtlException : ErrorCode = " + pex.getErrorCode() + "\n " + pex.getErrorMessage()); } catch (Exception ex) { System.out.println(ex.getMessage()); ex.printStackTrace(); } catch (Error ex) { System.out.println(ex.getMessage()); ex.printStackTrace(); } finally { System.out.println("-- 完了 --"); } } public static void showEncrypt(PtlPDFDocument doc) throws PtlException, Exception, Error { try (PtlEncrypt encrypt = doc.getEncrypt()) { // キー長の取得 System.out.println("暗号化のキー長 : " + encrypt.getKeyLength()); // 暗号化する文書コンポーネント取得 switch (encrypt.getEncryptComponent()) { case ENCRYPT_ALL: System.out.println("文書の全てのコンテンツを暗号化"); break; case ENCRYPT_EXCEPT_METADATA: System.out.println("文書のメタデータを除く全てのコンテンツを暗号化"); break; case ENCRYPT_ONLY_ATTACHED_FILE: System.out.println("添付ファイルのみを暗号化(AES暗号化のみで有効)"); break; } // 暗号化のフィルター取得 // FILTER_STANDARD = 1 /* 標準セキュリティハンドラ */ // Ver5.0 はStandardしかない if (encrypt.getFilterType() == PtlEncrypt.FILTER_TYPE.FILTER_STANDARD) { // getFilterType()に判定済みなので PtlEncryptStandard にダウンキャストする。 PtlEncryptStandard encryptStandard = (PtlEncryptStandard)encrypt; // 標準セキュリティハンドラのメソッド取得 switch (encryptStandard.getMethod()) { case METHOD_RC4: System.out.println("標準セキュリティハンドラのメソッド : RC4"); break; case METHOD_AES: System.out.println("標準セキュリティハンドラのメソッド : AES"); break; } // ユーザアクセス許可フラグの取得 try (PtlEncryptPermission perms = encryptStandard.getPermission()) { // タイプ取得 switch (perms.getType()) { case PERM_TYPE1: { System.out.println("標準セキュリティハンドラのリビジョン : 2"); // getType()で判定されたのでpermsをダウンキャストできる。 PtlEncryptPermissionType1 perms1 = (PtlEncryptPermissionType1)perms; // 印刷権限取得 if (perms1.getPrint()) { System.out.println("印刷を許可する"); } else { System.out.println("印刷を許可しない"); } // 変更権限取得 switch (perms1.getModify()) { case PERM_MODIFY_NOT_ALLOWED: System.out.println("変更権限 : 許可しない"); break; case PERM_MODIFY_ANNOTANDFORM: System.out.println("変更権限 : 注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名"); break; case PERM_MODIFY_ASSENBLEANDFORM: System.out.println("変更権限 : ページレイアウト、フォームフィールドの入力と既存の署名フィールドに署名"); break; case PERM_MODIFY_MODYFYDOC: System.out.println("変更権限 : ページ抽出を除く全ての動作"); break; } // テキスト、画像、その他の内容のコピーおよびアクセシビリティを有効にするかどうかの取得 if (perms1.getCopy()) { System.out.println("テキスト、画像、その他の内容のコピーおよびアクセシビリティを有効にする"); } else { System.out.println("テキスト、画像、その他の内容のコピーおよびアクセシビリティを有効にしない"); } } break; case PERM_TYPE2: { System.out.println("標準セキュリティハンドラのリビジョン : 3または4"); // getType()で判定されたのでpermsをダウンキャストできる。 PtlEncryptPermissionType2 perms2 = (PtlEncryptPermissionType2)perms; // 印刷権限取得 switch (perms2.getPrint()) { case PERM_PRINT_NOT_ALLOWED: System.out.println("印刷権限 : 許可しない"); break; case PERM_PRINT_LOW: System.out.println("印刷権限 : 低解像度"); break; case PERM_PRINT_HIGH: System.out.println("印刷権限 : 高解像度"); break; } // 変更権限取得 switch (perms2.getModify()) { case PERM_MODIFY_NOT_ALLOWED: System.out.println("変更権限 : 許可しない"); break; case PERM_MODIFY_ASSENBLEDOC: System.out.println("変更権限 : ページの挿入、削除、回転"); break; case PERM_MODIFY_FILLFORM: System.out.println("変更権限 : フォームフィールドの入力と既存の署名フィールドに署名"); break; case PERM_MODIFY_ANNOTANDFORM: System.out.println("変更権限 : 注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名"); break; case PERM_MODIFY_MODYFYDOC: System.out.println("変更権限 : ページ抽出を除く全ての動作"); break; } // テキスト、画像、その他の内容のコピーを有効にするかどうかの取得 if (perms2.getCopy()) { System.out.println("テキスト、画像、その他の内容のコピーを有効にする"); } else { System.out.println("テキスト、画像、その他の内容のコピーを有効にしない"); } // スクリーンリーダーデバイスのテキストアクセスを有効にするかどうかの取得 if (perms2.getAccesibility()) { System.out.println("スクリーンリーダーデバイスのテキストアクセスを有効にする"); } else { System.out.println("スクリーンリーダーデバイスのテキストアクセスを有効にしない"); } } break; } } } } } }
GetEncryptInfo.java
次は暗号化キー長256ビットのAESでオーナーパスワード設定したPDF文書の例です。
次は暗号化キー長256ビットのAESで添付ファイルのみ暗号化したPDF文書の例です。