透かしの文字囲みテキストの文字まわりを罫線で囲んだ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透かしとして設定したものです。