
与えられたキーワードで検索し、該当箇所の矩形を取得します。
ページ番号とキーワードを入力して検索し、ヒットしたキーワードのPDF上の矩形座標を表示します。ページ0を指定すると全ページを検索します。キーワードは複数指定できます。これはこの節の残りのプログラムでも同様です。また、ヒットしたキーワードに改行が混じっているなど、矩形が一つでない場合は複数の矩形座標が表示されます。
PtlPDFDocument.APIsearchText(PtlParamSearchText param): 与えられたPDF全体に対してテキスト検索を実行する
PtlPage.APIsearchText(PtlParamSearchText param): 取得したページオブジェクトに対してテキスト検索を実行する
PtlParamSearchText: テキスト検索のパラメータを表現したクラス
PtlParamSearchText.APIappendText(java.lang.String text): 検索するテキストを追加する
PtlSearchTextResults: テキスト検索結果のコンテナを表現したクラス
PtlSearchTextResult: テキスト検索結果を表現したクラス
PtlSearchTextResultDetails: テキスト検索結果の詳細のコンテナを表現したクラス
PtlSearchTextResultDetail: テキスト検索結果の詳細を表現したクラス
PtlSearchTextResultDetail.APIgetQuadPoint(): テキスト検索した文字のQuadPointを取得する
PtlQuadPoint: PDFの矩形4隅座標を表現したクラス
package cookbook;
import jp.co.antenna.ptl.*;
public class SearchText {
static final int NUM_OF_ARG_BEFORE_TEXT = 2;
// そのクラスのusageを表示する関数
private static void printUsage(){
System.out.println("usage: java SearchText in-pdf-file" +
" page-to-search searching-text... ");
System.out.println("page-to-search:");
System.out.println("0: 全ページから検索 0以外: 指定ページから検索");
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
if (args.length < 3)
{
printUsage(); // usageメッセージの表示
return;
}
// コマンドライン引数の読み取り・判定
int pageToSearch = Integer.parseInt(args[1]); // ページ数
// 検索テキストの設定
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);
} else {
// それ以外であれば指定ページ番号を検索。
int wholePageNum = doc.getPageCount();
//pageToSearchのエラー処理
if(wholePageNum < pageToSearch)
{
System.out.println("ERROR: page-to-searchはPDFの総ページ数より"+
"小さい値を指定してください。");
System.out.println("総ページ数:" + wholePageNum);
printUsage();
return;
}
// 指定ページ番号内を検索。
searchTextInPage(doc, arrayTextsToSearch, pageToSearch);
}
}
...【ExtractText.javaと同じ処理のため省略
・エラーメッセージ処理と出力】...
}
/**
*
* @param doc
* @param arrayTextsToSearch
*/
private static void searchTextInDocument(PtlPDFDocument doc,
String[] arrayTextsToSearch)
throws PtlException {
System.out.println("ドキュメント全体から検索します。");
try(PtlParamSearchText paramSearchText = new PtlParamSearchText()) {
// 検索パラメータに対象文字列を追加
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)
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()) {
// 検索パラメータに対象文字列を追加
for(String textToSearch: arrayTextsToSearch) {
paramSearchText.appendText(textToSearch);
}
// 検索結果コンテナクラスに検索結果を取得
try(PtlSearchTextResults resultsContainer =
page.searchText(paramSearchText)) {
displaySearchResults(resultsContainer);
}
}
}
}
// 検索結果を表示する関数
private static void displaySearchResults(PtlSearchTextResults resultsContainer)
throws PtlException {
// 検索件数の取得
int resultCount = resultsContainer.getCount();
System.out.println("検索結果 : " + resultCount + "件見つかりました。");
// 各検索結果の出力
for(int i = 0; i < resultCount; i++) {
System.out.print("searchResult No." + (i + 1) + " : ");
// index番号が i のテキスト検索結果・ページ番号を取得。
// (index番号、ページ番号は0が先頭)
try(PtlSearchTextResult searchResult = resultsContainer.get(i)) {
System.out.println((searchResult.getPageNumber() + 1) + "ページ目");
System.out.println("searchResult keyword : " + searchResult.getKeyword());
// 検索結果の詳細コンテナを取得。
try(PtlSearchTextResultDetails resultDetails =
searchResult.getResultDetails()) {
// resultDetailsの中身が1個だった場合(処理の軽量化のため場合分け)
if(resultDetails.getCount() == 1) {
printResultQuadPoints(resultDetails.get(0));
} else {
// 複数だった場合
for(int j = 0; j < resultDetails.getCount(); j++) {
System.out.println("searchResultDetail No. :" + (j + 1));
printResultQuadPoints(resultDetails.get(j));
}
}
}
}
}
}
// 該当テキスト検索結果の詳細コンテナ及びQuadPointを取得して表示する。
private static void printResultQuadPoints(PtlSearchTextResultDetail resultDetail)
throws PtlException {
System.out.println("resultDetail keyword : " + resultDetail.getKeyword());
// QuadPointの取得
try(PtlQuadPoint quadPoint = resultDetail.getQuadPoint()) {
// 各座標の表示
System.out.println("該当箇所の矩形座標(x,y)はそれぞれ" +
"左下・右下・左上・右上の順に、");
printXYCoordinate(quadPoint.getBottomLeft());
printXYCoordinate(quadPoint.getBottomRight());
printXYCoordinate(quadPoint.getTopLeft());
printXYCoordinate(quadPoint.getTopRight());
System.out.println("です。");
}
}
private static void printXYCoordinate(PtlPoint point) throws PtlException {
System.out.println("(" + point.getX() + "," + point.getY() + "), ");
}
}
SearchText.java
C:\samples>java cookbook.SearchText usage: java SearchText in-pdf-file page-to-search searching-text... C:\samples>java cookbook.SearchText novelText.pdf 2 アッタスン 2ページ目から検索します。 検索結果 : 1件見つかりました。 searchResult No.1 : 2ページ目 searchResult keyword : アッタスン searchResultDetail No. :1 resultDetail keyword : アッタスン 該当箇所の矩形座標(x,y)はそれぞれ左下・右下・左上・右上の順に、 (36.406532,231.26463), (54.94863,231.26463), (36.406532,234.97507), (54.94863,234.97507), です。 searchResultDetail No. :2 resultDetail keyword : アッタスン 該当箇所の矩形座標(x,y)はそれぞれ左下・右下・左上・右上の順に、 (67.26773,123.356964), (85.80947,123.356964), (67.26773,127.06739), (85.80947,127.06739), です。 -- 完了 --
novelText.pdfの2ページ目で「アッタスン」という文字列の位置を次の図の赤で示しました。
