3.3.1 テキスト検索とマスク処理の組み合わせ

3-3-第1項 テキスト検索とマスク処理の組み合わせ

狙い・効果

テキスト検索をして該当箇所をマスキングし、テキスト削除します。

処理の概要

ページ番号とキーワードを入力して検索し、ヒットしたキーワードのテキストを削除します。本サンプルプログラムでは検索テキストの削除のみが実行されます。

PDF Tool APIの主な機能

PtlPDFDocument.APIsearchTextAndDoProcess(PtlParamSearchText paramSearchText): 指定したドキュメント全体のテキストを検索して後処理

PtlPage.APIsearchTextAndDoProcess(PtlParamSearchText paramSearchText): 指定したページのテキストを検索して後処理

パラメータにPtlParamSearchTextAndMaskを指定することでMask処理が行われます。

PtlParamSearchTextAndMask: テキスト検索してマスク処理するパラメータを表現したクラス

PtlParamSearchTextを継承したクラスなので、テキストの検索と同等の機能を利用できます。また、さらに追加でsetRemoveElement( )メソッドを用いて指定することにより削除対象とするエレメントを追加ができます。

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

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class SearchTextAndSetMask {
    static final int NUM_OF_ARG_BEFORE_TEXT = 3;

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

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

        // コマンドライン引数の読み取り・判定
        int pageToSearch = Integer.parseInt(args[2]); // ページ数
        // 検索テキストの設定
        int numOfSearchingText = args.length - NUM_OF_ARG_BEFORE_TEXT; 
        String[] arrayTextsToSearch = new String[numOfSearchingText];
        for (int i = 0; i < numOfSearchingText; i++){
            arrayTextsToSearch[i] = args[i + NUM_OF_ARG_BEFORE_TEXT];
        }


        try (PtlParamInput inputFile = new PtlParamInput(args[0]);
             PtlParamOutput outputFile = new PtlParamOutput(args[1]);
             PtlPDFDocument doc = new PtlPDFDocument())
        {
            // PDFファイルをロード
            doc.load(inputFile);

            // ページ番号が0を指定された場合はドキュメント全体から検索。
            if(pageToSearch == 0){
                searchTextAndMaskInDocument(doc, arrayTextsToSearch);
            } else {

	...【SearchText.javaと同じ処理のため省略
	 ・検索ページ番号のエラー処理】...

                // 指定ページ番号内を検索。
                searchTextAndMaskInPage(doc, arrayTextsToSearch, pageToSearch);
            }

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

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

    }

    /**
     * 
     * @param doc
     * @param arrayTextsToSearch 
     */
    private static void searchTextAndMaskInDocument(PtlPDFDocument doc,
                                             String[] arrayTextsToSearch)
        throws PtlException {
        System.out.println("ドキュメント全体から検索します。");
        try(PtlParamSearchTextAndSetMask paramSearchTextSetMask
            = new PtlParamSearchTextAndSetMask();
            PtlColorDeviceRGB color = new PtlColorDeviceRGB(1.0f,1.0f,0.0f)) {
            // パラメータに色情報・透明度情報を追加
            paramSearchTextSetMask.setColor(color);
            paramSearchTextSetMask.setOpacity(0.75f);

            // パラメータに対象文字列を追加
            for(String textToSearch: arrayTextsToSearch) {
                System.out.println("検索キーワードを追加:" + textToSearch);
                paramSearchTextSetMask.appendText(textToSearch);
            }
            // 検索した後マスク処理をする。
            int numOfText = doc.searchTextAndDoProcess(paramSearchTextSetMask);
            System.out.println(numOfText + "件のキーワードをマスク処理しました。");
        }

    }

    private static void searchTextAndMaskInPage(PtlPDFDocument doc,
                                                String[] arrayTextsToSearch,
                                                int pageToSearch)
        throws PtlException {
        System.out.println( pageToSearch +  "ページ目から検索します。");
        //ページコンテナの取得
        try (PtlPages pages = doc.getPages()) {
            // ページコンテナが空かどうか
            if (pages.isEmpty()) {
                System.out.println("ERROR : ページコンテナが空");
                return;
            }

            // ページの取得(index番号は0が先頭のため1を引く)
            try (PtlPage page = pages.get(pageToSearch - 1);
                 PtlParamSearchTextAndSetMask paramSearchTextSetMask
                 = new PtlParamSearchTextAndSetMask();
                 PtlColorDeviceRGB color = new PtlColorDeviceRGB(1.0f,1.0f,0.0f)) {
                // パラメータに色情報・透明度情報を追加
                paramSearchTextSetMask.setColor(color);
                paramSearchTextSetMask.setOpacity(0.75f);

                // パラメータに対象文字列を追加
                for(String textToSearch: arrayTextsToSearch) {
                    System.out.println("検索キーワードを追加:" + textToSearch);
                    paramSearchTextSetMask.appendText(textToSearch);
                }
                // 検索した後マスク処理をする。
                int numOfText = page.searchTextAndDoProcess(paramSearchTextSetMask);
                System.out.println(numOfText + "件のキーワードをマスク処理しました。");

            }
        }
    }

    // 検索結果を表示する関数
    private static void displaySearchResults(PtlSearchTextResults resultsContainer)
        throws PtlException {

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

    }

// 該当テキスト検索結果の詳細コンテナ及びQuadPointを取得して表示する。
    private static void printResultQuadPoints(PtlSearchTextResultDetail resultDetail)
        throws PtlException {

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

    }

    private static void printXYCoordinate(PtlPoint point) throws PtlException {
        System.out.println("(" + point.getX() + "," + point.getY() + "), ");
    }
}

プログラムファイル名

SearchTextAndSetMask.java

入出力操作の例

C:\samples>java cookbook.SearchTextAndSetMask 
usage: java SearchTextAndSetMask in-pdf-file out-pdf-file page-to-search searching-text... 

C:\samples>java cookbook.SearchTextAndSetMask novelText.pdf SearchTextAndSetMask.pdf 1 Utterson 
1ページ目から検索します。
検索キーワードを追加:Utterson
2件のキーワードをマスク処理しました。
-- 完了 --

novelText.pdfの1ページから「Utterson」という文字列を削除し、その部分を黄色で塗りつぶします。

3-3-1テキスト検索とマスク処理の組み合わせ(例)