1.2.2 検索オプションの指定:検索対象文字列のオプション

1-2-第2項検索オプションの指定:検索対象文字列

狙い・効果

検索をする際に大文字・小文字の区別、ActualTextを無視するか否かの検索オプションを指定します。

処理の概要

ページ番号、検索文字列に加えて、検索文字列における大文字・小文字の区別、PDFファイル中のActualTextを無視するか否かのオプションを指定して検索します。 ActualTextについては1.1.2 指定矩形からテキストを抽出を参照してください。

PDF Tool APIの主な機能

PtlParamSearchText.APIsetCompareCase(boolean compareCase): 大文字と小文字を区別するかを設定

PtlParamSearchText.APIsetIgnoreActualText(boolean ignoreActualText): ActualTextを無視するかを設定

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class SearchTextSetTextOption {
    static final int NUM_OF_ARG_BEFORE_TEXT = 4;

    // そのクラスのusageを表示する関数
    private static void printUsage(){
        System.out.println("usage: java SearchTextSetTextOption in-pdf-file" + 
                           " page-to-search compare-case ignore-ActualText" +
                           " searching-text... ");
        System.out.println("page-to-search:");
        System.out.println("0: 全ページから検索 0以外: 指定ページから検索");
        System.out.println("compare-case : ");
        System.out.println("0:大文字と小文字を区別しない 1:区別する");
        System.out.println("ignore-ActualText");
        System.out.println("0:ActualTextを無視しない 1:無視する");
    }

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

        // コマンドライン引数の読み取り・判定
        int pageToSearch = Integer.parseInt(args[1]); // ページ数
        boolean compareCase = true;
        try
        {
            compareCase = readBoolArgs(args[2], "compare-caseは 1か0で指定してください。");
        }
        catch (IllegalArgumentException ex) {
            System.out.println(ex.getMessage());
            printUsage(); // usageメッセージの表示
            return;
        }
        boolean ignoreActualText = true;
        try
        {
            ignoreActualText =
                readBoolArgs(args[3], "igonre-ActualTextは 1か0で指定してください。");
        }
        catch (IllegalArgumentException ex) {
            System.out.println(ex.getMessage());
            printUsage(); // usageメッセージの表示
            return;
        }
        // 検索テキストの設定
        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]);
             PtlPDFDocument doc = new PtlPDFDocument())
        {
            // PDFファイルをロード
            doc.load(inputFile);

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

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

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

        }

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

    }

    /**
     * 
     * @param doc
     * @param arrayTextsToSearch 
     */
    private static void searchTextInDocument(PtlPDFDocument doc,
                                             String[] arrayTextsToSearch,
                                             boolean compareCase, boolean ignoreActualText)
        throws PtlException {
        System.out.println("ドキュメント全体から検索します。");
        try(PtlParamSearchText paramSearchText = new PtlParamSearchText()) {
            // 大文字と小文字を区別するか設定
            paramSearchText.setCompareCase(compareCase);
            // ActualTextを無視するか設定
            paramSearchText.setIgnoreActualText(ignoreActualText);

            // 検索パラメータに対象文字列を追加
            for(String textToSearch: arrayTextsToSearch) {
                paramSearchText.appendText(textToSearch);
            }
            // 検索結果コンテナクラスに検索結果を取得し、displaySearchResultsを呼び出す
            try(PtlSearchTextResults resultsContainer = doc.searchText(paramSearchText)) {
                displaySearchResults(resultsContainer);
            }
        }

    }

    private static void searchTextInPage(PtlPDFDocument doc,
                                         String[] arrayTextsToSearch,
                                         int pageToSearch,
                                         boolean compareCase,
                                         boolean ignoreActualText)
        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);
                 PtlParamSearchText paramSearchText = new PtlParamSearchText()) {
                // 大文字と小文字を区別するか設定
                paramSearchText.setCompareCase(compareCase);
                // ActualTextを無視するか設定
                paramSearchText.setIgnoreActualText(ignoreActualText);

                // 検索パラメータに対象文字列を追加
                for(String textToSearch: arrayTextsToSearch) {
                    paramSearchText.appendText(textToSearch);
                }
                // 検索結果コンテナクラスに検索結果を取得
                try(PtlSearchTextResults resultsContainer =
                    page.searchText(paramSearchText)) {
                    displaySearchResults(resultsContainer);
                }
            }
        }
    }

    // 検索結果を表示する関数
    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() + "), ");
    }

    /**
     * 0または1を入力されたargsにより、trueまたはfalseを返すメソッド。
     * 
     * @param args 与えられるコマンドライン引数。0または1でtrueまたはfalseを指定する。
     * @param errorMessage argsが0か1でなかった場合に出力されるエラーメッセージを指定する。
     * @return argsの数値を読み取った結果を戻す
     * @throws java.lang.IllegalArgumentException argsが0か1でなかった場合に発生。
     */
    public static boolean readBoolArgs(String args, String errorMessage)
        throws IllegalArgumentException
    {
        boolean trueOrFalse = false;

        // argsの読み取り
        switch(args){
        case "0":
            trueOrFalse = false;
            break;
        case "1":
            trueOrFalse = true;
            break;
        default:
            throw new IllegalArgumentException(errorMessage);
        }

        return trueOrFalse;
    }
}

プログラムファイル名

SearchTextSetTextOption.java

入出力操作の例

C:\samples>java cookbook.SearchTextSetTextOption 
usage: java SearchTextSetTextOption in-pdf-file page-to-search compare-case ignore-ActualText searching-text... 
compare-case : 
0:大文字と小文字を区別しない 1:区別する
ignore-ActualText
0:ActualTextを無視しない 1:無視する

C:\samples>java cookbook.SearchTextSetTextOption novelText.pdf 0 1 0 UTTERSON 
ドキュメント全体から検索します。
検索結果 : 1件見つかりました。
searchResult No.1 : 1ページ目
searchResult keyword : UTTERSON
resultDetail keyword : UTTERSON
該当箇所の矩形座標(x,y)はそれぞれ左下・右下・左上・右上の順に、
(28.109333,241.32962), 
(51.041294,241.32962), 
(28.109333,246.63399), 
(51.041294,246.63399), 
です。
-- 完了 --

novelText.pdfにはUTTERSONとUttersonという文字列がありますが、検索オプションで大文字と小文字を区別するとしているためヒットするのは一方だけです。