1.1.1 セキュリティ情報の取得

images/GetCryptInfo-top.png

狙い・効果

PDF文書のパスワードによるセキュリティの情報を取得します。

処理の概要

PDF文書のセキュリティ設定は、PDF文書のトレイラーにある暗号辞書に記録されています。暗号辞書からユーザーパスワードの設定状況とオーナーパスワードの権限設定内容を取得して画面に表示します。ただし入力PDF文書にユーザーパスワードが設定されているとき、PDF文書を開くには正しいパスワードの入力が必要となります。

『PDF Tool API』の主な機能

以下はPtlEncryptPermissionType1, PtlEncryptPermissionType2で同名の関数です。それぞれのクラスで取得する情報が細かく異なります。

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class GetEncryptInfo {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 1)
        {
            System.out.println("usage: java GetEncryptInfo in-pdf-file [in-pdf-password]");
            return;
        }

        try (PtlParamInput inputFile = new PtlParamInput(args[0]);
             PtlPDFDocument doc = new PtlPDFDocument())
        {
            if (args.length > 1)
            {
                // パスワードのセット
                doc.setPassword(args[1]);
            }

            // PDFファイルをロードします。
            doc.load(inputFile);

            // 暗号化の取得
            if (doc.isEncrypted())
            {
                // 暗号化情報の取得
                showEncrypt(doc);
            }
            else
            {
                System.out.println("暗号化されていないファイルです");
            }
        }
        catch (PtlException pex) {
            System.out.println("PtlException : ErrorCode = " + pex.getErrorCode() +
                               "\n  " + pex.getErrorMessage());
        }
        catch (Exception ex) {
            System.out.println(ex.getMessage());
            ex.printStackTrace();
        }
        catch (Error ex) {
            System.out.println(ex.getMessage());
            ex.printStackTrace();
        }
        finally {
            System.out.println("-- 完了 --");
        }
    }

    public static void showEncrypt(PtlPDFDocument doc) throws PtlException, Exception, Error
    {
        try (PtlEncrypt encrypt = doc.getEncrypt())
        {
            // キー長の取得
            System.out.println("暗号化のキー長 : " + encrypt.getKeyLength());

            // 暗号化する文書コンポーネント取得
            switch (encrypt.getEncryptComponent())
            {
            case ENCRYPT_ALL:
                System.out.println("文書の全てのコンテンツを暗号化");
                break;
            case ENCRYPT_EXCEPT_METADATA:
                System.out.println("文書のメタデータを除く全てのコンテンツを暗号化");
                break;
            case ENCRYPT_ONLY_ATTACHED_FILE:
                System.out.println("添付ファイルのみを暗号化(AES暗号化のみで有効)");
                break;
            }

            // 暗号化のフィルター取得
            // FILTER_STANDARD = 1 /* 標準セキュリティハンドラ */
            // Ver5.0 はStandardしかない
            if (encrypt.getFilterType() == PtlEncrypt.FILTER_TYPE.FILTER_STANDARD)
            {
                // getFilterType()に判定済みなので PtlEncryptStandard にダウンキャストする。
                PtlEncryptStandard encryptStandard = (PtlEncryptStandard)encrypt;

                // 標準セキュリティハンドラのメソッド取得
                switch (encryptStandard.getMethod())
                {
                case METHOD_RC4:
                    System.out.println("標準セキュリティハンドラのメソッド : RC4");
                    break;
                case METHOD_AES:
                    System.out.println("標準セキュリティハンドラのメソッド : AES");
                    break;
                }

                // ユーザアクセス許可フラグの取得
                try (PtlEncryptPermission perms = encryptStandard.getPermission())
                {
                    // タイプ取得
                    switch (perms.getType())
                    {
                    case PERM_TYPE1:
                    {
                        System.out.println("標準セキュリティハンドラのリビジョン : 2");
                        // getType()で判定されたのでpermsをダウンキャストできる。
                        PtlEncryptPermissionType1 perms1 = (PtlEncryptPermissionType1)perms;
                        // 印刷権限取得
                        if (perms1.getPrint())
                        {
                            System.out.println("印刷を許可する");
                        }
                        else
                        {
                            System.out.println("印刷を許可しない");
                        }
                        // 変更権限取得
                        switch (perms1.getModify())
                        {
                        case PERM_MODIFY_NOT_ALLOWED:
                            System.out.println("変更権限 : 許可しない");
                            break;
                        case PERM_MODIFY_ANNOTANDFORM:
                            System.out.println("変更権限 : 注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名");
                            break;
                        case PERM_MODIFY_ASSENBLEANDFORM:
                            System.out.println("変更権限 : ページレイアウト、フォームフィールドの入力と既存の署名フィールドに署名");
                            break;
                        case PERM_MODIFY_MODYFYDOC:
                            System.out.println("変更権限 : ページ抽出を除く全ての動作");
                            break;
                        }
                        // テキスト、画像、その他の内容のコピーおよびアクセシビリティを有効にするかどうかの取得
                        if (perms1.getCopy())
                        {
                            System.out.println("テキスト、画像、その他の内容のコピーおよびアクセシビリティを有効にする");
                        }
                        else
                        {
                            System.out.println("テキスト、画像、その他の内容のコピーおよびアクセシビリティを有効にしない");
                        }
                    }
                    break;

                    case PERM_TYPE2:
                    {
                        System.out.println("標準セキュリティハンドラのリビジョン : 3または4");
                        // getType()で判定されたのでpermsをダウンキャストできる。
                        PtlEncryptPermissionType2 perms2 = (PtlEncryptPermissionType2)perms;
                        // 印刷権限取得
                        switch (perms2.getPrint())
                        {
                        case PERM_PRINT_NOT_ALLOWED:
                            System.out.println("印刷権限 : 許可しない");
                            break;
                        case PERM_PRINT_LOW:
                            System.out.println("印刷権限 : 低解像度");
                            break;
                        case PERM_PRINT_HIGH:
                            System.out.println("印刷権限 : 高解像度");
                            break;
                        }
                        // 変更権限取得
                        switch (perms2.getModify())
                        {
                        case PERM_MODIFY_NOT_ALLOWED:
                            System.out.println("変更権限 : 許可しない");
                            break;
                        case PERM_MODIFY_ASSENBLEDOC:
                            System.out.println("変更権限 : ページの挿入、削除、回転");
                            break;
                        case PERM_MODIFY_FILLFORM:
                            System.out.println("変更権限 : フォームフィールドの入力と既存の署名フィールドに署名");
                            break;
                        case PERM_MODIFY_ANNOTANDFORM:
                            System.out.println("変更権限 : 注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名");
                            break;
                        case PERM_MODIFY_MODYFYDOC:
                            System.out.println("変更権限 : ページ抽出を除く全ての動作");
                            break;
                        }

                        // テキスト、画像、その他の内容のコピーを有効にするかどうかの取得
                        if (perms2.getCopy())
                        {
                            System.out.println("テキスト、画像、その他の内容のコピーを有効にする");
                        }
                        else
                        {
                            System.out.println("テキスト、画像、その他の内容のコピーを有効にしない");
                        }
                        // スクリーンリーダーデバイスのテキストアクセスを有効にするかどうかの取得
                        if (perms2.getAccesibility())
                        {
                            System.out.println("スクリーンリーダーデバイスのテキストアクセスを有効にする");
                        }
                        else
                        {
                            System.out.println("スクリーンリーダーデバイスのテキストアクセスを有効にしない");
                        }
                    }
                    break;
                    }
                }
            }
        }
    }
}

プログラムファイル名

GetEncryptInfo.java

入出力操作の例

images/GetEncryptInfo.png

次は暗号化キー長256ビットのAESでオーナーパスワード設定したPDF文書の例です。

images/GetEncryptInfo1.png

次は暗号化キー長256ビットのAESで添付ファイルのみ暗号化したPDF文書の例です。

images/GetEncryptInfo-2.png