PDF文書にユーザーパスワードによるセキュリティを設定します。
PDF文書を入力してユーザーパスワードによるセキュリティを設定します。ユーザーパスワードによるセキュリティを設定すると、PDFリーダーや編集ソフトなどでPDF文書を開くときにパスワードの入力を求めるようになります。正しいパスワードを入力しないとPDF文書を開くことができません。
PDF Tool APIには暗号化の種類(暗号化のアルゴリズムと暗号化のキーの長さ)を表現する4つのクラスが用意されています。本プログラム例では「暗号化種類」パラメータの数値でそれら暗号化の種類を設定します。
パラメータ | 暗号化の種類 | 暗号化クラス |
---|---|---|
0 | 40ビットRC4 | PtlEncryptStandard40RC4 |
1 | 128ビットRC4 | PtlEncryptStandard128RC4 |
2 | 128ビットAES | PtlEncryptStandard128AES |
3 | 256ビットAES | PtlEncryptStandard256AES |
PDFの上位バージョンほど強力な暗号が使えます。指定した暗号化の種類によっては、出力PDF文書のバージョンをより上位バージョンに変更します(表1・2 PDF Tool APIで出力されるPDF文書のバージョンを参照)。
本プログラム例では、暗号化する文書コンポーネントは「全て暗号化」に固定しています。詳しくは1.1.3 暗号化の対象を参照してください。
package cookbook; import jp.co.antenna.ptl.*; public class EncryptWithUserPass { // そのクラスのusageを表示する関数 public static void printUsage(){ System.out.print("usage: java EncryptWithUserPass in-pdf-file out-pdf-file "); System.out.println("暗号化種類 out-pdf-userpass [in-pdf-password]\n"); System.out.println("暗号化種類"); System.out.println("0 : 40 bit RC4 1 : 128 bit RC4 2 : 128 bit AES 3 : 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: case 3: break; default: System.out.println("暗号化種類には、0から3の数値を指定してください。"); printUsage(); // usageメッセージの表示 return; } } catch(NumberFormatException nfe) { System.out.println("暗号化種類には、0から3の数値を指定してください。"); printUsage(); // usageメッセージの表示 return; } // コマンドライン引数の取得 String outUserPass = args[3]; try (PtlParamInput inputFile = new PtlParamInput(args[0]); PtlParamOutput outputFile = new PtlParamOutput(args[1]); PtlPDFDocument doc = new PtlPDFDocument()) { if (args.length > 4) { String password = (String)args[4]; // パスワードのセット doc.setPassword(password); } // PDFファイルをロードします。 doc.load(inputFile); // セキュリティ設定 switch (kind) { case 0: // 40 bit RC4 encrypt40RC4withUserPass(doc, outUserPass); break; case 1: // 128 bit RC4 encrypt128RC4withUserPass(doc, outUserPass); break; case 2: // 128 bit AES encrypt128AESwithUserPass(doc, outUserPass); break; case 3: // 256 bit AES encrypt256AESwithUserPass(doc, outUserPass); break; } // ファイルに保存します。 doc.save(outputFile); } ...【GetEncryptInfo.javaと同じ処理のため省略 ・PtlException, Exception, Error を catchするエラー処理 ・finally文で"--完了--"と表示する処理】... } public static void encrypt40RC4withUserPass(PtlPDFDocument doc, String outUserPass) throws PtlException, Exception, Error { // 40 bit RC4 System.out.println("40 bit RC4暗号化の設定をします。"); try (PtlEncryptStandard40RC4 enc40 = new PtlEncryptStandard40RC4()) { setEncryptWithUserPass(doc, outUserPass, enc40); } } public static void encrypt128RC4withUserPass(PtlPDFDocument doc, String outUserPass) throws PtlException, Exception, Error { // 128 bit RC4 System.out.println("128 bit RC4暗号化の設定をします。"); try (PtlEncryptStandard128RC4 enc128r = new PtlEncryptStandard128RC4()) { setEncryptWithUserPass(doc, outUserPass, enc128r); } } public static void encrypt128AESwithUserPass(PtlPDFDocument doc, String outUserPass) throws PtlException, Exception, Error { // 128 bit AES System.out.println("128 bit AES暗号化の設定をします。"); try (PtlEncryptStandard128AES enc128a = new PtlEncryptStandard128AES()) { setEncryptWithUserPass(doc, outUserPass, enc128a); } } public static void encrypt256AESwithUserPass(PtlPDFDocument doc, String outUserPass) throws PtlException, Exception, Error { // 256 bit AES System.out.println("256 bit AES暗号化の設定をします。"); try (PtlEncryptStandard256AES enc256 = new PtlEncryptStandard256AES()) { setEncryptWithUserPass(doc, outUserPass, enc256); } } public static void setEncryptWithUserPass(PtlPDFDocument doc, String outUserPass, PtlEncryptStandard enc) throws PtlException, Exception, Error { // 暗号化するコンテンツを設定 // ENCRYPT_ALL : 全て暗号化 enc.setEncryptComponent(PtlEncrypt.ENCRYPT_COMPONENT.ENCRYPT_ALL); // ユーザパスワード値の設定 enc.setUserPassword(outUserPass); doc.setEncrypt(enc); } }
EncryptWithUserPass.java
ユーザーパスワードを設定する例です。
最初の例は、暗号化キーの長さ128ビットRC4で、パスワードのかかっていないPDF文書を暗号化しています。次の例は、最初に暗号化したPDF文書を入力して、暗号化キーの長さ128ビットAESで暗号化し直しています。