1.2.5 アクセシビリティのための内容の抽出の制限

images/EncryptSetAccessibility-top.png

狙い・効果

オーナーパスワードによりPDF文書のアクセシビリティのための内容の抽出に関する制限を設定します。

処理の概要

オーナーパスワードでアクセシビリティの目的でPDF文書からテキストの抽出と画像の抽出の許可を設定します。権限設定にはタイプ1とタイプ2があります(表1・5 権限設定のタイプを参照)が、この項目の個別設定機能はタイプ2の権限設定のときのみ設定できます。

本プログラム例では本プログラム例では指定されたPDF文書のアクセシビリティの目的でのテキストの抽出と画像の抽出の可否を設定します。

PDF Tool APIの主な機能

プログラム例

package cookbook;

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

public class EncryptSetAccessibility {

    public static void printUsage(){
        System.out.print("usage: java EncryptSetAccessibility in-pdf-file out-pdf-file ");
        System.out.println("アクセシビリティ有効の可否 out-pdf-ownerpass [in-pdf-password]");
        System.out.print("アクセシビリティ(スクリーンリーダーデバイスのテキストアクセス)を");
        System.out.println("有効にするか");
        System.out.println("0 : 有効にしない 1 : 有効にする");
        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;
        }

        // コマンドライン引数の取得
        boolean permAccessibility = false;
        try
        {
            switch (Integer.parseInt(args[2])) {
            case 0:
                permAccessibility = false;
                System.out.println("この文書のアクセシビリティ(スクリーンリーダーデバイスのテキストアクセス)を有効にしません。");
                break;
            case 1:
                permAccessibility = true;
                System.out.println("この文書のアクセシビリティ(スクリーンリーダーデバイスのテキストアクセス)を有効にします。");
                break;
            default:
                System.out.println("アクセシビリティ有効の可否は、0か1の数値で指定してください。");
                printUsage(); // usageメッセージの表示
                return;
            }
        }
        catch(NumberFormatException nfe)
        {
            System.out.println("アクセシビリティ有効の可否は、0か1の数値で指定してください。");
            printUsage(); // usageメッセージの表示
            return;
        }
        String outOwnerPass = args[3];

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

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

    public static void encrypt40RC4setAccessibility(PtlPDFDocument doc, String outOwnerPass,
                                                    boolean permAccessibility)
        throws PtlException, IOException, Exception, Error
    {
        // 40 bit RC4
        System.out.println("40 bit RC4暗号化が選択されました。");
        try (PtlEncryptStandard40RC4 enc40 = new PtlEncryptStandard40RC4())
        {
            setAccessibilityWithDefaultPermission(doc, outOwnerPass, permAccessibility, enc40);
        }
    }

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

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

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

    public static void setAccessibilityWithDefaultPermission(PtlPDFDocument doc, String outOwnerPass,
                                                             boolean permAccessibility,
                                                             PtlEncryptStandard enc)
        throws PtlException, IOException, Exception, Error
    {
        ...【EncryptSetPrint.javaのsetPrintWithDefaultPermission()と同じ処理のため省略。
             ・暗号化の範囲を全てのコンテンツに設定。
             ・オーナーパスワードを設定。】...

        // encが40 bit RC4の場合はPtlEncryptPermissionType1を用いる必要がある
        if((enc.getMethod() == PtlEncryptStandard.STANDARD_METHOD_TYPE.METHOD_RC4) &&
           (enc.getKeyLength() == 40))
        {
            try (PtlEncryptPermissionType1 perms1 = new PtlEncryptPermissionType1())
            {
                // 印刷権限の設定
                // true : 印刷を許可する
                perms1.setPrint(true);

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

                // 内容のコピーおよびアクセシビリティを有効にするかどうかの設定
                perms1.setCopy(permAccessibility);
                System.out.println("コピー許可の可否とアクセシビリティ有効の可否が連動して設定されます。");

                // ユーザアクセス許可フラグの設定
                enc.setPermission(perms1);
            }
        }
        // encが40 bit RC4以外場合はPtlEncryptPermissionType2を用いる必要がある
        else
        {
            try (PtlEncryptPermissionType2 perms2 = new PtlEncryptPermissionType2())
            {
                // 印刷権限の設定
                // PERM_PRINT_HIGH : 高解像度での印刷を許可
                perms2.setPrint(PtlEncryptPermissionType2.PERMISSION_PRINT.PERM_PRINT_HIGH);

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

                // 内容のコピーを有効にするかどうかの設定
                perms2.setCopy(true);

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

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

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

    }

    public static void setPermAccessibility(PtlPDFDocument doc, String outOwnerPass,
                                            boolean permAccessibility)
        throws PtlException, IOException, Exception, Error
    {
        ...【EncryptSetPrint.javaと同じ処理のため省略。
             ・PtlPDFDocument docが保持している暗号化情報PtlEncrypt encryptの取得。
             ・標準セキュリティハンドラであることを確認し、encryptをPtlEncryptStandardにダウンキャスト。
             ・出力用オーナーパスワードの設定。
             ・ユーザーアクセス許可フラグPtlEncryptPermission permsの取得】...

                {
                    // タイプ取得
                    switch (perms.getType())
                    {
                    case PERM_TYPE1:
                        // getType()で判定されたのでpermsをダウンキャストできる。
                        PtlEncryptPermissionType1 perms1 = (PtlEncryptPermissionType1)perms;
                        // 内容のコピーおよびアクセシビリティを有効にするかどうかの設定
                        perms1.setCopy(permAccessibility);
                        System.out.println("40 bit RC4 暗号化をされたファイルです。");
                        System.out.println("コピー許可の可否とアクセシビリティ有効の可否が連動して設定されます。");
                        encryptStandard.setPermission(perms1);
                        break;

                    case PERM_TYPE2:
                        // getType()で判定されたのでpermsをダウンキャストできる。
                        PtlEncryptPermissionType2 perms2 = (PtlEncryptPermissionType2)perms;
                        // 内容のコピーを有効にするかどうかの設定
                        perms2.setAccesibility(permAccessibility);
                        encryptStandard.setPermission(perms2);
                        break;
                    }
                }
        ...【EncryptSetPrint.javaと同じ処理のため省略。
             ・PtlPDFDocument docに変更したセキュリティ情報を設定。
             ・標準セキュリティハンドラ以外が与えられた際の例外処理。】...
        }
    }
}

プログラムファイル名

EncryptSetAccessibility.java

入出力操作の例

images/EncryptSetAccessibility.png

images/EncryptSetAccessibility1.png