1.1.10 注釈を塗りつぶすための内部色の取得と設定

images/ChangeAnnotsInteriorColor-top.png

狙い・効果

注釈の塗りつぶし注釈に設定された塗りつぶしの色を変更します。

処理の概要

フリーテキスト注釈、ライン注釈、矩形注釈、円形注釈、折れ線注釈、多角形注釈はそれぞれ、内部色を持つことができます。PDF Tool APIではこれらの内部色を取得・変更できます。また、指定しない場合、内部色は透過になります。色の指定方法についての詳細は「『PDF CookBook』(第1巻)2.1.3 文字の色指定」を参照してください。

本サンプルプログラムでは、入力PDFに含まれているフリーテキスト注釈、ライン注釈、正方形注釈、円形注釈、折れ線注釈、多角形注釈のうち1種類を指定し、それを指定した色に塗り替えます。

PDF Tool APIの主な機能

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class ChangeAnnotsInteriorColor {
    // そのクラスのusageを表示する関数
    private static void printUsage(){
            System.out.println("usage: java ChangeAnnotsInteriorColor in-pdf-file" +
                               " out-pdf-file 色変更の注釈種類" +
                               " interior-color-R interior-color-G interior-color-B");
            System.out.println("色変更の注釈種類");
            System.out.println("0 : FreeText  1 : Line  2 : Square" +
                               "  3 : Circle  4 : PolyLine 5 : Polygon");
    }

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

        // 色変更の注釈種類
        int annotKindNum = Integer.parseInt(args[2]);
        PtlAnnot.ANNOT_TYPE annotKind;
        switch (annotKindNum) {
        case 0:
            annotKind = PtlAnnot.ANNOT_TYPE.TYPE_FREE_TEXT;
            break;
        case 1:
            annotKind = PtlAnnot.ANNOT_TYPE.TYPE_LINE;
            break;
        case 2:
            annotKind = PtlAnnot.ANNOT_TYPE.TYPE_SQUARE;
            break;
        case 3:
            annotKind = PtlAnnot.ANNOT_TYPE.TYPE_CIRCLE;
            break;
        case 4:
            annotKind = PtlAnnot.ANNOT_TYPE.TYPE_POLYLINE;
            break;
        case 5:
            annotKind = PtlAnnot.ANNOT_TYPE.TYPE_POLYGON;
            break;
        default:
            printUsage();
            return;
        }
        // コマンドライン引数の読み取り
        float colorR = Float.parseFloat(args[3]);
        float colorG = Float.parseFloat(args[4]);
        float colorB = Float.parseFloat(args[5]);


        try (PtlParamInput inputFile = new PtlParamInput(args[0]);
             PtlParamOutput outputFile = new PtlParamOutput(args[1]);
             PtlPDFDocument doc = new PtlPDFDocument()) {

            // PDFファイルをロードします。
            doc.load(inputFile);

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

                int numPages = pages.getCount();
                for(int i=0; i<numPages; i++) {
                    System.out.println("ページ" + (i+1));

                    try (PtlPage page = pages.get(i)) {
                        // 注釈コンテナが空かどうか
                        if (!page.hasAnnots()) {
                            System.out.println("注釈なし");
                            continue;
                        }

                        try (PtlAnnots annots = page.getAnnots()) {
                            // 注釈数の取得
                            int numAnnots = annots.getCount();
                            System.out.println("注釈数 : " + numAnnots);
                            for(int j=0; j<numAnnots; j++) {
                                try (PtlAnnot annot = annots.get(j)) {
                                    if(annot.getType() == annotKind){
                                        changeAnnotInteriorColor(annot,
                                                                 colorR, colorG, colorB);
                                    }
                                }
                            }
                        }
                    }
                }
            }

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

    public static void changeAnnotInteriorColor(PtlAnnot annot,
                                                float colorR, float colorG, float colorB)
        throws PtlException, Exception, Error {
        try (PtlColorDeviceRGB color = new PtlColorDeviceRGB(colorR, colorG, colorB))
        {
            annot.setInteriorColor(color);
        }
    }
}

プログラムファイル名

ChangeAnnotsInteriorColor.java

入出力操作の例

C:\samples>java cookbook.ChangeAnnotsInteriorColor 
usage: java ChangeAnnotsInteriorColor in-pdf-file out-pdf-file 色変更の注釈種類 interior-color-R interior-color-G interior-color-B
色変更の注釈種類
0 : FreeText  1 : Line  2 : Square  3 : Circle  4 : PolyLine 5 : Polygon

C:\samples>java cookbook.ChangeAnnotsInteriorColor blank-annots.pdf change-color-0.pdf 0 0 1 0 
ページ1
注釈数 : 15
-- 完了 --

C:\samples>java cookbook.ChangeAnnotsInteriorColor blank-annots.pdf change-color-4.pdf 4 0 1 0 
ページ1
注釈数 : 15
-- 完了 --

C:\samples>java cookbook.ChangeAnnotsInteriorColor blank-annots.pdf change-color-5.pdf 5 0 1 0 
ページ1
注釈数 : 15
-- 完了 --

左からフリーテキスト注釈(0)、折れ線(4)、多角形(5)の内部色の設定結果です。

注釈を塗りつぶすための内部色の取得と設定