2.1.3 透かしを配置するページの範囲

images/WaterMarkSetPageRange-top.png

狙い・効果

PDF文書で透かしを配置するページを指定します。

処理の概要

透かしを配置するページ範囲は列挙型定数で指定します。列挙型定数については1.3.3 閲覧制限設定をするページ範囲表1・11 ページ範囲を参照してください。

注意:

連続しないページ番号の挿入ページ指定をした場合、その透かしはAcrobat®互換にすることができなくなります。透かしのAcrobat®互換の詳細に関しては「『PDF CookBook』(第5巻)第8章 透かしのAcrobat®互換対応と機能追加」を参照してください。

さらに、透かし専用で①先頭ページに透かしを配置するかどうか、②最終ページに透かしを配置するかどうかの指定ができます。例えば、透かしの配置するページ範囲を「全ページ」として、さらに「先頭ページに透かしを配置しない」とすると先頭ページのみ透かしなしにできます。

『PDF Tool API』の主な機能

プログラム例

package cookbook;

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


public class WaterMarkSetPageRange {

    // そのクラスのusageを表示する関数
    public static void printUsage() {
        System.out.print("usage: java WaterMarkSetPageRange in-pdf-file out-pdf-file");
        System.out.println("watermark-page-range set-not-first-page set-not-last-page");
        System.out.println("watermark-page-range:");
        System.out.println("透かしを配置するページの範囲を指定する文字列。0が先頭。");
        System.out.println("例:『0,2-4』 と指定すると、1ページと3から5ページに透かしが入ります。");
        System.out.println("set-not-first-page : \n 0 : 先頭ページに透かしを配置する。1 : 配置しない。");
        System.out.println("set-not-last-page : \n 0 : 最終ページに透かしを配置する。1 : 配置しない。");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 5) {
            printUsage(); // usageメッセージの表示
            return;
        }

        boolean setNotInFirst;
        boolean setNotInLast;
        // コマンドライン引数の読み取り・判定
        String pageRange = args[2];
        try {
            setNotInFirst = readBoolArgs(args[3], "set-not-first-pageは0か1で指定してください。");
            setNotInLast = readBoolArgs(args[4], "set-not-last-pageは0か1で指定してください。");
        }
        catch (IllegalArgumentException ex) {
            System.out.println(ex.getMessage());
            printUsage(); // usageメッセージの表示
            return;
        }
        ...【WaterMarkSetRect.javaと同じ処理のため省略
             ・PtlParamInputを用いてPtlPDFDocument docに入力PDFをロード
             ・PtlParamOutputを用いて出力PDF名を指定
             ・BufferedReader brを設定してキー入力読み取りを準備する】...

            // 透かしの追加
            appendWaterMarkSetPageRange(doc, br, pageRange, setNotInFirst, setNotInLast);
        ...【EncryptWithUserPass.javaと同じ処理のため省略
             ・PtlParamOutputを用いてPtlPDFDocument docの内容を出力
             ・PtlException, Exception, Error を catchするエラー処理
             ・finally文で"--完了--"と表示する処理】...
    }

    public static void appendWaterMarkSetPageRange(PtlPDFDocument doc, BufferedReader br,
                                                   String pageRange, boolean setNotInFirst,
                                                   boolean setNotInLast)

        throws PtlException, Exception, Error {
        try (PtlParamWaterMarkText waterMarkText = new PtlParamWaterMarkText()) {
            // 透かしを入れるページの範囲の設定 PAGE_RANGE_CUSTOM : ページ範囲指定
            waterMarkText.setCustomPageRange(pageRange);
            waterMarkText.setPageRange(PtlParamWaterMark.PAGE_RANGE.PAGE_RANGE_CUSTOM);
            //先頭ページに透かしを配置するかしないか false:配置する true: 配置しない
            waterMarkText.setNotInFirst(setNotInFirst);
            //最終ページに透かしを配置するかしないか false:配置する true: 配置しない
            waterMarkText.setNotInLast(setNotInLast); 


            // 以下、その他の項目について透かしであることが分かりやすいようデフォルトの設定をする
            // 透かしの配置の設定
            waterMarkText.setAlign(PtlParamWaterMark.ALIGN.ALIGN_CENTER);

        ...【WaterMarkSetRect.javaのappendWaterMarkSetRect()と同じ処理のため省略。
           配置位置はWaterMarkSetPageRange.javaのappendWaterMarkSetPageRange()のものを共通とする。
             ・ページ範囲以外の、テスト用テキスト透かしに共通の設定をセットする。
             ・設定項目:配置位置・名前・Zオーダー・不透明度・文字列・
              タイリング・フォント・文字の色・縁取りの色・対角線配置の有無・配置角度
             ・PtlPDFDocument docにテキスト透かしを設定する】...
        }
    }

    /**
     * 0または1を入力されたargsにより、trueまたはfalseを返すメソッド。
     * 
     * @param args 与えられるコマンドライン引数。0または1でtrueまたはfalseを指定する。
     * @param errorMessage argsが0か1でなかった場合に出力されるエラーメッセージを指定する。
     * @return argsの数値を読み取った結果を戻す
     * @throws java.lang.IllegalArgumentException argsが0か1でなかった場合に発生。
     */
    public static boolean readBoolArgs(String args, String errorMessage)
        throws IllegalArgumentException {
        boolean trueOrFalse = false;

        // argsの読み取り
        switch(args) {
        case "0":
            trueOrFalse = false;
            break;
        case "1":
            trueOrFalse = true;
            break;
        default:
            throw new IllegalArgumentException(errorMessage);
        }

        return trueOrFalse;
    }
}

プログラムファイル名

WaterMarkSetPageRange.java

入出力操作の例

images/WaterMarkSetPageRange.png

この例では、4ページ目から11ページ目まで透かしを配置します。次図は透かしを設定したPDF文書のサムネイル表示です。

images/WaterMarkSetPageRange-example.png

図2・3 ページ範囲を指定して透かしを配置