透かしの配置領域とする配置矩形、および矩形内における透かしの寄せを指定します。
透かしを配置する基準とする配置矩形の上下左右辺の座標を指定します。座標の単位はmmで原点(0,0)は表示矩形の左下となります。
配置矩形を設定した場合、その透かしはAcrobat®互換にすることができなくなります。透かしのAcrobat®互換の詳細に関しては「『PDF CookBook』(第5巻)第8章 透かしのAcrobat®互換対応と機能追加」を参照してください。
配置矩形の内部における透かしの寄せを、次表の列挙型定数で指定します。
列挙型定数 | 説明 |
---|---|
ALIGN_TOP_LEFT | 左上 |
ALIGN_TOP | 中央上 |
ALIGN_TOP_RIGHT | 右上 |
ALIGN_LEFT | 中央左 |
ALIGN_CENTER | 中央(デフォルト値) |
ALIGN_RIGHT | 中央右 |
ALIGN_BOTTOM_LEFT | 左下 |
ALIGN_BOTTOM | 中央下 |
ALIGN_BOTTOM_RIGHT | 右下 |
本プログラム例ではその他の設定項目は固定にしています。
package cookbook; import java.io.*; import jp.co.antenna.ptl.*; public class WaterMarkSetRect { /** * @param args the command line arguments */ public static void main(String[] args) { if (args.length < 3) { System.out.println("usage: java WaterMarkSetRect in-pdf-file out-pdf-file watermark-align"); return; } String waterMarkAlign = args[2]; try (PtlParamInput inputFile = new PtlParamInput(args[0]); PtlParamOutput outputFile = new PtlParamOutput(args[1]); PtlPDFDocument doc = new PtlPDFDocument(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) { // PDFファイルをロードします。 doc.load(inputFile); // 透かしの追加 appendWaterMarkSetRect(doc, br, waterMarkAlign); ...【EncryptWithUserPass.javaと同じ処理のため省略 ・PtlParamOutputを用いてPtlPDFDocument docの内容を出力 ・PtlException, Exception, Error を catchするエラー処理 ・finally文で"--完了--"と表示する処理】... } public static void appendWaterMarkSetRect(PtlPDFDocument doc, BufferedReader br, String waterMarkAlign) throws PtlException, Exception, Error { try (PtlParamWaterMarkText waterMarkText = new PtlParamWaterMarkText()) { // 透かしを配置する矩形の設定(setRectCoordinate()を使って改めて指定する。) System.out.println("透かしを配置する矩形の設定を行います。"); try (PtlRect rect = new PtlRect()) { waterMarkText.setRect(setRectCoordinate(br, rect)); } // 透かしの配置の設定 System.out.println("透かしの配置(watermark-align)を設定します。: " + waterMarkAlign); try { waterMarkText.setAlign(PtlParamWaterMark.ALIGN.valueOf(waterMarkAlign)); } catch (IllegalArgumentException ex){//PtlContent.ALIGNが誤っていた場合のエラーメッセージ System.out.println(ex.getMessage()); System.out.println("ERROR : alignにはPtlContent.ALIGNに含まれる名前を指定してください。"); ex.printStackTrace(); } // 以下、その他の項目について透かしであることが分かりやすいようデフォルトの設定をする // 透かしの名前の設定 waterMarkText.setName("nameOfWaterMark"); // 透かしのZオーダーの設定 ZORDER_FRONT = 1 waterMarkText.setZorder(PtlParamWaterMark.ZORDER.ZORDER_FRONT); // 透かしを入れるページの範囲の設定 PAGE_RANGE_ALL = 0 /* 全ページ */ waterMarkText.setPageRange(PtlParamWaterMark.PAGE_RANGE.PAGE_RANGE_ALL); // 透かしの不透明度の設定 waterMarkText.setOpacity(1.0f); // 透かしをタイリングして配置するかどうかの設定 // false : タイリングして配置しない waterMarkText.setTiling(false); // 透かしに指定する文字列の設定 waterMarkText.setString("WaterMark Test"); // 透かしに指定するフォントの設定 try (PtlParamFont font = new PtlParamFont("Times New Roman", 72.0f, PtlParamFont.WEIGHT.WEIGHT_MEDIUM, false, true)) { waterMarkText.setFont(font); } // 透かしの文字に指定する色の設定 try (PtlColorDeviceRGB colorText = new PtlColorDeviceRGB(1.0f, 0.0f, 0.0f)) { waterMarkText.setTextColor(colorText); } // 透かしの文字の縁取りに指定する色の設定 try (PtlColorDeviceRGB colorOutline = new PtlColorDeviceRGB(0.0f, 1.0f, 0.0f)) { waterMarkText.setOutlineColor(colorOutline); } // 透かしのテキストを対角線上に配置する設定 // false : 対角線上に配置しない waterMarkText.setWriteDiagonal(false); // 透かしのテキストを任意の角度で配置する設定 waterMarkText.setTextAngle(15.0f); // デフォルトの設定終わり // 透かしを文書に設定する doc.appendWaterMark(waterMarkText); } } /** * 矩形の各値を入力してその座標値をもつ矩形を返す関数。 * 原点はPDFの左下端。 * bottomよりtopが大きい、leftよりもrightが大きいなどの矛盾した数値は入力できない。 * 特に外部からの呼び出しを想定しないためprivateとする。 * @param br BufferedReader。数値の読み取りに使う。 * @param outputRect left, bottom, right, topの数値を入力する対象のPtlRect * @return 指定したleft, bottom, right, topの数値を持つPtlRect * @throws IOException * @throws PtlException * @throws Exception * @throws Error */ public static PtlRect setRectCoordinate(BufferedReader br, PtlRect outputRect) throws IOException, PtlException, Exception, Error { float top, bottom, left, right; boolean isValueOkay = false; while(!isValueOkay) { System.out.println("指定する矩形の各数値を入力してください。"); System.out.print("top (mm) : "); top = Float.parseFloat(br.readLine()); System.out.print("bottom (mm) : "); bottom = Float.parseFloat(br.readLine()); if(top < bottom) {//不正矩形は再入力させる System.out.println("topの値はbottomよりも大きい値を指定して再度入力してください。"); continue; } System.out.print("left (mm) : "); left = Float.parseFloat(br.readLine()); System.out.print("right (mm) : "); right = Float.parseFloat(br.readLine()); if(right < left) {//不正矩形は再入力させる System.out.println("rightの値はleftよりも大きい値を指定して再度入力してください。"); continue; } //矩形を正しく指定できた場合の処理 isValueOkay = true; outputRect.setLeft(left); outputRect.setBottom(bottom); outputRect.setRight(right); outputRect.setTop(top); } return outputRect; } }
WaterMarkSetRect.java
この例は、配置矩形に用紙サイズを、配置にALIGN_CENTERを入力しています。透かしは各ページの中央に配置されます。次図は先頭ページのみの例です。