6.2.1 証明書セキュリティ付きPDFから権限情報を取得する

GetEncryptInfoPubkeyPKCS12_Top

狙い・効果

証明書セキュリティが設定されたPDFから証明書セキュリティ権限情報を取得します。

処理の概要

証明書セキュリティ付きPDFを開き、権限情報を取得します。

証明書セキュリティ付きPDFを開くには、PKCS#12証明書パッケージファイルと証明書パッケージファイルにかけられたパスワードが必要です。

  1. PtlPDFDocument.setPKCS12()でPDFに証明書パッケージファイルを設定
  2. PtlPDFDocument.setPassword()でパスワードを設定
  3. 対象のPDFファイルを開く

開いたPDFからはユーザーアクセスフラグを含む各種情報を取得することができます。

ユーザーアクセスフラグで取得できる情報は以下の5項目です。

サンプルプログラムでは、入力PDFが持つセキュリティの情報を取得します。

  1. 指定したPKCS#12ファイル及び、PKCS#12ファイルのパスワードを読み込んでPDFを開き、ユーザーアクセスフラグを取得します。
  2. 取得したユーザーアクセスフラグから、最初にすべての権限を許可しているか否かを判別します。
  3. 個別の権限の設定を調べます。

『PDF Tool API』の主な機能

注記 *

列挙型定数が持つ具体的な内容は「6.1.1 セキュリティ設定(証明セキュリティ)」を参照してください。

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class GetEncryptInfoPubkeyPKCS12 {

    // そのクラスのusageを表示する関数
    private static void printUsage() {
        System.out.println("usage: java GetEncryptInfoPubkeyPKCS12 in-pdf-file "
                + "PKCS#12-path [pkcs#12-password]");
    }    

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 2) {
            printUsage();
            return;
        }

        try (PtlParamInput inputFile = new PtlParamInput(args[0]);
             PtlParamInput pkcs12Pubkey = new PtlParamInput(args[1]);
             PtlPDFDocument doc = new PtlPDFDocument()) {

            doc.setPassword(args[2]);
            doc.setPKCS12(pkcs12Pubkey);
            // PDFファイルをロードします。
            doc.load(inputFile);

            // 暗号化の取得
            if (doc.isEncrypted()) {
                // 暗号化情報の取得
                showStdAndPermEncInfo(doc);
            }
            else {
                System.out.println("暗号化されていないファイルです");
            }
        }
        catch (PtlException pex) {
            System.out.println("PtlException : ErrorCode = " + pex.getErrorCode() +
                               "\n  " + pex.getErrorMessage());
        }
	...【GetPDFVersion.javaと同じ処理のため省略
	   ・エラーメッセージ処理と出力】...
    }

    public static void showStdAndPermEncInfo(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 : 標準セキュリティハンドラ */
            if (encrypt.getFilterType() == PtlEncrypt.FILTER_TYPE.FILTER_STANDARD) {
                //標準セキュリティハンドラの情報取得
                //PtlEncryptStandardにダウンキャストして情報を渡す
                getEncryptStandardInfo((PtlEncryptStandard)encrypt);
            }
            // FILTER_PUBKEY : 公開キーセキュリティハンドラ */
            else if(encrypt.getFilterType() == PtlEncrypt.FILTER_TYPE.FILTER_PUBKEY) {
                //公開キーセキュリティハンドラの情報取得
                //PtlEncryptPubkeyにダウンキャストして情報を渡す
                getEncryptPubkeyInfo((PtlEncryptPubKey)encrypt);
            }
        }
    }

    /**
     * 公開キーセキュリティハンドラの情報を取得するメソッド
     * @param encryptPubkey 公開キーセキュリティハンドラを表すクラス
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getEncryptPubkeyInfo(PtlEncryptPubKey encryptPubkey)
            throws PtlException, Exception, Error {
        System.out.println("---セキュリティハンドラのタイプは公開キーセキュリティハンドラです。---");
        // getFilterType()で判定済みなので PtlEncryptPubKey にダウンキャストする。

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

        // ユーザアクセス許可フラグの取得
        // PtlEncryptPermissionPubKeyを取得する
        System.out.println("--ユーザアクセス許可フラグの情報を取得します--");
        try (PtlEncryptPermissionPubKey permsPubkey = (PtlEncryptPermissionPubKey)encryptPubkey.getPermission()) {
            if(permsPubkey.hasFullPermission()) {
                System.out.println("このPDFではすべての権限が許可されています");
            }
            else {
                System.out.println("このPDFでは個別に権限の許可・許可しないが設定されます");
            }
                // 印刷権限取得
                switch (permsPubkey.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 (permsPubkey.getModify()) {
                case PERM_MODIFY_NOT_ALLOWED:
                    System.out.println("変更権限 : 許可しない");
                    break;
                case PERM_MODIFY_ASSEMBLEDOC:
                    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 (permsPubkey.getCopy()) {
                    System.out.println("テキスト、画像、その他の内容のコピーを有効にする");
                }
                else {
                    System.out.println("テキスト、画像、その他の内容のコピーを有効にしない");
                }
                // スクリーンリーダーデバイスのテキストアクセスを有効にするかどうかの取得
                if (permsPubkey.getAccessibility()) {
                    System.out.println("スクリーンリーダーデバイスのテキストアクセスを有効にする");
                }
                else {
                    System.out.println("スクリーンリーダーデバイスのテキストアクセスを有効にしない");
                }
        }
    }

    /**
     * 標準セキュリティハンドラの情報を取得するメソッド
     * @param encryptStandard 標準セキュリティハンドラを表すクラス
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getEncryptStandardInfo(PtlEncryptStandard encryptStandard)
            throws PtlException, Exception, Error {
        System.out.println("---セキュリティハンドラのタイプは標準セキュリティハンドラです。---");
        // getFilterType()に判定済みなので PtlEncryptStandard にダウンキャストする。

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

        // ユーザアクセス許可フラグの取得
        System.out.println("--ユーザアクセス許可フラグの情報を取得します--");
        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_ASSEMBLEANDFORM:
                    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_ASSEMBLEDOC:
                    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.getAccessibility()) {
                    System.out.println("スクリーンリーダーデバイスのテキストアクセスを有効にする");
                }
                else {
                    System.out.println("スクリーンリーダーデバイスのテキストアクセスを有効にしない");
                }
            }
            break;
            }
        }
    }
}

プログラムファイル名

GetEncryptInfoPubkeyPKCS12.java

入出力操作の例

C:\samples>java cookbook.GetEncryptInfoPubkeyPKCS12 
usage: java GetEncryptInfoPubkeyPKCS12 in-pdf-file PKCS#12-path [pkcs#12-password]

C:\samples>java cookbook.GetEncryptInfoPubkeyPKCS12 Output_EncryptSetPubKeyWithX509.pdf testPKCS12.pfx testtest 
暗号化のキー長 : 256
文書の全てのコンテンツを暗号化
---セキュリティハンドラのタイプは公開キーセキュリティハンドラです。---
公開キーセキュリティハンドラのメソッド : AES
--ユーザアクセス許可フラグの情報を取得します--
このPDFでは個別に権限の許可・許可しないが設定されます
印刷権限 : 許可しない
変更権限 : 許可しない
テキスト、画像、その他の内容のコピーを有効にしない
スクリーンリーダーデバイスのテキストアクセスを有効にしない
-- 完了 --