1.3.3 閲覧制限設定をするページ範囲

images/SetRestrictionWithPageRange-top.png

狙い・効果

PDF文書のページごとに閲覧制限が設定可能です。

処理の概要

閲覧制限を指定したいページ範囲を指定します。

本プログラム例では、ページ範囲をコマンドライン引数で指定します。加えて、コマンドライン引数でページ範囲を指定する際に「all」という文字列を渡すと「全ページ指定」もできるように機能を拡張しています。

ページ範囲を指定する書式は、「jp.co.antenna.ptl.PtlParamRestriction.setCustomPageRange()」と同一です。

本プログラム例の閲覧制限は、SetRestrictionWithTime.javaと同様に、保存後10分~20分の間だけ閲覧可能になるように設定します。

PDF Tool APIの主な機能

閲覧制限設定をするページ範囲は次表の列挙型定数で指定します。PAGE_RANGE_CUSTOMを指定した場合は、さらにsetCustomPageRange()で具体的なページ範囲の指定をする必要があります。

表1・11 ページ範囲
列挙型定数説明
PAGE_RANGE_ALL全ページ
PAGE_RANGE_CUSTOM指定ページ(setCustomPageRangeでページ範囲を数値指定)
PAGE_RANGE_EVEN偶数ページ
PAGE_RANGE_FIRST先頭ページのみ
PAGE_RANGE_LAST最終ページのみ
PAGE_RANGE_ODD奇数ページ

プログラム例

package cookbook;

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


public class SetRestrictionWithPageRange {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 4)
        {
            System.out.println("usage: java SetRestrictionWithTime in-pdf-file out-pdf-file out-pdf-ownerpass restriction-page-range [in-pdf-password]");
            System.out.println("restriction-page-range:");
            System.out.println(" all : 全ページ 数字 : 数字で指定したページ(例 『0,2-4』と指定すると、1ページと3から5ページに閲覧制限を行う)");
            System.out.println("in-pdf-fileが暗号化されていない場合は128 bit AES で暗号化します。");
            return;
        }

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

            // 閲覧制限設定
            setRestrictionWithPageRange(doc, pageRange);

            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 setRestrictionWithPageRange(PtlPDFDocument doc, String pageRange)
        throws PtlException, Exception, Error
    {
        try (PtlParamRestriction restriction = new PtlParamRestriction())
        {

            switch(pageRange){
            case "all":
                restriction.setPageRange(PtlParamRestriction.PAGE_RANGE.PAGE_RANGE_ALL);
                break;
            default:
                restriction.setPageRange(PtlParamRestriction.PAGE_RANGE.PAGE_RANGE_CUSTOM);
                restriction.setCustomPageRange(pageRange);
                break;
            }


            // setRestrictionWithTimeと共通部分。今から10分後に閲覧可能に、20分後に閲覧不可能になる
            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);
        }
    }
        ...【setWaterMark()の処理がSetRestrictionWithTime.javaと同じため省略。
             ・閲覧不可の際に表示するためのテキスト透かしの書式を設定する。】...

        ...【encrypt128AESwithOwnerpass()の処理がSetRestrictionWithTime.javaと同じ処理のため省略。
             ・128 bit AES形式で暗号化し、オーナーパスワードをかける。閲覧権限は変更しない】...

        ...【setOwnerpass()の処理がSetRestrictionWithTime.javaと同じ処理のため省略。
             ・与えられたPtlEncrypt encryptにオーナーパスワードを設定する。】...
}

プログラムファイル名

SetRestrictionWithPageRange.java

入出力操作の例

images/SetRestrictionWithPageRange.png