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

images/SetRestrictionWithPageRange-top.png

狙い・効果

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

処理の概要

閲覧制限を指定したいページ範囲を指定します。閲覧制限をかけたファイルはAcrobat®のJavaScriptが動作する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.print("usage: java SetRestrictionWithTime in-pdf-file out-pdf-file ");
            System.out.println("out-pdf-ownerpass restriction-page-range [in-pdf-password]");
            System.out.println("restriction-page-range:");
            System.out.print(" all : 全ページ 数字 : ページの範囲を指定する文字列。0が先頭。");
            System.out.println("(例 『0,2-4』と指定すると、1ページと3から5ページに閲覧制限を行う)");
            System.out.println("in-pdf-fileが暗号化されていない場合、40bitRC4で暗号化されていた場合は"
                             + "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()) {
                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 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);
            }

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

            // 閲覧制限の設定
            doc.setRestriction(restriction);
        }
    }
        ...【setWaterMark()の処理がSetRestrictionWithTime.javaと同じため省略。
             ・閲覧不可の際に表示するためのテキスト透かしの書式を設定する。】...

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

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

プログラムファイル名

SetRestrictionWithPageRange.java

入出力操作の例

images/SetRestrictionWithPageRange.png