
PDF文書の暗号化の対象を指定します。
PDF文書の暗号化の対象は、①文書の全てのコンテンツを暗号化、②文書のメタデータを除くすべてのコンテンツを暗号化(PDF 1.5以降)、③添付ファイルのみ暗号化の中から選択します。
PDFの仕様上は、添付ファイルのみ暗号化を除いて、ユーザーパスワードとオーナーパスワードで設定できます。添付ファイルのみの暗号化はユーザーパスワードのみです。
本プログラム例では次の制約があります。
入力PDF文書に添付ファイルが設定されていない場合に「添付ファイルのみ暗号化」を選択すると、全てのコンテンツを暗号化します。
なお、元のPDF文書の内容について、オーナーパスワードによる利用制限が設定されているとき、利用制限情報を残したまま暗号化の対象を「添付ファイルのみ暗号化」に変更するとエラー出力されます。本プログラムではオーナーパスワードを入力して利用制限を破棄することでエラーを回避しています。
暗号化の対象は、次表の列挙型定数で指定します。
| 列挙型定数 | 説明 |
|---|---|
| ENCRYPT_ALL | 文書の全てのコンテンツを暗号化 |
| ENCRYPT_EXCEPT_METADATA | 文書のメタデータを除く全てのコンテンツを暗号化(PDF 1.5以降) |
| ENCRYPT_ONLY_ATTACHED_FILE | 添付ファイルのみを暗号化 |
『PDF Tool API』では添付ファイルのみの暗号化はAES暗号のみ対応しているためPDF 1.6から有効です。
package cookbook;
import java.io.*;
import jp.co.antenna.ptl.*;
public class EncryptSetEncComponent {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
if (args.length < 3)
{
System.out.print("usage: java EncryptSetEncComponent in-pdf-file out-pdf-file ");
System.out.println("out-pdf-userpass [in-pdf-password]");
return;
}
// コマンドライン引数の取得
String outUserPass = args[2];
try (PtlParamInput inputFile = new PtlParamInput(args[0]);
PtlParamOutput outputFile = new PtlParamOutput(args[1]);
PtlPDFDocument doc = new PtlPDFDocument();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)))
{
if (args.length > 3)
{
String password = (String)args[3];
// パスワードのセット
doc.setPassword(password);
}
// PDFファイルをロードします。
doc.load(inputFile);
// 暗号化するコンテンツを選択
System.out.println("暗号化するコンテンツを選択します。");
System.out.println("暗号化する文書コンポーネントを以下から数値で指定してください。");
System.out.println("これ以外の数値が指定された場合は 0 とみなされます。");
System.out.println("0 : 文書の全てのコンテンツを暗号化");
System.out.println("1 : 文書のメタデータを除く全てのコンテンツを暗号化");
System.out.println("2 : 添付ファイルのみを暗号化");
int encComponent = Integer.parseInt(br.readLine());
System.out.println("256 bit AES で暗号化します。");
System.out.println("また、全ての権限情報は破棄されます。");
// 暗号化するコンポーネントを変更。
encrypt256AESsetEncComponent(doc, outUserPass, encComponent);
...【EncryptWithUserPass.javaと同じ処理のため省略
・PtlParamOutputを用いてPtlPDFDocument docの内容を出力
・PtlException, Exception, Error を catchするエラー処理
・finally文で"--完了--"と表示する処理】...
}
public static void encrypt256AESsetEncComponent(PtlPDFDocument doc, String outUserPass,
int encComponent)
throws PtlException, IOException, Exception, Error
{
// 256 bit AES
try (PtlEncryptStandard256AES enc256 = new PtlEncryptStandard256AES())
{
switch(encComponent)
{
case 0:
default:
System.out.println("全てのコンテンツを暗号化します。");
enc256.setEncryptComponent(PtlEncrypt.ENCRYPT_COMPONENT.ENCRYPT_ALL);
break;
case 1:
System.out.println("メタデータを除く全てのコンテンツを暗号化します。");
enc256.setEncryptComponent(PtlEncrypt.ENCRYPT_COMPONENT.ENCRYPT_EXCEPT_METADATA);
break;
case 2:
System.out.println("添付ファイルのみ暗号化します。");
System.out.print("in-pdf-file に添付ファイルが設定されていない場合、");
System.out.println("「0 : 全てのコンテンツを暗号化」と同じ処理がなされます。");
enc256.setEncryptComponent(PtlEncrypt.ENCRYPT_COMPONENT.ENCRYPT_ONLY_ATTACHED_FILE);
break;
}
enc256.setUserPassword(outUserPass);
// 暗号化情報の設定
doc.setEncrypt(enc256);
}
}
}
EncryptSetEncComponent.java
