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, с отсутствующими символами, обнаружение, что это лигатуры, теперь мне нужно захватить эти лигатуры, не зная, как это сделать.