1.3.1 閲覧期間の制限設定

images/SetRestrictionWithTime-top.png

狙い・効果

PDF文書を指定期間内のみ閲覧可能指定の期間内に開かれた場合にのみ閲覧可能にします。

処理の概要

PDF文書を指定の期間内開かれた場合にのみ閲覧可能に設定します。PDF文書を読み込み、閲覧可能な期間の開始日と閲覧可能な期間の終了日を設定します。

閲覧制限をかけたファイルはAcrobat®のJavaScriptが動作するPDFビューアアプリケーションでのみ正常に閲覧可能です。

本プログラム例では、具体的には次の設定をします。

『PDF Tool API』の主な機能

プログラム例

package cookbook;

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


public class SetRestrictionWithTime {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 3) {
            System.out.print("usage: java SetRestrictionWithTime in-pdf-file out-pdf-file ");
            System.out.println("out-pdf-ownerpass [in-pdf-password]");
            System.out.println("in-pdf-fileが暗号化されていない場合、40bitRC4で暗号化されていた場合は"
                             + "128 bit AES で暗号化します。");
            return;
        }

        // コマンドライン引数の取得
        String outOwnerPass = args[2];
        ...【EncryptWithUserPass.javaと同じ処理のため省略
             ・PtlParamInputを用いてPtlPDFDocument docに入力PDFをロード
             ・PtlParamOutputを用いて出力PDF名を指定
             ・入力PDF用パスワードが指定されていればそれをセットした上でPDFをロードする】...

            // 閲覧制限設定
            setRestrictionWithTime(doc);

            if (doc.isEncrypted()) {
                if(doc.getEncrypt().getKeyLength() >= 128){ //キー長が128以上の場合は設定を引き継げる
                    // 暗号化情報の取得
                    System.out.println("暗号化されたファイルです。設定を引き継ぎます。");
                    setOwnerPass(doc, outOwnerPass, doc.getEncrypt());
                }
                else { //V7.0以降、キー長が40の場合はこのまま暗号化できない。
                    System.out.println("入力ファイルが128bitより短いキー長で暗号化されています。");
                    System.out.println("新規に暗号化します。");
                    encrypt128AESwithOwnerpass(doc, outOwnerPass);
                }
            }
            else {
                System.out.println("暗号化されていないファイルです。");
                encrypt128AESwithOwnerpass(doc, outOwnerPass);
            }
        ...【EncryptWithUserPass.javaと同じ処理のため省略
             ・PtlParamOutputを用いてPtlPDFDocument docの内容を出力
             ・PtlException, Exception, Error を catchするエラー処理
             ・finally文で"--完了--"と表示する処理】...
    }

    public static void setRestrictionWithTime(PtlPDFDocument doc)
        throws PtlException, Exception, Error {
        try (PtlParamRestriction restriction = new PtlParamRestriction()) {

            try (PtlDate dateStart = new PtlDate();
                 PtlDate dateEnd = new PtlDate())  {
                LocalDateTime timeNow = LocalDateTime.now();

                LocalDateTime startTime = timeNow.plusMinutes(10);
                dateStart.setYear(startTime.getYear());
                dateStart.setMonth(startTime.getMonthValue());
                dateStart.setDay(startTime.getDayOfMonth());
                dateStart.setHour(startTime.getHour());
                dateStart.setMin(startTime.getMinute());
                // 閲覧可能とする期間の開始日設定
                restriction.setValidTermStart(dateStart);

                LocalDateTime endTime = timeNow.plusMinutes(20);
                dateEnd.setYear(endTime.getYear());
                dateEnd.setMonth(endTime.getMonthValue());
                dateEnd.setDay(endTime.getDayOfMonth());
                dateEnd.setHour(endTime.getHour());
                dateEnd.setMin(endTime.getMinute());
                // 閲覧可能とする期間の終了日設定
                restriction.setValidTermEnd(dateEnd);
            }

            // 透かしの設定
            setWaterMarkToRestriction(restriction);

            // 閲覧制限の設定
            doc.setRestriction(restriction);
        }
    }

    public static void setWaterMarkToRestriction(PtlParamRestriction restriction)
        throws PtlException, Exception, Error {
        try (PtlParamWaterMarkText watermarktext = new PtlParamWaterMarkText()) {
            // 透かしの配置の設定 ALIGN_CENTER = 5 /* 中央 */
            watermarktext.setAlign(PtlParamWaterMark.ALIGN.ALIGN_CENTER);

            // 透かしに指定する文字列の設定
            watermarktext.setString("Restriction Test");

            // 透かしに指定するフォントの設定
            try (PtlParamFont font = new PtlParamFont("Helvetica", 180.0f,
                                                      PtlParamFont.WEIGHT.WEIGHT_HEAVY,
                                                      true, false)) {
                watermarktext.setFont(font);
            }

            // 透かしの文字に指定する色の設定
            try (PtlColorDeviceRGB colorText = new PtlColorDeviceRGB(1.0f, 0.0f, 0.0f)) {
                watermarktext.setTextColor(colorText);
            }

            // 透かしの文字の縁取りに指定する色の設定
            try (PtlColorDeviceRGB colorOutline = new PtlColorDeviceRGB(0.0f, 1.0f, 0.0f)) {
                watermarktext.setOutlineColor(colorOutline);
            }

            // 透かしのテキストを対角線上に配置する設定
            watermarktext.setWriteDiagonal(true);

            // 閲覧不可時に表示するウォーターマーク設定
            restriction.setWatermark(watermarktext);
        }
    }


    public static void encrypt128AESwithOwnerpass(PtlPDFDocument doc, String outOwnerPass)
        throws PtlException, Exception, Error {
        // 128 bit AES
        System.out.println("128 bit AES形式で暗号化します。");
        try (PtlEncryptStandard128AES enc128a = new PtlEncryptStandard128AES()) {
            setOwnerPass(doc, outOwnerPass, enc128a);
        }
    }

    public static void setOwnerPass(PtlPDFDocument doc, String outOwnerPass, PtlEncrypt encrypt)
        throws PtlException, Exception, Error {

        // 標準セキュリティハンドラのメソッド取得
        if (encrypt.getFilterType() == PtlEncrypt.FILTER_TYPE.FILTER_STANDARD) {
            // getFilterType()に判定済みなので PtlEncryptStandard にダウンキャストする。
            try(PtlEncryptStandard encryptStandard = (PtlEncryptStandard)encrypt) {
                encryptStandard.setOwnerPassword(outOwnerPass);
                // 暗号化情報の設定
                doc.setEncrypt(encryptStandard);
            }
        }
        else {
            System.out.println("標準セキュリティハンドラ以外のセキュリティハンドラが使われたPDFです。");
            System.out.println("このPDFの暗号化権限を引き継ぐことはできません。");
            return;
        }
    }

}

Java8で実装された「java.time.LocalDateTime」クラスを使用していますので、それ以前のバージョンのJavaでは動作しません。ご注意ください。

プログラムファイル名

SetRestrictionWithTime.java

入出力操作の例

images/SetRestrictionWithTime.png