オーナーパスワードによりPDF文書の内容のコピー制限を設定します。
オーナーパスワードによりPDF文書の内容のコピーを許可するか、しないかの設定ができます。権限設定にはタイプ1とタイプ2があります(表1・6 権限設定のタイプを参照)。ただし、『PDF Tool API V7.0』以降では40ビットRC4を用いた暗号化は禁止されているため、タイプ1の権限設定を指定することはできません。
本プログラム例では指定されたPDF文書のコピー可否セキュリティを設定します。
package cookbook; import java.io.*; import jp.co.antenna.ptl.*; public class EncryptSetCopy { // そのクラスのusageを表示する関数 public static void printUsage() { System.out.print("usage: java EncryptSetCopy in-pdf-file out-pdf-file "); System.out.println("コピー可否 out-pdf-ownerpass [in-pdf-password]"); System.out.println("コピー可否\n0 : コピーを許可しない 1 : コピーを許可する"); } /** * @param args the command line arguments */ public static void main(String[] args) { if (args.length < 4) { printUsage(); // usageメッセージの表示 return; } // コマンドライン引数の取得 boolean permCopy = false; switch (args[2]) { case "0": permCopy = false; System.out.println("この文書の内容コピーを不許可に設定します。"); break; case "1": permCopy = true; System.out.println("この文書の内容コピーを許可に設定します。"); break; default: System.out.println("コピー可否は、0か1の数値で指定してください。"); printUsage(); // usageメッセージの表示 return; } String outOwnerPass = args[3]; ...【EncryptSetEncComponent.javaと同じ処理のため省略 ・PtlParamInputを用いてPtlPDFDocument docに入力PDFをロード ・PtlParamOutputを用いて出力PDF名を指定 ・BufferedReader brを設定してキー入力読み取りを準備する ・入力PDF用パスワードが指定されていればそれをセットした上でPDFをロードする】... // 暗号化の有無判定 if (doc.isEncrypted()) { // 暗号化情報の取得 setPermCopy(doc, outOwnerPass, permCopy); } else { System.out.println("暗号化されていないファイルです。\n"); System.out.println("コピーの可否を設定して暗号化します。"); System.out.println("暗号化種類の設定をします。0から2の数値を指定してください。"); System.out.println("それ以外の数値が設定された場合は 2 が選択されたものとして扱います。"); System.out.println("暗号化種類\n0 : 128 bit RC4 1 : 128 bit AES 2 : 256 bit AES"); int kind; try { kind = Integer.parseInt(br.readLine()); // セキュリティ設定 switch (kind) { case 0: // 128 bit RC4 encrypt128RC4setCopy(doc, outOwnerPass, permCopy); break; case 1: // 128 bit AES encrypt128AESsetCopy(doc, outOwnerPass, permCopy); break; case 2: default: // 256 bit AES encrypt256AESsetCopy(doc, outOwnerPass, permCopy); break; } } catch (NumberFormatException numfe) { System.out.println("暗号化の種類指定は整数を用いてください。"); numfe.printStackTrace(); } } ...【EncryptWithUserPass.javaと同じ処理のため省略 ・PtlParamOutputを用いてPtlPDFDocument docの内容を出力 ・PtlException, Exception, Error を catchするエラー処理 ・finally文で"--完了--"と表示する処理】... } public static void encrypt128RC4setCopy(PtlPDFDocument doc, String outOwnerPass, boolean permCopy) throws PtlException, IOException, Exception, Error { // 128 bit RC4 System.out.println("128 bit RC4暗号化が選択されました。"); try (PtlEncryptStandard128RC4 enc128r = new PtlEncryptStandard128RC4()) { setCopyWithDefaultPermission(doc, outOwnerPass, permCopy, enc128r); } } public static void encrypt128AESsetCopy(PtlPDFDocument doc, String outOwnerPass, boolean permCopy) throws PtlException, IOException, Exception, Error { // 128 bit AES System.out.println("128 bit AES暗号化が選択されました。"); try (PtlEncryptStandard128AES enc128a = new PtlEncryptStandard128AES()) { setCopyWithDefaultPermission(doc, outOwnerPass, permCopy, enc128a); } } public static void encrypt256AESsetCopy(PtlPDFDocument doc, String outOwnerPass, boolean permCopy) throws PtlException, IOException, Exception, Error { // 256 bit AES System.out.println("256 bit AES暗号化が選択されました。"); try (PtlEncryptStandard256AES enc256 = new PtlEncryptStandard256AES()) { setCopyWithDefaultPermission(doc, outOwnerPass, permCopy, enc256); } } public static void setCopyWithDefaultPermission(PtlPDFDocument doc, String outOwnerPass, boolean permCopy, PtlEncryptStandard enc) throws PtlException, IOException, Exception, Error { ...【EncryptSetPrint.javaのsetPrintWithDefaultPermission()と同じ処理のため省略。 ・暗号化の範囲を全てのコンテンツに設定。 ・オーナーパスワードを設定。】... // PtlEncryptPermissionType2で権限設定を行う try (PtlEncryptPermissionType2 perms2 = new PtlEncryptPermissionType2()) { // 印刷権限の設定 // PERM_PRINT_HIGH : 高解像度での印刷を許可 perms2.setPrint(PtlEncryptPermissionType2.PERMISSION_PRINT.PERM_PRINT_HIGH); // 変更権限の設定 // ページ抽出を除く全ての動作を許可 perms2.setModify(PtlEncryptPermissionType2.PERMISSION_MODIFY.PERM_MODIFY_MODYFYDOC); // テキスト、画像、その他の内容のコピーを有効にするかどうかの設定 perms2.setCopy(permCopy); // スクリーンリーダーデバイスのテキストアクセスを有効にするかどうかの設定 // true: 有効にする perms2.setAccessibility(true); // ユーザアクセス許可フラグの設定 enc.setPermission(perms2); } // 暗号化情報の設定 doc.setEncrypt(enc); } public static void setPermCopy(PtlPDFDocument doc, String outOwnerPass, boolean permCopy) throws PtlException, IOException, Exception, Error { ...【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("新規に暗号化します。"); encrypt128RC4setCopy(doc, outOwnerPass, permCopy); break; case PERM_TYPE2: // getType()で判定されたのでpermsをダウンキャストできる。 try(PtlEncryptPermissionType2 perms2 = (PtlEncryptPermissionType2)perms) { // テキスト、画像、その他の内容のコピーを有効にするかどうかの設定 perms2.setCopy(permCopy); encryptStandard.setPermission(perms2); } encryptStandard.setOwnerPassword(outOwnerPass); doc.setEncrypt(encryptStandard); // 暗号化情報の設定 break; } ...【EncryptSetPrint.javaと同じ処理のため省略。 ・標準セキュリティハンドラ以外が与えられた際の例外処理。】... } } }
EncryptSetCopy.java
最初の例は、暗号化キーの長さ128ビットRC4で、タイプ2の権限設定の内容のコピーに関する制限設定をします。
次は、暗号化キーの長さ40ビットRC4で、タイプ1の権限設定の内容のコピーに関する制限設定をします。