1.1.8 ハイライト注釈の作成

images/AppendAnnotHighlight-top.png

狙い・効果

指定した内容のハイライト注釈を挿入します。

処理の概要

ハイライト注釈はテキストにハイライトを付けます。ハイライト注釈でもポップアップウィンドウに表示する内容を設定するためポップアップ注釈に情報を指定します。ハイライト注釈はデフォルトでは横書き文書向けの設定になっており、ハイライトの塗りが左右に膨らみます。縦書き文書にハイライト注釈を挿入する場合はsetVerticalDirectionメソッドにより、ハイライトの塗りが上下に膨らむように変更できます。

本サンプルプログラムでは、入力PDFの1ページ目に指定した矩形のハイライト注釈を挿入します。ハイライト注釈の色、透明度、挿入矩形の座標を指定します。ハイライト注釈の色についてはRGBを用いて指定します(色指定の詳細は「『PDF CookBook』(第1巻)2.1.3 文字の色指定」を参照してください)。注釈内に表示されるテキスト、注釈を追加したユーザ名、注釈の内容を表すタイトルは固定です。

PDF Tool APIの主な機能

プログラム例

package cookbook;

import java.io.*;
import jp.co.antenna.ptl.*;

public class AppendAnnotHighlight {
    // そのクラスのusageを表示する関数
    private static void printUsage(){
            System.out.println("usage: java AppendAnnotHighlight in-pdf-file out-pdf-file" +
                               " opacity set-vertical color-R color-G color-B");
            System.out.println("set-vertical:テキストを縦書き方向に囲むかどうか");
            System.out.println("0 : 横書き方向に囲む 1 : 縦書き方向に囲む");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 2)
        {
            printUsage();
            return;
        }

        // コマンドライン引数の読み取り
        float opacity = Float.parseFloat(args[2]);
        boolean setVertical;
        // setVerticalの判定
        try {
            setVertical = readBoolArgs(args[3], "set-verticalには" +
                                               "0か1の数値を指定してください。");
        }
        catch (IllegalArgumentException ex) {
            System.out.println(ex.getMessage());
            printUsage(); // usageメッセージの表示
            return;
        }
        float colorR = Float.parseFloat(args[4]);
        float colorG = Float.parseFloat(args[5]);
        float colorB = Float.parseFloat(args[6]);

        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);

            try (PtlPages pages = doc.getPages()) {// ページコンテナの取得
                // ページコンテナが空かどうか
                if (pages.isEmpty()) {
                    System.out.println("ページコンテナが空\n");
                    return;
                }

                try (PtlPage page = pages.get(0)) {// 1ページ目の取得
                    // テキスト注釈追加
                    addAnnotHighlight(page,br, opacity, setVertical,
                                      colorR, colorG, colorB);
                }
            }

            // ファイルに保存します。
            doc.save(outputFile);
        }
	...【AppendAnnotStampDefault.javaと同じ処理のため省略
	  ・エラーメッセージ処理と出力】...
    }

    public static void addAnnotHighlight(PtlPage page, BufferedReader br, float opacity,
                                         boolean setVertical, float colorR, float colorG,
                                         float colorB)
        throws PtlException, Exception, Error {
        try (PtlAnnots annots = page.getAnnots(); // 注釈コンテナの取得
             PtlAnnotHighlight annotHighlight = new PtlAnnotHighlight();
             // ハイライト注釈用のQuadPointコンテナを取得
             PtlQuadPoints annotQuadPoints = annotHighlight.getQuadPoints();
             PtlAnnotPopup annotpopup = new PtlAnnotPopup()) {// ポップアップ注釈

            //ハイライト注釈用のQuadPointコンテナにQuadPointを設定する。

            float[] coordinate = setFloatCoordinate(br); //top, bottom, right, left

            try(PtlQuadPoint outputQuadPoint = new PtlQuadPoint();
                PtlPoint topRight = new PtlPoint(coordinate[2], coordinate[0]);
                PtlPoint topLeft = new PtlPoint(coordinate[3], coordinate[0]);
                PtlPoint bottomRight = new PtlPoint(coordinate[2], coordinate[1]);
                PtlPoint bottomLeft = new PtlPoint(coordinate[3],coordinate[1])) {
                    outputQuadPoint.setTopRight(topRight);
                    outputQuadPoint.setTopLeft(topLeft);
                    outputQuadPoint.setBottomRight(bottomRight);
                    outputQuadPoint.setBottomLeft(bottomLeft);
                    annotQuadPoints.append(outputQuadPoint);
            }

            // 不透明度を設定 0.0 ~ 1.0。0.0が透明、1.0が不透明
            annotHighlight.setMarkUpCA(opacity);

            // Highlight注釈を縦書きにするか。trueが縦書き、falseが横書き(デフォルト)
            annotHighlight.setVerticalDirection(setVertical);

            // 色を設定 setColor(const PtlColorDeviceRGB& color);
            try (PtlColorDeviceRGB color =  new PtlColorDeviceRGB(colorR, colorG, colorB)) {
                annotHighlight.setColor(color);
            }

            // 内容を設定(注釈に表示されるテキスト)
            annotHighlight.setTextContents("ハイライト注釈。AppendAnnotHighlightで設定");

            // 日時の設定(2013/01/01 00:00:00)
            try (PtlDate date = new PtlDate(2013, 1, 1, 0, 0, 0)) {
                annotHighlight.setDate(date);
            }

            // 注釈フラグを設定(論理和) FLAG_NOROTATE = 0x00000010
            /* 注釈の外観をページにあわせて回転させません */
            annotHighlight.setAnnotFlags(PtlAnnotHighlight.FLAG_NOROTATE);


            // 境界線スタイルを設定 BORDER_SOLID = 1, /* 実線(注釈を囲む実線の矩形) */
            annotHighlight.setBorderStyle(PtlAnnotHighlight.BORDER_STYLE.BORDER_SOLID);

            // 境界線幅を設定 BORDER_WIDTH_THIN = 1, /* 細い */
            annotHighlight.setBorderWidth(
                PtlAnnotHighlight.BORDER_LINE_WIDTH.BORDER_WIDTH_THIN);

            // ポップアップウィンドウのユーザー名
            annotHighlight.setMarkUpTitle("PDF Tool API");

            // ポップアップ注釈の題
            annotHighlight.setMarkUpSubj("ハイライト注釈");

            // 注釈生成日時の設定(2012/12/31 23:59:59)
            try (PtlDate dateMarkup = new PtlDate(2012, 12, 31, 23, 59, 59)) {
                annotHighlight.setMarkUpDate(dateMarkup);
            }

            // ポップアップ
            // 矩形座標を設定 座標の単位はmmで原点(0,0)は左下
            try (PtlRect rectPopup = new PtlRect(100.0f, 50.0f, 150.0f, 150.0f)) {
                annotpopup.setRect(rectPopup);
            }

            // オープン状態を設定 true=オープン状態、 false=クローズ状態
            annotpopup.setOpenState(true);

            // ポップアップ注釈を設定
            annotHighlight.setAnnotPopUp(annotpopup);

            // 注釈の追加 
            annots.append(annotHighlight);

        }
    }
    /**
     * QuadPointについて、矩形の各値を入力してその座標値をもつ矩形を返す関数。
     * 原点はPDFの左下端。
     * bottomよりtopが大きい、leftよりもrightが大きいなどの矛盾した数値は入力できない。
     * 
     * @param br BufferedReader。数値の読み取りに使う。
     * @return 指定したleft, bottom, right, topの数値を持つPtlRect
     */
    private static float[] setFloatCoordinate(BufferedReader br)
        throws IOException, PtlException, Exception, Error {
        float[] coordinate = new float[4]; //top, bottom, right, left
        float top, bottom, left, right;
        boolean isValueOkay = false;
        while(!isValueOkay) {
            System.out.println("配置矩形の各数値を入力してください。");
            System.out.print("top (mm) : ");
            coordinate[0] = Float.parseFloat(br.readLine());
            System.out.print("bottom (mm) : ");
            coordinate[1] = Float.parseFloat(br.readLine());
            if(coordinate[0] < coordinate[1]) { // top < bottom
                System.out.println("topの値はbottomよりも大きい値を指定して" +
                                   "再度入力してください。");
                continue;
            }
            System.out.print("right (mm) : ");
            coordinate[2] = Float.parseFloat(br.readLine());
            System.out.print("left (mm) : ");
            coordinate[3] = Float.parseFloat(br.readLine());
            if(coordinate[2] < coordinate[3]) { // right < left
                System.out.println("rightの値はleftよりも大きい値を指定して" +
                                   "再度入力してください。");
                continue;
            }

            //矩形を正しく指定できた場合の処理
            isValueOkay = true;
        }
        return coordinate;
    }

    /**
     * 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
    {
        boolean trueOrFalse = false;

        // argsの読み取り
        switch(args){
        case "0":
            trueOrFalse = false;
            break;
        case "1":
            trueOrFalse = true;
            break;
        default:
            throw new IllegalArgumentException(errorMessage);
        }

        return trueOrFalse;
    }    
}

プログラムファイル名

AppendAnnotHighlight.java

入出力操作の例

C:\samples>java cookbook.AppendAnnotHighlight 
usage: java AppendAnnotHighlight in-pdf-file out-pdf-file opacity set-vertical color-R color-G color-B
set-vertical:テキストを縦書き方向に囲むかどうか
0 : 横書き方向に囲む 1 : 縦書き方向に囲む

C:\samples>java cookbook.AppendAnnotHighlight sample-htext.pdf highlight-h.pdf 0.5 0 1 0.5 0.1 
配置矩形の各数値を入力してください。
top (mm) : 200
bottom (mm) : 192
right (mm) : 80
left (mm) : 25
-- 完了 --

次図はハイライト注釈、およびハイライト注釈のアイコンをクリックしてポップアップ注釈を表示したところです。

ハイライト注釈の作成