2

PDFファイルを取得して、そこからテキストを取得しようとしています。

私は iText を見つけて使用しており、かなりの成功を収めています。私が残っている1つの問題は、合字です。

最初は、単に文字が足りないことに気づきました。いくつかの検索を行った後、私はこれに出くわしました: http://support.itextpdf.com/node/25

不足している合字であることがわかった後、問題を解決する方法を探し始めましたが、まだ解決策を見つけることができませんでした.

これが私のコードです:

import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;
import com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy;
import com.itextpdf.text.pdf.parser.FilteredTextRenderListener;
import java.io.File;
import java.io.OutputStreamWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;

import java.util.Formatter;
import java.lang.StringBuilder;


public class ReadPdf {

  private static String INPUTFILE = "F:/Users/jmack/Webwork/Redglue_PDF/live/ADP/APR/ADP_41.pdf";

  public static void writeTextFile(String fileName, String s) {    

    // s = s.replaceAll("\u0063\u006B", "just a test");
    s = s.replaceAll("\uFB00", "ff");
    s = s.replaceAll("\uFB01", "fi");
    s = s.replaceAll("\uFB02", "fl");
    s = s.replaceAll("\uFB03", "ffi");
    s = s.replaceAll("\uFB04", "ffl");
    s = s.replaceAll("\uFB05", "ft");
    s = s.replaceAll("\uFB06", "st");
    s = s.replaceAll("\u0132", "IJ");
    s = s.replaceAll("\u0133", "ij");

    FileWriter output = null;
    try {
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8"));
      writer.write(s);
      writer.close();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (output != null) {
        try {
          output.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
  }

  public static void main(String[] args) {
    try {

      PdfReader reader = new PdfReader(INPUTFILE);
      int n = reader.getNumberOfPages();    

      String str = PdfTextExtractor.getTextFromPage(reader, 1, new SimpleTextExtractionStrategy());      
      writeTextFile("F:/Users/jmack/Webwork/Redglue_PDF/live/itext/read_test.txt", str);

    }
    catch (Exception e) {
      System.out.println(e);
    }     
  }
}

上記で参照されている PDF では、次の 1 行が読み取られます。

そのデザインの違いの一部はルーフラインです

しかし、テキスト出力の上で Java クラスを実行すると、次のものが含まれます。

そのデザインの違いの一部は屋根です

差が差になり、ルーフラインがルーフィンになったことに注意してください。

PDF からスタック オーバーフローのテキスト フィールドにコピー アンド ペーストすると、2 つの合字 "ff" と "fl" が単に "f" に縮小された 2 番目の文のようにも見えることに注意してください。

ここの誰かが合字をキャッチする方法を見つけ出し、合字「fl」が実際の「f」と「l」に置き換えられるように、それらが表す文字に置き換えるのを手伝ってくれることを願っています。

PDFTextExtractor からの出力に対していくつかのテストを実行し、合字の Unicode 文字を実際の文字に置き換えようとしましたが、それらの合字の Unicode 文字が返される値に存在しないことがわかりました。

これらの合字を正しく読み取っていないのは、iText自体の何かに違いないようです。誰かがそれを回避する方法を知っていることを願っています。

あなたが与えることができるどんな助けにも感謝します!

TLDR: iText を使用して PDF をテキストに変換すると、文字が欠落し、それらが合字であることがわかりました。これらの合字をキャプチャする必要があります。どうすればよいかわかりません。

4

0 に答える 0