1.2.2 印刷不可セキュリティの設定

images/EncryptSetPrint-top.png

狙い・効果

オーナーパスワードによりPDF文書の印刷の可否を設定します。

処理の概要

権限設定にはタイプ1とタイプ2があります(表1・6 権限設定のタイプを参照)。ただし、『PDF Tool API V7.0』以降では40ビットRC4を用いた暗号化は禁止されているため、タイプ1の権限設定を指定することはできません。

表1・9 タイプ2の権限設定(PDF文書の印刷)
列挙型定数説明
PERM_PRINT_HIGH高解像度 権限フラグの3, 12ビット目をOn
PERM_PRINT_LOW低解像度 権限フラグの3ビット目をOn
PERM_PRINT_NOT_ALLOWED許可しない

本プログラム例では指定されたPDF文書の印刷可否セキュリティを設定します。

『PDF Tool API』の主な機能

プログラム例

package cookbook;

import java.io.*;
import jp.co.antenna.ptl.*;

public class EncryptSetPrint {

    // そのクラスのusageを表示する関数
    public static void printUsage() {
        System.out.print("usage: java EncryptSetPrint in-pdf-file out-pdf-file ");
        System.out.println("印刷権限種類 out-pdf-ownerpass [in-pdf-password]");
        System.out.println("印刷権限種類\n0 : 印刷不可  1 : 低解像度で可  2 : 高解像度で可");
        System.out.print("暗号化種類が40 bit RC4 の場合は解像度の指定はできず、");
        System.out.println("印刷の可否についての情報だけが保持・指定されます。");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 4) {
            printUsage(); // usageメッセージの表示
            return;
        }

        // コマンドライン引数の取得
        int permPrint = -1;
        try {
            permPrint = Integer.parseInt(args[2]);
            switch (permPrint) {
            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メッセージの表示
        }
        String outOwnerPass = args[3];

        ...【EncryptSetEncComponent.javaと同じ処理のため省略
             ・PtlParamInputを用いてPtlPDFDocument docに入力PDFをロード
             ・PtlParamOutputを用いて出力PDF名を指定
             ・BufferedReader brを設定してキー入力読み取りを準備する
             ・入力PDF用パスワードが指定されていればそれをセットした上でPDFをロードする】...

            // 暗号化の有無判定
            if (doc.isEncrypted()) {
                // 暗号化情報の取得
                setPermPrint(doc, outOwnerPass, permPrint);
            }
            else {
                System.out.println("暗号化されていないファイルです。\n");
                System.out.println("印刷権限を設定して暗号化します。");
                System.out.println("暗号化種類の設定をします。0から2の数値を指定してください。");
                System.out.println("それ以外の数値が設定された場合は 2 が選択されたものとして扱います。");
                System.out.println("暗号化種類");
                System.out.println("0 : 128 bit RC4  1 : 128 bit AES  2 : 256 bit AES");
                int kind = Integer.parseInt(br.readLine());
                // セキュリティ設定
                switch (kind)
                {
                case 0:
                    // 128 bit RC4
                    encrypt128RC4setPrint(doc, outOwnerPass, permPrint);
                    break;
                case 1:
                    // 128 bit AES
                    encrypt128AESsetPrint(doc, outOwnerPass, permPrint);
                    break;
                case 2:
                default:
                    // 256 bit AES
                    encrypt256AESsetPrint(doc, outOwnerPass, permPrint);
                    break;
                }
            }
        ...【EncryptWithUserPass.javaと同じ処理のため省略
             ・PtlParamOutputを用いてPtlPDFDocument docの内容を出力
             ・PtlException, Exception, Error を catchするエラー処理
             ・finally文で"--完了--"と表示する処理】...
    }

    public static void encrypt128RC4setPrint(PtlPDFDocument doc, String outOwnerPass, int permPrint)
        throws PtlException, Exception, Error
    {
        // 128 bit RC4
        System.out.println("128 bit RC4暗号化が選択されました。");
        try (PtlEncryptStandard128RC4 enc128r = new PtlEncryptStandard128RC4())
        {
            setPrintWithDefaultPermission(doc, outOwnerPass, permPrint, enc128r);
        }
    }

    public static void encrypt128AESsetPrint(PtlPDFDocument doc, String outOwnerPass, int permPrint)
        throws PtlException, Exception, Error
    {
        // 128 bit AES
        System.out.println("128 bit AES暗号化が選択されました。");
        try (PtlEncryptStandard128AES enc128a = new PtlEncryptStandard128AES())
        {
            setPrintWithDefaultPermission(doc, outOwnerPass, permPrint, enc128a);
        }
    }

    public static void encrypt256AESsetPrint(PtlPDFDocument doc, String outOwnerPass, int permPrint)
        throws PtlException, Exception, Error
    {
        // 256 bit AES
        System.out.println("256 bit AES暗号化が選択されました。");
        try (PtlEncryptStandard256AES enc256 = new PtlEncryptStandard256AES())
        {
            setPrintWithDefaultPermission(doc, outOwnerPass, permPrint, enc256);
        }
    }

    public static void setPrintWithDefaultPermission(PtlPDFDocument doc, String outOwnerPass,
                                                     int permPrint, PtlEncryptStandard enc)
        throws PtlException, Exception, Error {

        // 暗号化するコンテンツ
        // 文書の全てのコンテンツを暗号化します。
        enc.setEncryptComponent(PtlEncrypt.ENCRYPT_COMPONENT.ENCRYPT_ALL);
        // オーナーパスワード値の設定
        enc.setOwnerPassword(outOwnerPass);
        // PtlEncryptPermissionType2で権限設定を行う
        try (PtlEncryptPermissionType2 perms2 = new PtlEncryptPermissionType2()) {
            // 印刷権限の設定
            switch(permPrint) {
            case 0:
            default:
                perms2.setPrint(PtlEncryptPermissionType2.PERMISSION_PRINT.PERM_PRINT_NOT_ALLOWED);
                break;
            case 1:
                perms2.setPrint(PtlEncryptPermissionType2.PERMISSION_PRINT.PERM_PRINT_LOW);
                break;
            case 2:
                perms2.setPrint(PtlEncryptPermissionType2.PERMISSION_PRINT.PERM_PRINT_HIGH);
                break;
            }

            // 変更権限の設定
            // ページ抽出を除く全ての動作を許可
            perms2.setModify(PtlEncryptPermissionType2.PERMISSION_MODIFY.PERM_MODIFY_MODYFYDOC);

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

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

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

        // 暗号化情報の設定
        doc.setEncrypt(enc);
    }

    public static void setPermPrint(PtlPDFDocument doc, String outOwnerPass, int permPrint)
        throws PtlException, Exception, Error {
        try (PtlEncrypt encrypt = doc.getEncrypt()) {

            // 標準セキュリティハンドラのメソッド取得
            if (encrypt.getFilterType() == PtlEncrypt.FILTER_TYPE.FILTER_STANDARD) {
                // getFilterType()に判定済みなので PtlEncryptStandard にダウンキャストする。
                try(PtlEncryptStandard encryptStandard = (PtlEncryptStandard)encrypt;
                    PtlEncryptPermission perms = encryptStandard.getPermission()){ // ユーザアクセス許可フラグの取得
                    // タイプ取得
                    switch (perms.getType()) {
                    case PERM_TYPE1:
                        // Type 1は40bit RC4なので、128bit RC4で新規に印刷権限を設定する。
                        System.out.println("入力ファイルは40 bit RC4暗号で暗号化されています。");
                        System.out.println("新規に暗号化します。");
                        encrypt128RC4setPrint(doc, outOwnerPass, permPrint);
                        break;

                    case PERM_TYPE2:
                        // getType()で判定されたのでpermsをダウンキャストできる。
                        try(PtlEncryptPermissionType2 perms2 = (PtlEncryptPermissionType2)perms) {
                            switch(permPrint) {
                            case 0:
                            default:
                                perms2.setPrint(PtlEncryptPermissionType2.PERMISSION_PRINT.PERM_PRINT_NOT_ALLOWED);
                                break;
                            case 1:
                                perms2.setPrint(PtlEncryptPermissionType2.PERMISSION_PRINT.PERM_PRINT_LOW);
                                break;
                            case 2:
                                perms2.setPrint(PtlEncryptPermissionType2.PERMISSION_PRINT.PERM_PRINT_HIGH);
                                break;
                            }
                            encryptStandard.setPermission(perms2);
                        }
                        encryptStandard.setOwnerPassword(outOwnerPass);
                        // 暗号化情報の設定
                        doc.setEncrypt(encryptStandard);
                        break;
                    }
                }
            }
            else {
                System.out.println("標準セキュリティハンドラ以外のセキュリティハンドラが使われたPDFです。");
                System.out.println("このPDFの印刷権限を変更することはできません。");
                return;
            }
        }
    }
}

プログラムファイル名

EncryptSetPrint.java

入出力操作の例

images/EncryptSetPrint.png

最初の例は、暗号化キーの長さ40ビットRC4で、印刷を許可しない設定をします。

images/EncryptSetPrint1.png

次は、暗号化キーの長さ128ビットRC4で、高解像度の印刷を許可する設定をします。

images/EncryptSetPrint2.png