
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
