検索をする際に大文字・小文字の区別、ActualTextを無視するか否かの検索オプションを指定します。
ページ番号、検索文字列に加えて、検索文字列における大文字・小文字の区別、PDFファイル中のActualTextを無視するか否かのオプションを指定して検索します。 ActualTextについては1.1.2 指定矩形からテキストを抽出を参照してください。
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という文字列がありますが、検索オプションで大文字と小文字を区別するとしているためヒットするのは一方だけです。