証明書セキュリティが設定されたPDFから証明書セキュリティ権限情報を取得します。
証明書セキュリティ付きPDFを開き、権限情報を取得します。
証明書セキュリティ付きPDFを開くには、PKCS#12証明書パッケージファイルと証明書パッケージファイルにかけられたパスワードが必要です。
開いたPDFからはユーザーアクセスフラグを含む各種情報を取得することができます。
ユーザーアクセスフラグで取得できる情報は以下の5項目です。
サンプルプログラムでは、入力PDFが持つセキュリティの情報を取得します。
列挙型定数が持つ具体的な内容は「6.1.1 セキュリティ設定(証明セキュリティ)」を参照してください。
package cookbook; import jp.co.antenna.ptl.*; public class GetEncryptInfoPubkeyPKCS12 { // そのクラスのusageを表示する関数 private static void printUsage() { System.out.println("usage: java GetEncryptInfoPubkeyPKCS12 in-pdf-file " + "PKCS#12-path [pkcs#12-password]"); } /** * @param args the command line arguments */ public static void main(String[] args) { if (args.length < 2) { printUsage(); return; } try (PtlParamInput inputFile = new PtlParamInput(args[0]); PtlParamInput pkcs12Pubkey = new PtlParamInput(args[1]); PtlPDFDocument doc = new PtlPDFDocument()) { doc.setPassword(args[2]); doc.setPKCS12(pkcs12Pubkey); // PDFファイルをロードします。 doc.load(inputFile); // 暗号化の取得 if (doc.isEncrypted()) { // 暗号化情報の取得 showStdAndPermEncInfo(doc); } else { System.out.println("暗号化されていないファイルです"); } } catch (PtlException pex) { System.out.println("PtlException : ErrorCode = " + pex.getErrorCode() + "\n " + pex.getErrorMessage()); } ...【GetPDFVersion.javaと同じ処理のため省略 ・エラーメッセージ処理と出力】... } public static void showStdAndPermEncInfo(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 : 標準セキュリティハンドラ */ if (encrypt.getFilterType() == PtlEncrypt.FILTER_TYPE.FILTER_STANDARD) { //標準セキュリティハンドラの情報取得 //PtlEncryptStandardにダウンキャストして情報を渡す getEncryptStandardInfo((PtlEncryptStandard)encrypt); } // FILTER_PUBKEY : 公開キーセキュリティハンドラ */ else if(encrypt.getFilterType() == PtlEncrypt.FILTER_TYPE.FILTER_PUBKEY) { //公開キーセキュリティハンドラの情報取得 //PtlEncryptPubkeyにダウンキャストして情報を渡す getEncryptPubkeyInfo((PtlEncryptPubKey)encrypt); } } } /** * 公開キーセキュリティハンドラの情報を取得するメソッド * @param encryptPubkey 公開キーセキュリティハンドラを表すクラス * @throws PtlException * @throws Exception * @throws Error */ private static void getEncryptPubkeyInfo(PtlEncryptPubKey encryptPubkey) throws PtlException, Exception, Error { System.out.println("---セキュリティハンドラのタイプは公開キーセキュリティハンドラです。---"); // getFilterType()で判定済みなので PtlEncryptPubKey にダウンキャストする。 // 公開キーセキュリティハンドラのメソッド取得 switch (encryptPubkey.getMethod()) { case METHOD_RC4: System.out.println("公開キーセキュリティハンドラのメソッド : RC4"); break; case METHOD_AES: System.out.println("公開キーセキュリティハンドラのメソッド : AES"); break; } // ユーザアクセス許可フラグの取得 // PtlEncryptPermissionPubKeyを取得する System.out.println("--ユーザアクセス許可フラグの情報を取得します--"); try (PtlEncryptPermissionPubKey permsPubkey = (PtlEncryptPermissionPubKey)encryptPubkey.getPermission()) { if(permsPubkey.hasFullPermission()) { System.out.println("このPDFではすべての権限が許可されています"); } else { System.out.println("このPDFでは個別に権限の許可・許可しないが設定されます"); } // 印刷権限取得 switch (permsPubkey.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 (permsPubkey.getModify()) { case PERM_MODIFY_NOT_ALLOWED: System.out.println("変更権限 : 許可しない"); break; case PERM_MODIFY_ASSEMBLEDOC: 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 (permsPubkey.getCopy()) { System.out.println("テキスト、画像、その他の内容のコピーを有効にする"); } else { System.out.println("テキスト、画像、その他の内容のコピーを有効にしない"); } // スクリーンリーダーデバイスのテキストアクセスを有効にするかどうかの取得 if (permsPubkey.getAccessibility()) { System.out.println("スクリーンリーダーデバイスのテキストアクセスを有効にする"); } else { System.out.println("スクリーンリーダーデバイスのテキストアクセスを有効にしない"); } } } /** * 標準セキュリティハンドラの情報を取得するメソッド * @param encryptStandard 標準セキュリティハンドラを表すクラス * @throws PtlException * @throws Exception * @throws Error */ private static void getEncryptStandardInfo(PtlEncryptStandard encryptStandard) throws PtlException, Exception, Error { System.out.println("---セキュリティハンドラのタイプは標準セキュリティハンドラです。---"); // getFilterType()に判定済みなので PtlEncryptStandard にダウンキャストする。 // 標準セキュリティハンドラのメソッド取得 switch (encryptStandard.getMethod()) { case METHOD_RC4: System.out.println("標準セキュリティハンドラのメソッド : RC4"); break; case METHOD_AES: System.out.println("標準セキュリティハンドラのメソッド : AES"); break; } // ユーザアクセス許可フラグの取得 System.out.println("--ユーザアクセス許可フラグの情報を取得します--"); 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_ASSEMBLEANDFORM: 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_ASSEMBLEDOC: 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.getAccessibility()) { System.out.println("スクリーンリーダーデバイスのテキストアクセスを有効にする"); } else { System.out.println("スクリーンリーダーデバイスのテキストアクセスを有効にしない"); } } break; } } } }
GetEncryptInfoPubkeyPKCS12.java
C:\samples>java cookbook.GetEncryptInfoPubkeyPKCS12 usage: java GetEncryptInfoPubkeyPKCS12 in-pdf-file PKCS#12-path [pkcs#12-password] C:\samples>java cookbook.GetEncryptInfoPubkeyPKCS12 Output_EncryptSetPubKeyWithX509.pdf testPKCS12.pfx testtest 暗号化のキー長 : 256 文書の全てのコンテンツを暗号化 ---セキュリティハンドラのタイプは公開キーセキュリティハンドラです。--- 公開キーセキュリティハンドラのメソッド : AES --ユーザアクセス許可フラグの情報を取得します-- このPDFでは個別に権限の許可・許可しないが設定されます 印刷権限 : 許可しない 変更権限 : 許可しない テキスト、画像、その他の内容のコピーを有効にしない スクリーンリーダーデバイスのテキストアクセスを有効にしない -- 完了 --