3.2.1 テキスト:矩形内の文字を削除

3-2-第1項テキスト:矩形内の文字を削除

狙い・効果

指定した矩形内の文字削除指定した矩形内の文字・矩形の線上の文字を削除します。

処理の概要

指定したページで指定矩形内のテキストを削除します。画像・パスデータ等テキスト以外のデータは削除されません。削除の様子が分かりやすいよう、矩形は半透明に設定されています。指定矩形の線上の文字も削除対象ですが、どれくらい重なっていたら削除対象とするかについては3.2.2 テキスト:削除時オプションの指定で説明します。

『PDF Tool API』の主な機能

PtlParamSetMask.APIsetRemoveElement(int remove): マスクの削除対象とするエレメントを設定

static int PtlParamSetMask.REMOVE_TEXT: テキストを削除対象とする

プログラム例

package cookbook;

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

import jp.co.antenna.ptl.*;

public class RemoveTextInMask {

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

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

        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 pageToEdit = Integer.parseInt(args[2]);
            int numPages = doc.getPageCount();
            System.out.println("ページ数:" + numPages);
            if((numPages < 0)||(numPages < pageToEdit))
            {
                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(pageToEdit - 1);
                     PtlParamSetMask paramSetMask = new PtlParamSetMask();
                     // 矩形の形を指定
                     PtlRect rect = new PtlRect(setRectCoordinate(br))) {
                    // 削除対象をテキストのみに設定
                    paramSetMask.setRemoveElement(PtlParamSetMask.REMOVE_TEXT);

                    // マスク設定
                    paramSetMask.appendRect(rect);
                    paramSetMask.setOpacity(0.3f);
                    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 {

	...【SetMaskColor.javaと同じ処理のため省略】...

        }                   
        return outputRect;
    }
}

プログラムファイル名

RemoveTextInMask.java

入出力操作の例

C:\samples>java cookbook.RemoveTextInMask 
usage: java RemoveTextInMask in-pdf-file out-pdf-file page-num

C:\samples>java cookbook.RemoveTextInMask removetext.pdf removetextout.pdf 1 
ページ数:1
配置矩形の各数値を入力してください。
top (mm) : 200
bottom (mm) : 110
left (mm) : 70
right (mm) : 145
-- 完了 --

指定した矩形領域のテキストだけを削除します。背景の画像は削除しません。

3-2-1テキスト:矩形内の文字を削除(例)