1.2.3 検索オプションの指定:取得順序

1-2-第3項検索オプションの指定:取得順序

狙い・効果

テキストを検索する際に、検索対象テキストをContentに現れた順に取得するか座標でソート(横書きの場合)して取得するかを指定します。

処理の概要

ページ番号、検索文字列に加えて、検索するテキストのタイプをContentに現れた順に取得するかテキストを座標でソートした上で取得するかを指定して検索します。座標でソートすることで、見た目上は続いているように見えてもデータ上はつながりのないテキストに対して検索をかけることができます。

『PDF Tool API』の主な機能

PtlParamSearchText.APIsetTextType(PtlParamSearchText.TEXT_TYPE type): 検索するテキストのタイプを指定

タイプの指定は、次表の列挙型定数で指定します。

表1・1 PtlParamSearchText.TEXT_TYPE テキスト検索タイプ
列挙型定数説明
TEXT_RAW取得したテキストをそのまま検索
TEXT_SORT取得したテキストを座標でソートして検索

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class SearchTextSetTextType {
    static final int NUM_OF_ARG_BEFORE_TEXT = 3;

    // そのクラスのusageを表示する関数
    private static void printUsage(){
        System.out.println("usage: java SearchTextSetTextOption in-pdf-file" + 
                           " page-to-search searching-text-type" +
                           " searching-text... ");
        System.out.println("searching-text-type : ");
        System.out.println("0:取得したテキストをそのまま検索。" +
                           " 1:取得したテキストを座標でソートして検索。");
    }

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

        // コマンドライン引数の読み取り・判定
        int pageToSearch = Integer.parseInt(args[1]); // ページ数
        int textType = Integer.parseInt(args[2]); // 
        switch(textType){
        case 0:
            System.out.println("TEXT_TYPEにTEXT_RAWが指定されました。"
                               + "取得したテキストをそのまま検索します。\n");
            break;
        case 1:
             System.out.println("TEXT_TYPEにTEXT_SORTが指定されました。"
                                + "取得したテキストを座標でソートして検索します。\n");
             break;

        default:
            System.out.println("searching-text-type は、1か0で指定してください。");
            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){
                searchTextInDocumentSetTextType(doc, arrayTextsToSearch, textType);
            } else {

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

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

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

    }

    /**
     * 
     * @param doc
     * @param arrayTextsToSearch 
     */
    private static void searchTextInDocumentSetTextType(PtlPDFDocument doc,
                                                        String[] arrayTextsToSearch,
                                                        int textType)
        throws PtlException {
        System.out.println("ドキュメント全体から検索します。");
        try(PtlParamSearchText paramSearchText = new PtlParamSearchText()) {
            // TEXT_TYPEの設定
            switch(textType){
            case 0:
                paramSearchText.setTextType(PtlParamSearchText.TEXT_TYPE.TEXT_RAW);
                break;
            case 1:
                paramSearchText.setTextType(PtlParamSearchText.TEXT_TYPE.TEXT_SORT);
                break;
            }

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

    private static void searchTextInPageSetTextType(PtlPDFDocument doc,
                                                    String[] arrayTextsToSearch,
                                                    int pageToSearch,
                                                    int textType)
        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()) {
                // TEXT_TYPEの設定
                switch(textType){
                case 0:
                    paramSearchText.setTextType(PtlParamSearchText.TEXT_TYPE.TEXT_RAW);
                    break;
                case 1:
                    paramSearchText.setTextType(PtlParamSearchText.TEXT_TYPE.TEXT_SORT);
                    break;
                }

                // 検索パラメータに対象文字列を追加
                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() + "), ");
    }
}

プログラムファイル名

SearchTextSetTextType.java

入出力操作の例

C:\samples>java cookbook.SearchTextSetTextType 
usage: java SearchTextSetTextOption in-pdf-filepage-to-search searching-text-type searching-text... 
searching-text-type : 
0:取得したテキストをそのまま検索。 1:取得したテキストを座標でソートして検索。

C:\samples>java cookbook.SearchTextSetTextType novelEdited.pdf 1 0 Utterson 
TEXT_TYPEにTEXT_RAWが指定されました。取得したテキストをそのまま検索します。

1ページ目から検索します。
検索結果 : 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), 
です。
-- 完了 --

C:\samples>java cookbook.SearchTextSetTextType 
usage: java SearchTextSetTextOption in-pdf-filepage-to-search searching-text-type searching-text... 
searching-text-type : 
0:取得したテキストをそのまま検索。 1:取得したテキストを座標でソートして検索。

C:\samples>java cookbook.SearchTextSetTextType novelEdited.pdf 1 1 Utterson 
TEXT_TYPEにTEXT_SORTが指定されました。取得したテキストを座標でソートして検索します。

1ページ目から検索します。
検索結果 : 1件見つかりました。
searchResult No.1 : 1ページ目
searchResult keyword : utterson
searchResultDetail No. :1
resultDetail keyword : UTTERSON
該当箇所の矩形座標(x,y)はそれぞれ左下・右下・左上・右上の順に、
(28.109333,241.32962), 
(51.041294,241.32962), 
(28.109333,246.63399), 
(51.041294,246.63399), 
です。
searchResultDetail No. :2
resultDetail keyword : Utter
該当箇所の矩形座標(x,y)はそれぞれ左下・右下・左上・右上の順に、
(82.303055,133.36732), 
(92.18066,133.36732), 
(82.303055,138.6496), 
(92.18066,138.6496), 
です。
searchResultDetail No. :3
resultDetail keyword : son
該当箇所の矩形座標(x,y)はそれぞれ左下・右下・左上・右上の順に、
(92.34312,133.50027), 
(99.00426,133.50027), 
(92.34312,139.88414), 
(99.00426,139.88414), 
です。
-- 完了 --

1.2.3 検索オプションの指定:取得順序(例)

novelEdited.pdfは、文中の一部(次の図の下線部分)をPDF本文編集ソフト(「瞬簡PDF編集8」)で切り取ってから再度貼り付けて保存したファイルです。このためPDFの内部では「Utter」と「son」が別の位置に保存されています。その結果、検索オプションTEXT_TYPEにTEXT_RAWを指定したときはヒットしません。