1.2.1 オーナーパスワードの設定

images/EncryptWithOwnerPass-top.png

狙い・効果

PDF文書にオーナーパスワードによる利用制限を設定します。

処理の概要

PDF文書にオーナーパスワードを設定すると、PDF文書の内容の利用制限を設定できます。本サンプルではオーナーパスワード設定時の暗号アルゴリズムの選択、および暗号キーの長さを指定する方法を示します。

文書内容の利用制限は①印刷権限設定、②変更権限設定、③コピー権限設定、④アクセシビリティ権限設定が全て「許可しない」固定になっています。利用制限の設定については次項以降で詳しく説明します。

なお、『PDF Tool API V7.0』以降では40ビットRC4を用いた暗号化は禁止されているため、本プログラムで40ビット RC4を指定することはできません。

『PDF Tool API』の主な機能

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class EncryptWithOwnerPass {

    // そのクラスのusageを表示する関数
    public static void printUsage() {
        System.out.print("usage: java EncryptWithOwnerPass in-pdf-file out-pdf-file");
        System.out.println("暗号化種類 out-pdf-ownerpass [in-pdf-password]\n");
        System.out.println("暗号化種類");
        System.out.println("0 : 128 bit RC4  1 : 128 bit AES  2 : 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:
                break;
            default:
                System.out.println("暗号化種類には、0から2の数値を指定してください。");
                printUsage(); // usageメッセージの表示
                return;
            }
        }
        catch(NumberFormatException numfe) {
            System.out.println("暗号化種類には、0から2の数値を指定してください。");
            printUsage(); // usageメッセージの表示
            return;
        }
        // コマンドライン引数の取得
        String outOwnerpass = args[3];
        ...【EncryptWithUserPass.javaと同じ処理のため省略
             ・PtlParamInputを用いてPtlPDFDocument docに入力PDFをロード
             ・PtlParamOutputを用いて出力PDF名を指定
             ・入力PDF用パスワードが指定されていればそれをセットした上でPDFをロードする】...

            // セキュリティ設定
            switch (kind) {
            case 0:
                // 128 bit RC4
                encrypt128RC4withUserPass(doc, outUserPass);
                break;
            case 1:
                // 128 bit AES
                encrypt128AESwithUserPass(doc, outUserPass);
                break;
            case 2:
                // 256 bit AES
                encrypt256AESwithUserPass(doc, outUserPass);
                break;
            }
        ...【EncryptWithUserPass.javaと同じ処理のため省略
             ・PtlParamOutputを用いてPtlPDFDocument docの内容を出力
             ・PtlException, Exception, Error を catchするエラー処理
             ・finally文で"--完了--"と表示する処理】...
    }

    public static void encrypt128RC4withOwnerpass(PtlPDFDocument doc, String outOwnerpass)
        throws PtlException, Exception, Error
    {
        // 128 bit RC4
        System.out.println("128 bit RC4暗号化の設定をします。");
        try (PtlEncryptStandard128RC4 enc128r = new PtlEncryptStandard128RC4())
        {
            setEncryptWithOwnerpass(doc, outOwnerpass, enc128r);
        }
    }

    public static void encrypt128AESwithOwnerpass(PtlPDFDocument doc, String outOwnerpass)
        throws PtlException, Exception, Error
    {
        // 128 bit AES
        System.out.println("128 bit AES暗号化の設定をします。");
        try (PtlEncryptStandard128AES enc128a = new PtlEncryptStandard128AES())
        {
            setEncryptWithOwnerpass(doc, outOwnerpass, enc128a);
        }
    }

    public static void encrypt256AESwithOwnerpass(PtlPDFDocument doc, String outOwnerpass)
        throws PtlException, Exception, Error
    {
        // 256 bit AES
        System.out.println("256 bit AES暗号化の設定をします。");
        try (PtlEncryptStandard256AES enc256 = new PtlEncryptStandard256AES())
        {
            setEncryptWithOwnerpass(doc, outOwnerpass, enc256);
        }
    }

    public static void setEncryptWithOwnerpass(PtlPDFDocument doc, String outOwnerpass, PtlEncryptStandard enc)
        throws PtlException, Exception, Error {
        // 暗号化するコンテンツを設定
        // ENCRYPT_ALL : 全て暗号化
        enc.setEncryptComponent(PtlEncrypt.ENCRYPT_COMPONENT.ENCRYPT_ALL);
        // ユーザパスワード値の設定
        enc.setOwnerPassword(outOwnerpass);

        // ユーザアクセス許可フラグの取得・設定
        try (PtlEncryptPermissionType2 perms2 = new PtlEncryptPermissionType2())
        {
            // 印刷権限の設定
            // PERM_PRINT_NOT_ALLOWED : 許可しない
            perms2.setPrint(PtlEncryptPermissionType2.PERMISSION_PRINT.PERM_PRINT_NOT_ALLOWED);

            // 変更権限の設定
            // PERM_MODIFY_NOT_ALLOWED : 許可しない
            perms2.setModify(PtlEncryptPermissionType2.PERMISSION_MODIFY.PERM_MODIFY_NOT_ALLOWED);

            // テキスト、画像、その他の内容のコピーを有効にするかどうかの設定
            // false : 有効にしない
            perms2.setCopy(false);

            // スクリーンリーダーデバイスのテキストアクセスを有効にするかどうかの設定
            // false : 有効にしない
            perms2.setAccessibility(false);

            // ユーザアクセス許可フラグの設定
            enc.setPermission(perms2);
        }
        doc.setEncrypt(enc);
    }
}

プログラムファイル名

EncryptWithOwnerPass.java

入出力操作の例

オーナーパスワードを設定する例です。

images/EncryptWithOwnerPass.png

最初の例は、暗号化キーの長さ128ビットRC4で、パスワードのかかっていないPDF文書を暗号化しています。次の例は、最初に暗号化したPDF文書を入力して、暗号化キーの長さ128ビットAESで暗号化し直しています。