PDF文書にオーナーパスワードによる利用制限を設定します。
PDF文書にオーナーパスワードを設定すると、PDF文書の内容の利用制限を設定できます。本サンプルではオーナーパスワード設定時の暗号アルゴリズムの選択、および暗号キーの長さを指定する方法を示します。
文書内容の利用制限は①印刷権限設定、②変更権限設定、③コピー権限設定、④アクセシビリティ権限設定が全て「許可しない」固定になっています。利用制限の設定については次項以降で詳しく説明します。
なお、『PDF Tool API V7.0』以降では40ビットRC4を用いた暗号化は禁止されているため、本プログラムで40ビット RC4を指定することはできません。
package cookbook; import jp.co.antenna.ptl.*; public class EncryptWithOwnerPass { // そのクラスのusageを表示する関数 public static void printUsage() { System.out.print("usage: java EncryptWithOwnerPass in-pdf-file out-pdf-file"); System.out.println("暗号化種類 out-pdf-ownerpass [in-pdf-password]\n"); System.out.println("暗号化種類"); System.out.println("0 : 128 bit RC4 1 : 128 bit AES 2 : 256 bit AES"); } /** * @param args the command line arguments */ public static void main(String[] args) { if (args.length < 4) { printUsage(); // usageメッセージの表示 return; } int kind; try { kind = Integer.parseInt(args[2]); switch (kind) { case 0: case 1: case 2: break; default: System.out.println("暗号化種類には、0から2の数値を指定してください。"); printUsage(); // usageメッセージの表示 return; } } catch(NumberFormatException numfe) { System.out.println("暗号化種類には、0から2の数値を指定してください。"); printUsage(); // usageメッセージの表示 return; } // コマンドライン引数の取得 String outOwnerpass = args[3]; ...【EncryptWithUserPass.javaと同じ処理のため省略 ・PtlParamInputを用いてPtlPDFDocument docに入力PDFをロード ・PtlParamOutputを用いて出力PDF名を指定 ・入力PDF用パスワードが指定されていればそれをセットした上でPDFをロードする】... // セキュリティ設定 switch (kind) { case 0: // 128 bit RC4 encrypt128RC4withUserPass(doc, outUserPass); break; case 1: // 128 bit AES encrypt128AESwithUserPass(doc, outUserPass); break; case 2: // 256 bit AES encrypt256AESwithUserPass(doc, outUserPass); break; } ...【EncryptWithUserPass.javaと同じ処理のため省略 ・PtlParamOutputを用いてPtlPDFDocument docの内容を出力 ・PtlException, Exception, Error を catchするエラー処理 ・finally文で"--完了--"と表示する処理】... } public static void encrypt128RC4withOwnerpass(PtlPDFDocument doc, String outOwnerpass) throws PtlException, Exception, Error { // 128 bit RC4 System.out.println("128 bit RC4暗号化の設定をします。"); try (PtlEncryptStandard128RC4 enc128r = new PtlEncryptStandard128RC4()) { setEncryptWithOwnerpass(doc, outOwnerpass, enc128r); } } public static void encrypt128AESwithOwnerpass(PtlPDFDocument doc, String outOwnerpass) throws PtlException, Exception, Error { // 128 bit AES System.out.println("128 bit AES暗号化の設定をします。"); try (PtlEncryptStandard128AES enc128a = new PtlEncryptStandard128AES()) { setEncryptWithOwnerpass(doc, outOwnerpass, enc128a); } } public static void encrypt256AESwithOwnerpass(PtlPDFDocument doc, String outOwnerpass) throws PtlException, Exception, Error { // 256 bit AES System.out.println("256 bit AES暗号化の設定をします。"); try (PtlEncryptStandard256AES enc256 = new PtlEncryptStandard256AES()) { setEncryptWithOwnerpass(doc, outOwnerpass, enc256); } } public static void setEncryptWithOwnerpass(PtlPDFDocument doc, String outOwnerpass, PtlEncryptStandard enc) throws PtlException, Exception, Error { // 暗号化するコンテンツを設定 // ENCRYPT_ALL : 全て暗号化 enc.setEncryptComponent(PtlEncrypt.ENCRYPT_COMPONENT.ENCRYPT_ALL); // ユーザパスワード値の設定 enc.setOwnerPassword(outOwnerpass); // ユーザアクセス許可フラグの取得・設定 try (PtlEncryptPermissionType2 perms2 = new PtlEncryptPermissionType2()) { // 印刷権限の設定 // PERM_PRINT_NOT_ALLOWED : 許可しない perms2.setPrint(PtlEncryptPermissionType2.PERMISSION_PRINT.PERM_PRINT_NOT_ALLOWED); // 変更権限の設定 // PERM_MODIFY_NOT_ALLOWED : 許可しない perms2.setModify(PtlEncryptPermissionType2.PERMISSION_MODIFY.PERM_MODIFY_NOT_ALLOWED); // テキスト、画像、その他の内容のコピーを有効にするかどうかの設定 // false : 有効にしない perms2.setCopy(false); // スクリーンリーダーデバイスのテキストアクセスを有効にするかどうかの設定 // false : 有効にしない perms2.setAccessibility(false); // ユーザアクセス許可フラグの設定 enc.setPermission(perms2); } doc.setEncrypt(enc); } }
EncryptWithOwnerPass.java
オーナーパスワードを設定する例です。
最初の例は、暗号化キーの長さ128ビットRC4で、パスワードのかかっていないPDF文書を暗号化しています。次の例は、最初に暗号化したPDF文書を入力して、暗号化キーの長さ128ビットAESで暗号化し直しています。