オーナーパスワードによりPDF文書の変更に関する制限を設定します。
オーナーパスワードでPDF文書の変更を許可するか、しないかの設定ができます。
権限設定にはタイプ1とタイプ2があります(表1・6 権限設定のタイプを参照)。ただし、『PDF Tool API V7.0』以降では40ビットRC4を用いた暗号化は禁止されているため、タイプ1の権限設定を指定することはできません。
列挙型定数 | 説明 |
---|---|
PERM_MODIFY_ANNOTANDFORM | 注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名を許可 権限フラグの6,9ビット目をOn |
PERM_MODIFY_ASSENBLEDOC | ページの挿入、削除、回転を許可 権限フラグの11ビット目をOn |
PERM_MODIFY_FILLFORM | フォームフィールドの入力と既存の署名フィールドに署名を許可 権限フラグの9ビット目をOn |
PERM_MODIFY_MODYFYDOC | ページ抽出を除く全ての動作を許可 権限フラグの4,6,9ビット目をOn |
PERM_MODIFY_NOT_ALLOWED | 許可しない |
本プログラム例では指定されたPDFの変更可否セキュリティを設定します。
package cookbook; import java.io.*; import jp.co.antenna.ptl.*; public class EncryptSetModify { /** * @param args the command line arguments */ public static void main(String[] args) { if (args.length < 3) { System.out.print("usage: java EncryptSetModify in-pdf-file out-pdf-file "); System.out.println("out-pdf-ownerpass [in-pdf-password]"); return; } // コマンドライン引数の取得 String outOwnerPass = args[2]; ...【EncryptSetEncComponent.javaと同じ処理のため省略 ・PtlParamInputを用いてPtlPDFDocument docに入力PDFをロード ・PtlParamOutputを用いて出力PDF名を指定 ・BufferedReader brを設定してキー入力読み取りを準備する ・入力PDF用パスワードが指定されていればそれをセットした上でPDFをロードする】... // 暗号化の有無判定 if (doc.isEncrypted()) { // 暗号化情報の取得 setPermModify(doc, outOwnerPass, br); } else { System.out.println("暗号化されていないファイルです。\n"); System.out.println("変更権限を設定して暗号化します。"); System.out.println("暗号化種類の設定をします。0から2の数値を指定してください。"); System.out.println("それ以外の数値が設定された場合は 2 が選択されたものとして扱います。"); System.out.println("暗号化種類"); System.out.println("0 : 128 bit RC4 1 : 128 bit AES 2 : 256 bit AES"); int kind = Integer.parseInt(br.readLine()); // セキュリティ設定 switch (kind) { case 0: // 128 bit RC4 encrypt128RC4setModify(doc, outOwnerPass, br); break; case 1: // 128 bit AES encrypt128AESsetModify(doc, outOwnerPass, br); break; case 2: default: // 256 bit AES encrypt256AESsetModify(doc, outOwnerPass, br); break; } } ...【EncryptWithUserPass.javaと同じ処理のため省略 ・PtlParamOutputを用いてPtlPDFDocument docの内容を出力 ・PtlException, Exception, Error を catchするエラー処理 ・finally文で"--完了--"と表示する処理】... } public static void encrypt40RC4setModify(PtlPDFDocument doc, String outOwnerPass, BufferedReader br) throws PtlException, IOException, Exception, Error { // 40 bit RC4 System.out.println("40 bit RC4暗号化が選択されました。"); try (PtlEncryptStandard40RC4 enc40 = new PtlEncryptStandard40RC4()) { setModifyWithDefaultPermission(doc, outOwnerPass, br, enc40); } } public static void encrypt128RC4setModify(PtlPDFDocument doc, String outOwnerPass, BufferedReader br) throws PtlException, IOException, Exception, Error { // 128 bit RC4 System.out.println("128 bit RC4暗号化が選択されました。"); try (PtlEncryptStandard128RC4 enc128r = new PtlEncryptStandard128RC4()) { setModifyWithDefaultPermission(doc, outOwnerPass, br, enc128r); } } public static void encrypt128AESsetModify(PtlPDFDocument doc, String outOwnerPass, BufferedReader br) throws PtlException, IOException, Exception, Error { // 128 bit AES System.out.println("128 bit AES暗号化が選択されました。"); try (PtlEncryptStandard128AES enc128a = new PtlEncryptStandard128AES()) { setModifyWithDefaultPermission(doc, outOwnerPass, br, enc128a); } } public static void encrypt256AESsetModify(PtlPDFDocument doc, String outOwnerPass, BufferedReader br) throws PtlException, IOException, Exception, Error { // 256 bit AES System.out.println("256 bit AES暗号化が選択されました。"); try (PtlEncryptStandard256AES enc256 = new PtlEncryptStandard256AES()) { setModifyWithDefaultPermission(doc, outOwnerPass, br, enc256); } } public static void setModifyWithDefaultPermission(PtlPDFDocument doc, String outOwnerPass, BufferedReader br, PtlEncryptStandard enc) throws PtlException, IOException, Exception, Error { // 暗号化するコンテンツ // 文書の全てのコンテンツを暗号化します。 enc.setEncryptComponent(PtlEncrypt.ENCRYPT_COMPONENT.ENCRYPT_ALL); // オーナーパスワード値の設定 enc.setOwnerPassword(outOwnerPass); // PtlEncryptPermissionType2で権限設定を行う try (PtlEncryptPermissionType2 perms2 = new PtlEncryptPermissionType2()) { // 変更権限の設定 String permModify2 = setModifyForPermType2(br); perms2.setModify(PtlEncryptPermissionType2.PERMISSION_MODIFY.valueOf(permModify2)); // 印刷権限の設定 PERM_PRINT_HIGH : 高解像度での印刷を許可 perms2.setPrint(PtlEncryptPermissionType2.PERMISSION_PRINT.PERM_PRINT_HIGH); // テキスト、画像、その他の内容のコピーを有効にするかどうかの設定 true: 有効にする perms2.setCopy(true); // スクリーンリーダーデバイスのテキストアクセスを有効にするかどうかの設定 // true: 有効にする perms2.setAccessibility(true); // ユーザアクセス許可フラグの設定 enc.setPermission(perms2); } // 暗号化情報の設定 doc.setEncrypt(enc); } public static void setPermModify(PtlPDFDocument doc,String outOwnerPass, BufferedReader br) throws PtlException, IOException, Exception, Error { try (PtlEncrypt encrypt = doc.getEncrypt()) { ...【EncryptSetPrint.javaと同じ処理のため省略。 ・PtlPDFDocument docが保持している暗号化情報PtlEncrypt encryptの取得。 ・標準セキュリティハンドラであることを確認し、encryptをPtlEncryptStandardにダウンキャスト。 ・ユーザーアクセス許可フラグPtlEncryptPermission permsの取得】... // タイプ取得 switch (perms.getType()) { case PERM_TYPE1: // Type 1は40bit RC4なので、128bit RC4で新規に権限を設定する。 System.out.println("入力ファイルは40 bit RC4暗号で暗号化されています。"); System.out.println("新規に暗号化します。"); encrypt128RC4setModify(doc, outOwnerPass, br); break; case PERM_TYPE2: // getType()で判定されたのでpermsをダウンキャストできる。 PtlEncryptPermissionType2 perms2 = (PtlEncryptPermissionType2)perms; // 編集権限設定 String permModify2 = setModifyForPermType2(br); perms2.setModify(PtlEncryptPermissionType2.PERMISSION_MODIFY.valueOf(permModify2)); encryptStandard.setPermission(perms2); encryptStandard.setOwnerPassword(outOwnerPass); // 暗号化情報の設定 doc.setEncrypt(encryptStandard); break; } } ...【EncryptSetPrint.javaと同じ処理のため省略。 ・標準セキュリティハンドラ以外が与えられた際の例外処理。】... } } } public static String setModifyForPermType2(BufferedReader br) throws PtlException, IOException, Exception, Error { System.out.println("変更権限の設定をします。以下から数値で指定してください。"); System.out.println("これ以外の数値が指定された場合は 0 とみなされます。"); System.out.println("0 : 許可しない"); System.out.println("1 : 注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名を許可"); System.out.println("2 : ページの挿入、削除、回転を許可"); System.out.println("3 : フォームフィールドの入力と既存の署名フィールドに署名を許可"); System.out.println("4 : ページ抽出を除く全ての動作を許可"); int choiceOfPerm = Integer.parseInt(br.readLine()); String permModify2 = "PERM_MODIFY_NOT_ALLOWED"; switch (choiceOfPerm) { case 0: // PERM_MODIFY_NOT_ALLOWEDを用いるため、変更無し break; case 1: permModify2 = "PERM_MODIFY_ANNOTANDFORM"; break; case 2: permModify2 = "PERM_MODIFY_ASSEMBLEDOC"; break; case 3: permModify2 = "PERM_MODIFY_FILLFORM"; break; case 4: permModify2 = "PERM_MODIFY_MODYFYDOC"; break; default: // PERM_MODIFY_NOT_ALLOWEDを用いるため、変更無し break; } return permModify2; } }
EncryptSetModify.java
最初の例は、暗号化キーの長さ40ビットRC4で、タイプ1の権限設定の変更に関する制限設定をします。
次は、暗号化キーの長さ128ビットRC4で、タイプ2の権限設定の変更に関する制限設定をします。