iText PdfTextExtractor Отсутствующие лигатуры в результирующем тексте

Я пытаюсь взять PDF-файл и получить текст из него.

Я нашел iText и использовал его и добился приличного успеха. У меня осталась одна проблема - лигатуры.

Сначала я заметил, что мне просто не хватает персонажей. После некоторых поисков я наткнулся на это: 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-файле одна строка гласит:

часть его конструктивного различия - линия крыши

Но когда я запускаю класс Java выше, текстовый вывод содержит:

частью его дизайна является отличие кровли

Обратите внимание, что разница стала разницей, а линия крыши стала кровлей.

Интересно отметить, что когда я копирую и вставляю из PDF в текстовое поле stackru, это также выглядит как второе предложение с двумя лигатурами "ff" и "fl", уменьшенными до просто "f" s.

Я надеюсь, что кто-то здесь может помочь мне понять, как поймать лигатуры и, возможно, заменить их символами, которые они представляют, как в лигатуре "fl", заменяемой фактическими "f" и "l".

Я провел несколько тестов на выходе из PDFTextExtractor и попытался заменить лигатурные символы Юникода фактическими символами, но обнаружил, что символы Юникода для этих лигатур не существуют в возвращаемом значении.

Кажется, что это должно быть что-то в самом iText, которое неправильно читает эти лигатуры. Я надеюсь, что кто-то знает, как обойти это.

Спасибо за любую помощь, которую вы можете оказать!

TLDR: преобразование PDF в текст с помощью iText, с отсутствующими символами, обнаружение, что это лигатуры, теперь мне нужно захватить эти лигатуры, не зная, как это сделать.

0 ответов

Другие вопросы по тегам