
オーナーパスワードにより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の権限設定の内容のコピーに関する制限設定をします。
