2.3.2 PDF透かしの挿入

images/PdfWaterMarkAppend-top.png

狙い・効果

PDF文書自体を透かしとして挿入します。会社のロゴやレターヘッドなどの線画図形を予めPDF文書として用意しておき、これを透かしとして使用できます。

処理の概要

任意のPDF文書の1ページを透かしとしてPDF文書のページに挿入します。透かしの共通設定に加えて、PDF文書の透かしにするページの指定、透かしの倍率を指定できます。倍率については2.3.4 倍率の設定を参照してください。

本プログラム例では、コマンドライン引数で透かしにするPDFと透かしにするページ番号を指定しています。

PDF Tool APIの主な機能

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

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

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

        // コマンドライン引数の読み取り
        String pathPdf = args[2];
        int pageNum = Integer.parseInt(args[3]);
        ...【WaterMarkSetMargin.javaと同じ処理のため省略
             ・PtlParamInputを用いてPtlPDFDocument docに入力PDFをロード
             ・PtlParamOutputを用いて出力PDF名を指定】...

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

    public static void appendPdfWaterMark(PtlPDFDocument doc, String pathPdf,
                                          int pageNum)
        throws PtlException, Exception, Error
    {
        try (PtlParamWaterMarkPDF waterMarkPdf = new PtlParamWaterMarkPDF())
        {
            try (PtlPDFDocument doc_watermark = new PtlPDFDocument();
                 PtlParamInput inputPdf = new PtlParamInput(pathPdf))     // PDFファイル
            {
                // PDFファイルをロード
                doc_watermark.load(inputPdf);

                // 透かしに使用するページの取得
                try (PtlPages pages = doc_watermark.getPages()) //ページコンテナの取得
                {
                    //ページコンテナが空かどうか
                    if (pages.isEmpty())
                    {
                        System.out.println("ページコンテナが空\n");
                        return;
                    }
                    try (PtlPage page = pages.get(pageNum - 1))    // 指定したページ
                    {
                        // 透かしに使用するPDF文書ページを設定
                        waterMarkPdf.setPage(page);
                    }
                }
            }
            // 透かしの倍率の設定
            waterMarkPdf.setScale(0.0f);

            // 以下、PDF透かし以外と共通するデフォルトの設定
            // 透かしの名前の設定
            waterMarkPdf.setName("waterMarkPdf");
        ...【ImageWaterMarkAppend.javaのappendImageWaterMark()と同じ処理のため省略。
             ・名前以外の、テスト用透かしに共通の設定をセットする。
             ・設定項目:余白・配置位置・Zオーダー・不透明度・タイリング
             ・PtlPDFDocument docに透かしを設定する】...
        }
    }
}

プログラムファイル名

PdfWaterMarkAppend.java

入出力操作の例

images/PdfWaterMarkAppend.png

ページ罫線を設定したPDF文書を、PDF透かしとして使います。左が元のPDF文書と透かし用のPDF文書です。右はページ罫線を透かしとして付けたPDF文書です。

images/PdfWaterMarkAppend-example.png

図2・16 PDF透かしの挿入