2.3.3 透かしの枠線

images/PdfWaterMarkAddDecoString-top.png

狙い・効果

透かしの文字囲みテキスト透かしの文字まわりを罫線で囲みます。

処理の概要

本プログラム例では、任意の文字列をコマンドライン引数で指定し、その文字列を枠線で囲んだものをPDF透かしとして挿入します。

プログラム例は次の動作の組み合わせです。

(ページオブジェクトの作成についての詳細は『PDF CookBook』(第1巻)1.1.6 白紙ページの挿入を、矩形の描画についての詳細は『PDF CookBook』(第1巻)2.4.2 パスで矩形の描画を参照してください)

PDF Tool APIの主な機能

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

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

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

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

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

    public static void appendPdfWaterMark(PtlPDFDocument doc, String stringToDeco)
        throws PtlException, Exception, Error
    {
        try (PtlParamWaterMarkPDF waterMarkPdf = new PtlParamWaterMarkPDF())
        {
            // 透かしに使用するページの作成・取得
            try (PtlPDFDocument doc_watermark = new PtlPDFDocument();
                 PtlPages pages = doc_watermark.getPages(); // ページコンテナの取得
                 PtlPage blancPage = new PtlPage()) // 作成予定のページオブジェクトを作成
            {
                pages.append(blancPage, PtlPages.OPTION_NONE); // ページの追加
                try (PtlPage page = pages.get(0))  // 追加したページを指定
                {
                    // 追加したページに文字・枠を配置
                    WriteDecoratedString(page, stringToDeco);
                    // 透かしに使用するPDF文書ページを設定
                    waterMarkPdf.setPage(page);
                }
            }
            // 透かしの倍率の設定
            waterMarkPdf.setScale(1.0f);


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

    // stringToDecoに枠を作成する
    // 最初にstringToDecoに基づいて文字を配置し、矩形を後付けで作成する。
    public static void WriteDecoratedString(PtlPage page, String stringToDeco)
        throws PtlException, Exception, Error
    {
        try(PtlContent content = page.getContent()) 
		{
            // 文字の描画に使うパラメータクラス
            try(PtlParamWriteString writeString = new PtlParamWriteString();
                PtlParamFont font = new PtlParamFont(); //フォント指定に使うパラメータクラス
                PtlParamDrawShape drawShape = new PtlParamDrawShape())
            {
                // フォントサイズ:24.0f = 24pt
                float fontSize = 24.0f;
                // フォント名の設定
                font.setName("MS Pゴシック");
                // フォントサイズの設定 : 24.0f = 24pt
                font.setSize(fontSize);
                // フォントの設定
                writeString.setFont(font);
                // 文字色設定
                writeString.setTextColor(new PtlColorDeviceRGB(0.0f, 1.0f, 0.0f));

                // 挿入する文字列を囲む矩形のサイズ決定
                float textH = (25.4f * fontSize) / 72.0f;	//文字列の高さ
                float textW = font.getStringWidth(stringToDeco);	//文字列の幅
                PtlRect rectTxt = new PtlRect(2, 2, textW + 2, textH + 2);
                PtlRect rectPage = new PtlRect(0, 0, textW + 4, textH + 4);

                // テキスト枠を描画する
                // 枠の色設定
                drawShape.setLineColor(new PtlColorDeviceRGB(1.0f, 0.0f, 0.0f));
                drawShape.setFillColor(new PtlColorNone());

                // 追加する空白ページを作成するために、先頭ページのサイズに合わせます。
                page.setViewBox(rectPage);

                // 文字列出力
                content.writeString(rectTxt, PtlContent.ALIGN.ALIGN_BOTTOM_LEFT,
                                    stringToDeco, writeString);
                // 枠の出力
                content.drawRect(rectTxt, drawShape);
            }
        }
    }

}

プログラムファイル名

PdfWaterMarkAddDecoString.java

入出力操作の例

images/PdfWaterMarkAddDecoString.png

この動作例では、与えられた2018/05/30という文字列に対してそれを罫線で囲んだページオブジェクトを内部的に作成しています。出力されたPDFはそのページオブジェクトをPDF透かしとして設定したものです。

images/PdfWaterMarkAddDecoString-example.png

図2・17 罫線で文字囲みを作成して透かしとして設定