同じ文字、異なる文字が混ざった状態で重なり合っている文字列について、文字抽出同じ文字と異なる文字で除外する・除外しないを切り替えて抽出します。
「9.2.1重なり合う同じ文字を除外して抽出する」、「9.2.2重なり合う異なる文字を除外して抽出する」の内容を組み合わせることで、文字が重なるようにデザインされたPDF上の文字を制御して取り出すことができます。
具体的には、影付きの配置になった文字だけを除外したり、重なり合うようデザインされた文字だけを除外したり、重なっているすべての文字列を除外して抽出することが選べます。
サンプルプログラムでは、入力PDFの指定したページから文字を抽出する際に、同じ文字/異なる文字がそれぞれに重なり合っていたとき、どの程度重なっていたら除外するかを指定し、コントロールした上で重なり合っている文字を抽出します。
package cookbook; import java.io.BufferedWriter; import java.io.PrintWriter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.charset.StandardCharsets; import jp.co.antenna.ptl.*; public class ExtTextSetSameAndDiffTextOmitRatio { // そのクラスのusageを表示する関数 private static void printUsage() { System.out.println("usage: java ExtTextSetSameAndDiffTextOmitRatio" + " in-pdf-file out-text-file" + " page-to-extract sameText-omit-ratio diffText-omit-ratio" + " omit-diffText-in-diffColor"); System.out.println("sameText-omit-ratio:"); System.out.println("同じ文字が重なり合っていた場合にどの程度重なり合っていたら除外するかを小数で指定"); System.out.println("diffText-omit-ratio:"); System.out.println("異なる文字が重なり合っていた場合にどの程度重なり合っていたら除外するかを小数で指定"); System.out.println("omit-diffText-only-diffColor:"); System.out.println("0:重なった異なる文字の色が同じ場合も取り除く 1:重なった異なる文字の色が違う場合だけ取り除く"); } /** * @param args the command line arguments */ public static void main(String[] args) { if (args.length < 6) { printUsage(); // usageメッセージの表示 return; } // コマンドライン引数の読み取り・判定 // 出力PDFの名前はあとで渡すためにString型で保存する。 String outputTextURI = args[1]; int pageToExtract = Integer.parseInt(args[2]); float sameTextOmitRatio = Float.parseFloat(args[3]); float diffTextOmitRatio = Float.parseFloat(args[4]); boolean omitDiffTextOnlyInDiffColor = true; try { omitDiffTextOnlyInDiffColor = readBoolArgs(args[5], "omit-diffText-only-diffColorは1か0で指定してください。"); } catch (IllegalArgumentException ex) { System.out.println(ex.getMessage()); printUsage(); // usageメッセージの表示 return; } try (PtlParamInput inputFile = new PtlParamInput(args[0]); PtlPDFDocument doc = new PtlPDFDocument()) { // PDFファイルをロード doc.load(inputFile); //ページ数を取得 int wholePageNum = doc.getPageCount(); //pageToExtractのエラー処理 if(wholePageNum < pageToExtract) { ...【ExtractTextSetRect.javaと同じ処理のため省略 ・指定したページが総ページ数より多い場合のエラー処理】... } try (PtlPages pages = doc.getPages()) {//ページコンテナの取得 // ページコンテナが空かどうか if (pages.isEmpty()) { System.out.println("ERROR : ページコンテナが空"); return; } // ページの取得(パラメータindexは0が先頭のため1を引く) try (PtlPage page = pages.get(pageToExtract - 1); // ページコンテントの取得 PtlContent content = page.getContent(); // 文字抽出のパラメータクラス。 PtlParamExtractText paramExtractText = new PtlParamExtractText()) { // 同じテキストがどのぐらい重なっていたら取り除くかを指定する。 paramExtractText.setSameTextOmitRatio(sameTextOmitRatio); // 異なるテキストがどのぐらい重なっていたら取り除くかを指定する。 paramExtractText.setDifferentTextOmitRatio(diffTextOmitRatio, omitDiffTextOnlyInDiffColor); // 抽出するテキストを座標順に並べるよう指定 //(setSameTextOmitRatioのためには指定が必要) paramExtractText.setTextType(PtlParamExtractText.TEXT_TYPE.TEXT_SORT); // 文字列抽出 String TextFromPdf = content.extractText(paramExtractText); // 文字列の出力 outputTextFile(outputTextURI, TextFromPdf); System.out.println(TextFromPdf); } } } ...【GetPDFVersion.javaと同じ処理のため省略 ・エラーメッセージ処理と出力】... } /** * テキストファイルを出力するための関数。 * 出力エンコードはUTF-8を指定する。 * 特に外部からの呼び出しを想定しないためprivateとする。 * * @param outputTextURI 出力ファイルのURI。 * @param TextFromPdf 出力したいString型変数 */ private static void outputTextFile(String outputTextURI, String TextFromPdf) { ...【ExtractTextSetRect.javaと同じ処理のため省略 ・outputTextURIのパスにTextFromPDFの内容をUTF-8エンコーディングで出力する処理】... } /** * 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 { ...【FixUpPDFASetSaveOption.javaと同じ処理のため省略 ・0または1を読み取り、boolean型のfalseまたはtrueを返す関数】... } }
ExtTextSetSameAndDiffTextOmitRatio.java
C:\samples>java cookbook.ExtTextSetSameAndDiffTextOmitRatio usage: java ExtTextSetSameAndDiffTextOmitRatio in-pdf-file out-text-file page-to-extract sameText-omit-ratio diffText-omit-ratio omit-diffText-in-diffColor sameText-omit-ratio: 同じ文字が重なり合っていた場合にどの程度重なり合っていたら除外するかを小数で指定 diffText-omit-ratio: 異なる文字が重なり合っていた場合にどの程度重なり合っていたら除外するかを小数で指定 omit-diffText-only-diffColor: 0:重なった異なる文字の色が同じ場合も取り除く 1:重なった異なる文字の色が違う場合だけ取り除く C:\samples>java cookbook.ExtTextSetSameAndDiffTextOmitRatio sample_overlap_text.pdf Output_ExtTextSetSameAndDiffTextOmitRatio.txt 1 0.7 0.5 1 Output text URI :Output_ExtTextSetSameAndDiffTextOmitRatio.txt Overlap Test 01 Overlap Test 02 Overlap Test 03 Overlap Test 03 Overlap Test 04 Overlap Test 04 verlap T st 05オーバーラップテスト05 verlap Test 06オーバーラップテスト06オーバーラップテスト07 Overlap Test 07オーバーラップテスト08 Overlap Test 08 OオvーerバlapーTラesッtプ09テスト09 OオvーerバlapーTラesッtプ10テスト10オーバーラップテスト11 Overlap Test 11オーバーラップテスト12 Overlap Test 12 -- 完了 --
この操作例では、「同じテキストが重なり合った部分」と、「異なるテキストが重なり合った部分」を抽出するテキストから除外しています。入力PDFは、図9.15 操作例で使われる入力PDFになります。
また、この操作例ではapplyAtDifferentColor()はtrueに設定されています。そのため、同じ色で異なるテキストが重なり合った部分はすべて抽出されています。