
透かしの文字囲みテキストの文字まわりを罫線で囲んだPDF透かしを挿入します。
取り込んだPDFだけでなく、プログラム上で作成したページをPDF透かしとして挿入できます。
本プログラム例では、任意の文字列をコマンドライン引数で指定し、その文字列を枠線で囲んだものをPDF透かしとして挿入します。
プログラム例は次の動作の組み合わせです。
(ページオブジェクトの作成についての詳細は「『PDF CookBook』(第1巻)1.1.6 白紙ページの挿入」を、矩形の描画についての詳細は「『PDF CookBook』(第1巻)2.4.2 パスで矩形の描画」を参照してください)
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名を指定】...
// 透かしの追加
appendPdfWaterMarkWithString(doc, stringToDeco);
...【EncryptWithUserPass.javaと同じ処理のため省略
・PtlParamOutputを用いてPtlPDFDocument docの内容を出力
・PtlException, Exception, Error を catchするエラー処理
・finally文で"--完了--"と表示する処理】...
}
public static void appendPdfWaterMarkWithString(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

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