テキストを検索する際に、検索対象テキストをContentに現れた順に取得するか座標でソート(横書きの場合)して取得するかを指定します。
ページ番号、検索文字列に加えて、検索するテキストのタイプをContentに現れた順に取得するかテキストを座標でソートした上で取得するかを指定して検索します。座標でソートすることで、見た目上は続いているように見えてもデータ上はつながりのないテキストに対して検索をかけることができます。
PtlParamSearchText.APIsetTextType(PtlParamSearchText.TEXT_TYPE 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), です。 -- 完了 --
novelEdited.pdfは、文中の一部(次の図の下線部分)をPDF本文編集ソフト(「瞬簡PDF編集8」)で切り取ってから再度貼り付けて保存したファイルです。このためPDFの内部では「Utter」と「son」が別の位置に保存されています。その結果、検索オプションTEXT_TYPEにTEXT_RAWを指定したときはヒットしません。