3.1.1 マスクの色

3-1-第1項マスクの色

狙い・効果

マスク矩形指定マスクの矩形を指定し、マスク矩形塗りつぶし指定した色で塗りつぶします。

処理の概要

マスクを指定したいページ及び塗りつぶす色を指定し、指定矩形内のテキスト、画像、図形を削除して塗りつぶします。 PDF Tool APIにおける色指定は、色空間を指定した上で、色要素を指定、という2 段階になります(詳細は「『PDF CookBook』(第1巻)2.1.3 文字の色指定」を参照してください)。本サンプルプログラムでは、色空間としてRGB カラーを使い、赤(R)、緑(G)、青(B)の3 原色それぞれの値を指定します。

PDF Tool APIの主な機能

PtlPage.APIsetMask(PtlParamSetMask paramSetMask): ページにマスクを設定する

PtlParamSetMask: マスク処理のパラメータを表現したクラス

PtlParamSetMask.APIappendRect(PtlRect rectMM): マスクする矩形を追加

PtlParamSetMask.APIsetMaskColor(PtlColor color): マスクの色を決定

プログラム例

package cookbook;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

import jp.co.antenna.ptl.*;

public class SetMaskColor {

    // そのクラスのusageを表示する関数
    private static void printUsage() {
            System.out.println("usage: java SetMaskColor in-pdf-file out-pdf-file" +
                               " page-num colorR colorG colorB");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 6) {
            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();
             BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
            // PDFファイルをロード
            doc.load(inputFile);

            // コマンドライン引数の判定
            int pageToAdd = Integer.parseInt(args[2]);
            int numPages = doc.getPageCount();
            System.out.println("ページ数:" + numPages);
            if((numPages < 0)||(numPages < pageToAdd))
            {
                System.err.println("page-numは入力PDFの全ページ数よりも小さい正の値を" +
                                   "指定してください。");
                return;
            }

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

                // ページの取得(パラメータindexは0が先頭のため1を引く)
                try (PtlPage page = pages.get(pageToAdd - 1);
                     PtlParamSetMask paramSetMask = new PtlParamSetMask();
                     // 矩形の形を指定
                     PtlRect rect = new PtlRect( setRectCoordinate(br) );
                     // 矩形の色を指定
                     PtlColorDeviceRGB color = new PtlColorDeviceRGB(colorR,
                                                                     colorG,
                                                                     colorB)) {

                    // マスク設定
                    paramSetMask.appendRect(rect);
                    paramSetMask.setMaskColor(color);
                    page.setMask(paramSetMask);
                }
            }

            // ファイルに保存します。
            doc.save(outputFile);
        }

	...【ExtractText.javaと同じ処理のため省略
	 ・エラーメッセージ処理と出力】...

    }

    /**
     * 矩形の各値を入力してその座標値をもつ矩形を返す関数。
     * 原点はPDFの左下端。
     * bottomよりtopが大きい、leftよりもrightが大きいなどの矛盾した数値は入力できない。
     * 特に外部からの呼び出しを想定しないためprivateとする。
     * 
     * @param br BufferedReader。数値の読み取りに使う。
     * @return 指定したleft, bottom, right, topの数値を持つPtlRect
     */
    private static PtlRect setRectCoordinate(BufferedReader br)
        throws IOException, PtlException, Exception, Error {
        float top, bottom, left, right;
        boolean isValueOkay = false;
        PtlRect outputRect = new PtlRect();
        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;
    }
}

プログラムファイル名

SetMaskColor.java

入出力操作の例

C:\samples>java cookbook.SetMaskColor 
usage: java SetMaskColor in-pdf-file out-pdf-file page-num colorR colorG colorB

C:\samples>java cookbook.SetMaskColor novelText.pdf SetMaskColor.pdf 1 1 0 0 
ページ数:2
配置矩形の各数値を入力してください。
top (mm) : 200
bottom (mm) : 150
left (mm) : 40
right (mm) : 90
-- 完了 --

指定した矩形範囲のテキストを削除し、矩形範囲を赤で塗りつぶします。

3-1-1マスクの色(例)