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

images/EncryptWithOwnerPass-top.png

狙い・効果

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

処理の概要

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

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

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 : 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 outOwnerpass = args[3];
        ...【EncryptWithUserPass.javaと同じ処理のため省略
             ・PtlParamInputを用いてPtlPDFDocument docに入力PDFをロード
             ・PtlParamOutputを用いて出力PDF名を指定
             ・入力PDF用パスワードが指定されていればそれをセットした上でPDFをロードする】...

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

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

    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);

        // ユーザアクセス許可フラグの取得・設定
        // タイプ取得
        if((enc.getMethod() == PtlEncryptStandard.STANDARD_METHOD_TYPE.METHOD_RC4) &&
           (enc.getKeyLength() == 40))
        {
            // PtlEncryptPermissionType1 : 
            // 標準セキュリティハンドラのリビジョン番号が2での権限設定
            try (PtlEncryptPermissionType1 perms1 = new PtlEncryptPermissionType1())
            {
                // 印刷権限の設定
                // false: 印刷を許可しない
                perms1.setPrint(false);

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

                // テキスト、画像、その他の内容のコピーおよびアクセシビリティを有効にするかどうかの設定
                // false: 有効にしない
                perms1.setCopy(false);

                // ユーザアクセス許可フラグの設定
                enc.setPermission(perms1);
            }
        }
        else
        {
            // PtlEncryptPermissionType2 : 
            // 標準セキュリティハンドラのリビジョン番号が3以降での権限設定
            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.setAccesibility(false);

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

プログラムファイル名

EncryptWithOwnerPass.java

入出力操作の例

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

images/EncryptWithOwnerPass.png

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