1.1.9 テキスト検索してハイライト注釈

images/SearchTextAndHighlight-top.png

狙い・効果

与えられたキーワードで検索し、ヒットした部分にハイライト注釈を挿入します。

処理の概要

キーワード検索とハイライト注釈の挿入を組み合わせて、ヒットした部分にハイライトを挿入することができます。キーワード検索については、「『PDF CookBook』(第3巻)1.2.1 キーワードの指定による検索」を参照してください。

本サンプルプログラムでは、与えられたキーワードで検索し、検索でヒットした単語にハイライト注釈ヒットした単語の矩形にハイライト注釈を設定します。キーワードは複数指定できます。検索するページを指定可能で、0ページを指定した場合はドキュメント全体から検索します。同時にポップアップ注釈を設定しています。

PDF Tool APIの主な機能

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class SearchTextAndHighlight {
    static final int NUM_OF_ARG_BEFORE_TEXT = 3;

    // そのクラスのusageを表示する関数
    private static void printUsage(){
        System.out.println("usage: java SearchTextAndHighlight 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 {
                // それ以外であれば指定ページ番号を検索。
                int wholePageNum = doc.getPageCount();
                //pageToSearchのエラー処理
                if(wholePageNum < pageToSearch)
                {
                    System.out.println("ERROR: page-to-searchはPDFの総ページ数より"+
                                       "小さい値を指定してください。");
                    System.out.println("総ページ数:" + wholePageNum);
                    printUsage();
                    return;
                }
                // 指定ページ番号内を検索。
                searchTextAndMaskInPage(doc, arrayTextsToSearch, pageToSearch);
            }

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

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

            // パラメータに対象文字列を追加
            for(String textToSearch: arrayTextsToSearch) {
                System.out.println("検索キーワードを追加:" + textToSearch);
                paramSearchTextHighlight.appendText(textToSearch);
            }
            // 検索した後マスク処理をする。
            int numOfText = doc.searchTextAndDoProcess(paramSearchTextHighlight);
            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);
                 PtlParamSearchTextAndHighlight paramSearchTextHighlight
                 = new PtlParamSearchTextAndHighlight();
                 PtlColorDeviceRGB color = new PtlColorDeviceRGB(1.0f,1.0f,0.0f)) {
                // パラメータに色情報・透明度情報を追加
                paramSearchTextHighlight.setColor(color);
                paramSearchTextHighlight.setOpacity(0.75f);

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

プログラムファイル名

SearchTextAndHighlight.java

入出力操作の例

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

C:\samples>java cookbook.SearchTextAndHighlight sample-htext.pdf search-highlight.pdf 1 PDFリーダー 
1ページ目から検索します。
検索キーワードを追加:PDFリーダー
6件のキーワードにハイライト注釈を設定しました。
-- 完了 --

「PDFリーダー」にハイライト注釈が付いており、それにポップアップ注釈が付随しています。

ハイライト注釈:テキスト検索