1.1.3 暗号化の対象

images/EncryptSetEncComponent-top.png

狙い・効果

PDF文書の暗号化の対象を指定します。

処理の概要

PDF文書の暗号化の対象は、①文書の全てのコンテンツを暗号化、②文書のメタデータを除くすべてのコンテンツを暗号化(PDF 1.5以降)、③添付ファイルのみ暗号化の中から選択します。

PDFの仕様上は、添付ファイルのみ暗号化を除いて、ユーザーパスワードとオーナーパスワードで設定できます。添付ファイルのみの暗号化はユーザーパスワードのみです。

本プログラム例では次の制約があります。

入力PDF文書に添付ファイルが設定されていない場合に「添付ファイルのみ暗号化」を選択すると、全てのコンテンツを暗号化します。

なお、元のPDF文書の内容について、オーナーパスワードによる利用制限が設定されているとき、利用制限情報を残したまま暗号化の対象を「添付ファイルのみ暗号化」に変更するとエラー出力されます。本プログラムではオーナーパスワードを入力して利用制限を破棄することでエラーを回避しています。

『PDF Tool API』の主な機能

暗号化の対象は、次表の列挙型定数で指定します。

表1・5 暗号化の対象
列挙型定数説明
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

入出力操作の例

images/EncryptSetEncComponent.png