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