6.3.1 証明書セキュリティの解除

DecryptPubkey_Top

狙い・効果

PDF文書に設定されている証明書証明書セキュリティセキュリティを解除します。

処理の概要

証明書セキュリティの解除を行います。

すべての権限を許可するユーザーアクセスフラグを設定された証明書のPKCS#12ファイルを用いてPDFを開いた際にPtlPDFDocument.removeEncrypt()を実行することでセキュリティを解除できます。

ユーザーアクセスフラグですべての権限の許可を指定する方法は、「7.1.3 すべての権限を許可する(setFullPermission)」を参照してください。

サンプルプログラムでは、PKCS#12ファイルを用いてPDFファイルを開き、すべての権限を許可して暗号化されたかどうかを判別します。

すべての権限を許可して暗号化されていた場合、PDF文書からセキュリティを削除します。その後、セキュリティの付いていないPDF文書として新規に保存します。

『PDF Tool API』の主な機能

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class DecryptPubkey {

    // そのクラスのusageを表示する関数
    private static void printUsage() {
        System.out.println("usage: java DecryptPubkey in-pdf-file out-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[2]);
             PtlParamOutput outputFile = new PtlParamOutput(args[1]);
             PtlPDFDocument doc = new PtlPDFDocument()) {

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


            // 暗号化の取得
            if (doc.isEncrypted()) {
                if(hasPubkeyFullPermission(doc)) {//trueの場合のみにセキュリティを解除できる。
                    doc.removeEncrypt();  //暗号化情報の削除
                    doc.save(outputFile); //ファイルの保存
                }
                else {
                    System.out.println("このPKCS#12ファイルにはPDFの暗号化を解除する権限がありません。"
                            + "証明書セキュリティの削除を中断し、プログラムを終了します。");
                }
            }
            else {
                System.out.println("暗号化されていないファイルです");
            }


        }
	...【GetPDFVersion.javaと同じ処理のため省略
	   ・エラーメッセージ処理と出力】...
    }


    /**
     * 引数で受け取ったPDFファイルの証明書セキュリティがすべての権限を許可されているかを
     * 判別します。
     * 
     * @param doc 判別したいPDF文書をあらわすクラス
     * @return PDFを開いた証明書がすべての権限を許可されているかどうか
     * @throws PtlException
     * @throws Exception 証明書セキュリティがかけられていない場合にthrowする。
     * @throws Error 
     */
    public static boolean hasPubkeyFullPermission(PtlPDFDocument doc)
               throws PtlException, Exception, Error {
        boolean hasFullPerm = false;
        try (PtlEncrypt encrypt = doc.getEncrypt()) {
            if(encrypt.getFilterType() == PtlEncrypt.FILTER_TYPE.FILTER_PUBKEY) {
                try(PtlEncryptPubKey encryptPubkey = (PtlEncryptPubKey)encrypt;
                    PtlEncryptPermissionPubKey permsPubkey = (PtlEncryptPermissionPubKey)encryptPubkey.getPermission()) {
                    hasFullPerm = permsPubkey.hasFullPermission();
                }
            }
            else {
                throw new Exception("このPDFにかけられたセキュリティは証明書セキュリティではありません。"
                                    + "処理を中断します。");
            }
        }

        return hasFullPerm;
    }
}

プログラムファイル名

DecryptPubkey.java

入出力操作の例

C:\samples>java cookbook.DecryptPubkey 
usage: java DecryptPubkey in-pdf-file out-pdf-filePKCS#12-path pkcs#12-password

C:\samples>java cookbook.DecryptPubkey Output_EncryptSetPubKeySetFullPermission.pdf Output_DecryptPubkey.pdf testPKCS12.pfx testtest 
-- 完了 --

操作例では出力するPDFからセキュリティ設定を削除しています。パスワード入力や証明書なしで開くことができ、権限もすべて許可されています。

下図は出力PDFをAdobe Acrobatで開き、セキュリティ設定削除後のPDFのプロパティを示しています。

5-6-3-1_DecryptPubkey

図6.8 証明書セキュリティが解除されたPDFの例。セキュリティ方法が「セキュリティなし」になっている。