Я использую iText 5.5.8 для Java. Следуя стандартным процедурам извлечения текста, т. Е.
PdfTextExtractor.getTextFromPage(reader, pageNumber)
Я был удивлен, обнаружив несколько ошибок в выводе, в частности, все буквы d выглядят как o.
Так как же на самом деле работает извлечение текста в iText? Это какое-то OCR?
Я заглянул под капот, пытаясь понять, как работает TextExtractionStrategy
, но я не мог понять многого. SimpleTextExtractionStrategy
, например, кажется, просто определяет наличие строк и пробелов, тогда как он TextRenderInfo
предоставляет текст, вызывая некоторый метод decode в поле font
GraphicsState
, и это все, что я мог сделать, не получив серьезной мигрени. .
Так кто мой мужчина? Какой класс следует переопределить или какой параметр следует настроить, чтобы можно было сказать iText: «Эй, вы читаете все d неправильно!»
редактировать:
образец PDF-файла можно найти по адресу http://www.fpozzi.com/stampastopper/download/ имя файла 0116_LR.pdf К сожалению, не могу поделиться прямой ссылкой. Это базовый код для извлечения текста
import java.io.File;
import java.io.IOException;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;
public class Import
{
public static void importFromPdf(final File pdfFile) throws IOException
{
PdfReader reader = new PdfReader(pdfFile.getAbsolutePath());
try
{
for (int i = 1; i <= reader.getNumberOfPages(); i++)
{
System.out.println(PdfTextExtractor.getTextFromPage(reader, i));
System.out.println("----------------------------------");
}
}
catch (IOException e)
{
throw e;
}
finally
{
reader.close();
}
}
public static void main(String[] args)
{
try
{
importFromPdf(new File("0116_LR.pdf"));
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
редактировать после ответов @blagae и @mkl
Прежде чем начать возиться с iText, я попробовал извлечь текст из Apache PDFBox (проект, похожий на iText, который я только что отверг), но у него есть та же проблема.
Понимание того, как эти программы обрабатывают текст, выходит за рамки моего стремления, поэтому я написал простой метод извлечения текста из необработанного содержимого страницы, то есть того, что стоит между маркерами BT и ET.
import java.io.File;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.itextpdf.text.io.RandomAccessSourceFactory;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.RandomAccessFileOrArray;
import com.itextpdf.text.pdf.parser.ContentByteUtils;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;
public class Import
{
private final static Pattern actualWordPattern = Pattern.compile("\\((.*?)\\)");
public static void importFromPdf(final File pdfFile) throws IOException
{
PdfReader reader = new PdfReader(pdfFile.getAbsolutePath());
Matcher matcher;
String line, extractedText;
boolean anyMatchFound;
try
{
for (int i = 1; i <= 16; i++)
{
byte[] contentBytes = ContentByteUtils.getContentBytesForPage(reader, i);
RandomAccessFileOrArray raf = new RandomAccessFileOrArray(new RandomAccessSourceFactory().createSource(contentBytes));
while ((line = raf.readLine()) != null && !line.equals("BT"));
extractedText = "";
while ((line = raf.readLine()) != null && !line.equals("ET"))
{
anyMatchFound = false;
matcher = actualWordPattern.matcher(line);
while (matcher.find())
{
anyMatchFound = true;
extractedText += matcher.group(1);
}
if (anyMatchFound)
extractedText += "\n";
}
System.out.println(extractedText);
System.out.println("+++++++++++++++++++++++++++");
String properlyExtractedText = PdfTextExtractor.getTextFromPage(reader, i);
System.out.println(properlyExtractedText);
System.out.println("---------------------------");
}
}
catch (IOException e)
{
throw e;
}
finally
{
reader.close();
}
}
public static void main(String[] args)
{
try
{
importFromPdf(new File("0116_LR.pdf"));
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
По-видимому, по крайней мере в моем случае, символы верны. Однако порядок слов или даже букв беспорядочный, на самом деле очень беспорядочный, поэтому этот подход также непригоден.
Что меня действительно удивляет, так это то, что все методы, которые я пробовал до сих пор для извлечения текста из PDF-файлов, включая копирование / вставку из Adobe Reader, что-то напортачили.
Я пришел к выводу, что самый надежный способ получить приличное извлечение текста также может быть самым неожиданным: хорошее распознавание текста. Теперь я пытаюсь: 1) преобразовать pdf в изображение (PDFBox отлично справляется с этим - даже не пытайтесь попробовать pdf-renderer) 2) OCR этого изображения Я опубликую свои результаты через несколько дней.