1.3.2 指定フォルダでのみ閲覧可能な閲覧制限

images/SetRestrictionByURL-top.png

狙い・効果

PDFに指定のフォルダでのみ閲覧可能な閲覧制限をかけます。

処理の概要

PDFを指定のフォルダでのみ閲覧可能な状態にすると、そのPDFを指定したURI以外のフォルダ上に配置した場合に閲覧不可となります。

閲覧不可の場合、事前に設定した透かしなどが表示されます。

この機能を用いると例えば、

「PDFが特定の共有フォルダに置かれている場合だけ閲覧可能だが、PDFをローカルにコピーしてくると閲覧不可になる」

ような設定が可能です。


本プログラム例では"C:/temp"フォルダを閲覧可能なURIとして指定します。また、閲覧できないページを識別するために透かしを設定し、閲覧制限を設定後に保存します。

『PDF Tool API』の主な機能

注意:※
  • 閲覧制限済みファイルはAcrobat®のJavaScriptが動作するPDFビューアアプリケーション以外では正常に閲覧できません。
  • ブラウザ上でPDFを開いた場合、閲覧制限の解除が正常に働きません。そのため、閲覧可能な場所にweb上のURLを指定することもできますが、その場合はブラウザからPDFビューワを呼び出すよう指定するなどの特殊な設定が必要になってきます。

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class SetRestrictionByURI {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 3) {
            System.out.print("usage: java SetRestrictionByURI in-pdf-file out-pdf-file ");
            System.out.println("out-pdf-ownerpass [in-pdf-password]");
            System.out.println("in-pdf-fileが暗号化されていない場合は128 bit AES で暗号化します。");
            return;
        }

        // コマンドライン引数の取得
        String outOwnerPass = args[2];

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

            // 閲覧場所の制限設定
            setRestrictionByURI(doc);

            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 setRestrictionByURI(PtlPDFDocument doc)
        throws PtlException, Exception, Error {
        try (PtlParamRestriction restriction = new PtlParamRestriction()) {
            // 閲覧可能とするURIの追加
            restriction.appendValidURL("C:\\temp");

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

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

    public static void setWaterMarkToRestriction(PtlParamRestriction restriction) throws PtlException, Exception, Error
    {
        ...【SetRestrictionWithTime.javaと同じ処理のため省略。
             ・閲覧不可の際に表示するためのテキスト透かしの書式を設定する。】...
    }
        ...【encrypt128AESwithOwnerpass()の処理がSetRestrictionWithTime.javaと同じ処理のため省略。
             ・128 bit AES形式で暗号化し、オーナーパスワードをかける。閲覧権限は変更しない】...

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

プログラムファイル名

SetRestrictionByURI.java

入出力操作の例

C:\samples>java cookbook.SetRestrictionByURI 
usage: java SetRestrictionByURI in-pdf-file out-pdf-file out-pdf-ownerpass [in-pdf-password]
in-pdf-fileが暗号化されていない場合、40bitRC4で暗号化されていた場合は128 bit AES で暗号化します。

C:\samples>java cookbook.SetRestrictionByURI CSS-Print-v4.pdf CSS-Print-URI.pdf 123456 
暗号化されていないファイルです。
128 bit AES形式で暗号化します。