2.2.3 フッターにページ番号追加

images/TextWaterMarkPageNumFooter-top.png

狙い・効果

PDF文書のページをカウントして、フッターにページ番号を付けます。

処理の概要

本プログラムではテキスト透かしの機能を利用してフッターにページ番号を追加します。ページ番号の形式は、[ページ番号/総ページ数]とします。

PDF文書は簡単にページを追加(挿入)・削除ができます(「『PDF CookBook』(第1巻)第1章 1.1 ページ編集」を参照)。ページを追加・削除するとページ番号が変わってきます。

『PDF Tool API』 の透かしは削除できます(2.1.10 透かしの削除参照)ので、ページ番号が変ったとき、透かしを一旦削除して、ページ番号の付け直しをする使い方ができます。

『PDF Tool API』の主な機能

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class TextWaterMarkPageNumFooter {
    // そのクラスのusageを表示する関数
    public static void printUsage() {
        System.out.println("usage: java TextWaterMarkPageNumFooter in-pdf-file out-pdf-file");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 2) {
            printUsage(); // usageメッセージの表示
            return;
        }
        ...【WaterMarkSetMargin.javaと同じ処理のため省略
             ・PtlParamInputを用いてPtlPDFDocument docに入力PDFをロード
             ・PtlParamOutputを用いて出力PDF名を指定】...

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

    public static void appendPageNumFooter(PtlPDFDocument doc)
        throws PtlException, Exception, Error {
        try (PtlParamWaterMarkText waterMarkText = new PtlParamWaterMarkText()) {
            // 以下、フッターの書式についてデフォルトの設定をする
            // 透かしの名前の設定
            waterMarkText.setName("pageNumFooter");
            // 透かしのZオーダーの設定 ZORDER_FRONT = 1 
            waterMarkText.setZorder(PtlParamWaterMark.ZORDER.ZORDER_FRONT);
            // 透かしの不透明度の設定
            waterMarkText.setOpacity(1.0f);
            // 透かしをタイリングして配置するかどうかの設定
            // false : タイリングして配置しない
            waterMarkText.setTiling(false);
            // 透かしに指定するフォントの設定
            try (PtlParamFont font = new PtlParamFont("Times New Roman", 18.0f,
                                                      PtlParamFont.WEIGHT.WEIGHT_MEDIUM, false, true)) {
                waterMarkText.setFont(font);
            }
            // 透かしの文字に指定する色の設定
            try (PtlColorDeviceRGB colorText = new PtlColorDeviceRGB(0.0f, 0.0f, 0.0f)) {
                waterMarkText.setTextColor(colorText);
            }
            // 透かしの文字の縁取りに指定する色の設定
            try (PtlColorDeviceRGB colorOutline = new PtlColorDeviceRGB(0.0f, 0.0f, 0.0f)) {
                waterMarkText.setOutlineColor(colorOutline);
            }
            // 透かしのテキストを対角線上に配置する設定
            // false : 対角線上に配置しない
            waterMarkText.setWriteDiagonal(false);
            // 透かしのテキストを任意の角度で配置する設定
            waterMarkText.setTextAngle(0.0f);
            // フッターのデフォルト設定終わり



            // マージンを設定する
            waterMarkText.setMargin( 5.0f, 5.0f, 10.0f, 5.0f);
            // 透かしの配置の設定 ALIGN_BOTTOM : 中央下
            waterMarkText.setAlign(PtlParamWaterMark.ALIGN.ALIGN_BOTTOM);
            // 透かしを入れるページの範囲の設定 PAGE_RANGE_ALL : ページ範囲指定
            waterMarkText.setPageRange(PtlParamWaterMark.PAGE_RANGE.PAGE_RANGE_CUSTOM);

            int numPages = doc.getPageCount(); // 総ページ数の取得
            System.out.println("ページ数:" + numPages);
            System.out.println("処理中…");
            for (int i = 0; i < numPages; i++) {
                // 透かしを読み込んだページに配置するよう設定
                waterMarkText.setCustomPageRange(Integer.toString(i)); 
                // 透かしに指定する文字列の設定
                waterMarkText.setString(Integer.toString(i+1) + "/ "+ numPages + "pages");

                // 透かしを文書に設定する
                doc.appendWaterMark(waterMarkText);
            }
        }
    }

}

プログラムファイル名

TextWaterMarkPageNumFooter.java

入出力操作の例

images/TextWaterMarkPageNumFooter.png

出力されたPDF文書では、次図のようにページの下部にノンブルが挿入されています。

images/TextWaterMarkPageNumFooter-example.png

図2・9 テキスト透かしによるページ番号(ノンブル)設定例