1.3.1 閲覧期間の制限設定

images/SetRestrictionWithTime-top.png

狙い・効果

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

処理の概要

PDF文書を指定の期間内開かれた場合にのみ閲覧可能に設定します。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.println("usage: java SetRestrictionWithTime in-pdf-file out-pdf-file out-pdf-ownerpass [in-pdf-password]");
            System.out.println("in-pdf-fileが暗号化されていない場合は128 bit AES で暗号化します。");
            return;
        }

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

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

            if (doc.isEncrypted())
            {
                // 暗号化情報の取得
                setOwnerPass(doc, outOwnerPass, doc.getEncrypt());
            }
            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);
            }

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

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

    public static void setWaterMark(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 にダウンキャストする。
            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