PDF文書のページごとに閲覧制限が設定可能です。
閲覧制限を指定したいページ範囲を指定します。閲覧制限をかけたファイルはAcrobat®のJavaScriptが動作するPDFビューアアプリケーションでのみ正常に閲覧可能です。
本プログラム例では、ページ範囲をコマンドライン引数で指定します。加えて、コマンドライン引数でページ範囲を指定する際に「all」という文字列を渡すと「全ページ指定」もできるように機能を拡張しています。
ページ範囲を指定する書式は、「jp.co.antenna.ptl.PtlParamRestriction.setCustomPageRange()」と同一です。
本プログラム例の閲覧制限は、SetRestrictionWithTime.javaと同様に、保存後10分~20分の間だけ閲覧可能になるように設定します。
閲覧制限設定をするページ範囲は次表の列挙型定数で指定します。PAGE_RANGE_CUSTOMを指定した場合は、さらにsetCustomPageRange()で具体的なページ範囲の指定をする必要があります。
列挙型定数 | 説明 |
---|---|
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