8.1.1 透かしをAcroabtで加工可能にする

WaterMarkSetAcrobatCompatible_Top

狙い・効果

Acrobatで加工・編集可能な設定で透かし(Acrobat互換)透かしを入れたPDFを出力します。

処理の概要

Acrobat互換にすることで、出力PDFに入った透かしはAcrobat上で透かしとして認識され、編集機能を使って加工・編集することができるようになります。

挿入する透かしにAcrobat非互換のプロパティを設定しないでください。Acrobat互換を指定した透かしにAcrobat非互換のプロパティが設定されていた場合、プログラムはエラーコード200[Invalid parameter value]の例外を起こして停止します。

非互換のプロパティは次のような内容です。

全透かし共通の非互換プロパティテキスト透かし独自の非互換プロパティ
・タイリング指定をオンにしている・文字の輪郭色の指定をしている
・連続しないページ番号の挿入ページ指定・対角線配置の指定をしている
・余白設定をしている
・挿入位置の矩形指定をしている

サンプルプログラムでは、テキスト透かしを挿入する際にAcrobat互換にするかどうかを引数で指定します。

透かしの見た目の設定については、次のように指定します。

・ 透かしの名前:waterMarkText・テキストのZオーダー:テキストの全面
・テキストの色:赤色・透明度:不透
・フォント:Times New Roman 72ポイント・テキストの角度:15度
・テキスト配置:中央

『PDF Tool API』の主な機能

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class WaterMarkSetAcrobatCompatible {
    // そのクラスのusageを表示する関数
    public static void printUsage() {
        System.out.print("usage: java WaterMarkSetName in-pdf-file out-pdf-file ");
        System.out.println("set-acrobat-compatible");
        System.out.println("set-acrobat-compatible : ");
        System.out.println("0:透かしをAcrobat互換にしない  1:透かしをAcrobat互換にする");        
    }

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

        // コマンドライン引数の読み取り
        boolean setAcrobatCompatible = false;
        try {
            setAcrobatCompatible = readBoolArgs(args[2], "set-acrobat-compatibleは 0か1で指定してください。");
        }
        catch (IllegalArgumentException ex) {
            System.out.println(ex.getMessage());
            printUsage(); // usageメッセージの表示
            return;
        }

        try (PtlParamInput inputFile = new PtlParamInput(args[0]);
             PtlParamOutput outputFile = new PtlParamOutput(args[1]);
             PtlPDFDocument doc = new PtlPDFDocument()) {
            // PDFファイルをロードします。
            doc.load(inputFile);
            // 透かしの追加
            appendWaterMarkSetAcrobatCompatible(doc, setAcrobatCompatible);
            // ファイルに保存します。
            doc.save(outputFile);
        }
	...【GetPDFVersion.javaと同じ処理のため省略
	   ・エラーメッセージ処理と出力】...
    }

    public static void appendWaterMarkSetAcrobatCompatible(PtlPDFDocument doc, boolean setAcrobatCompatible)
        throws PtlException, Exception, Error {
        try (PtlParamWaterMarkText waterMarkText = new PtlParamWaterMarkText()) {
            // 透かしの名前の設定
            waterMarkText.setAcrobatCompatible(setAcrobatCompatible);

            //setAcrobatCompatibleをtrueにしたときにPDF出力ができるため、以下の設定をする
            // PtlParamWaterMark.setCustomPageRange()では不連続なページを指定しない
            // PtlParamWaterMark.setMargin()を設定しない
            // PtlParamWaterMark.setRect()を設定しない
            // PtlParamWaterMark.setTiling()をfalseにする
            waterMarkText.setTiling(false);
            // PtlParamWaterMarkText.setOutlineColor()を設定しない
            // PtlParamWaterMarkText.setWriteDiagonal()をfalseにする
            waterMarkText.setWriteDiagonal(false);


            // 以下、その他の項目について透かしであることが分かりやすいようデフォルトの設定をする
            // 透かしの名前の設定
            waterMarkText.setName("waterMarkText");            // 透かしの配置の設定
            waterMarkText.setAlign(PtlParamWaterMark.ALIGN.ALIGN_CENTER);
            // 透かしのZオーダーの設定 ZORDER_FRONT = 1 
            waterMarkText.setZorder(PtlParamWaterMark.ZORDER.ZORDER_FRONT);
            // 透かしの不透明度の設定
            waterMarkText.setOpacity(1.0f);
            // 透かしに指定する文字列の設定
            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);
            }
            // 透かしのテキストを任意の角度で配置する設定
            waterMarkText.setTextAngle(15.0f);
            // デフォルトの設定終わり

            // 透かしを文書に設定する
            doc.appendWaterMark(waterMarkText);
        }
    }

    /**
     * 0または1を入力されたargsにより、trueまたはfalseを返すメソッド。
     * 
     * @param args 与えられるコマンドライン引数。0または1でtrueまたはfalseを指定する。
     * @param errorMessage argsが0か1でなかった場合に出力されるエラーメッセージを指定する。
     * @return argsの数値を読み取った結果を戻す
     * @throws java.lang.IllegalArgumentException argsが0か1でなかった場合に発生。
     */
    public static boolean readBoolArgs(String args, String errorMessage)
        throws IllegalArgumentException {
	...【FixUpPDFASetSaveOption.javaと同じ処理のため省略
	   ・0または1を読み取り、boolean型のfalseまたはtrueを返す関数】...
    }
}

プログラムファイル名

WaterMarkSetAcrobatCompatible.java

入出力操作の例

C:\samples>java cookbook.WaterMarkSetAcrobatCompatible 
usage: java WaterMarkSetName in-pdf-file out-pdf-file set-acrobat-compatible
set-acrobat-compatible : 
0:透かしをAcrobat互換にしない  1:透かしをAcrobat互換にする

C:\samples>java cookbook.WaterMarkSetAcrobatCompatible novelText.pdf Output_WaterMarkSetAcrobatCompatible.pdf 1 
-- 完了 --

操作例で挿入された透かしはAdobe Acrobat上で編集が可能です。

下図は挿入した透かしに対し、Adobe Acrobatの編集機能である「透かしの更新」で加工しようとしている例です。

5-8-1-1_WaterMarkSetAcrobatCompatible_01

図8.1 Acrobat互換の透かしをAdobe Acrobatで編集しようとしている例