itextsharp PdfTextExtractor Неправильное написание слов

В нашей базе данных есть файл PDF в двоичном формате. Я выложил его в потоковом режиме и сохранил как файл PDF, протестировал с обоими источниками и получил тот же результат: PdfTextExtractor неправильно произносит некоторые слова.

Например, в PDF-документе есть слово «подтверждено». После того, как PdfTextExtractor преобразует его, он записывается как «подтверждено».

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

Могу ли я что-нибудь сделать, чтобы повысить точность PdfTextExtractor?

Вот код, который я сейчас использую:

var reader = new PdfReader(myBinaryPdfData.ToArray());
var output = new StringWriter();

for (var i = 1; i <= reader.NumberOfPages; i++)
{
    output.WriteLine(PdfTextExtractor.GetTextFromPage(reader, i, new LocationTextExtractionStrategy()));
}

output.ToString();

person StronglyTyped    schedule 23.04.2012    source источник
comment
Деталь, которая может помочь: когда символы fi находятся рядом друг с другом, это создает проблему. В PDF-файле я могу нажать ctrl + f, и он найдет fi, но когда я пытаюсь выделить либо f, либо i отдельно, он выбирает их как один символ. В PDF-файле точка i перекрывает букву f. Я предполагаю, что это причина проблемы - есть идеи, как исправить?   -  person StronglyTyped    schedule 24.04.2012
comment
Крис Хаас в своем ответе дал прекрасное объяснение того, что могло происходить. Есть еще две возможности: (1) символы fi были преобразованы в fi лигатуру программой для создания PDF; (2) PDF-файл создан на основе отсканированной страницы, был отредактирован с помощью оптического распознавания текста, и функция оптического распознавания текста неправильно распознала слово.   -  person Kurt Pfeifle    schedule 29.07.2012


Ответы (1)


PDF-файлы не обязательно хранят текст в шаблоне, который соответствует визуальному представлению текста. Слово «Привет» можно записать как draw "Hello" at 10,10 или draw "H" at 10,10, "e" at 14,10, "l" at 18,10.... Это также может быть draw "H" at 10,10, now draw a circle at 500,500, now show an image at 60,60, now draw "llo" at 18,10, now draw a square at 300,300, now draw "e" at 14,10.

Последний, вероятно, похож на ваш случай. PdfTextExtractor извлекает блоки текста, сгруппированные в файле. В последнем случае, приведенном выше, он вернет три строки в следующем порядке: «H», «llo», «e».

Производители PDF-файлов, допускающие тяжелое форматирование (два хороших примера - Adobe InDesign и Illustrator), с большей вероятностью будут создавать PDF-файлы, написанные нелинейным образом. Почему? Честно говоря, они меньше заботятся о данных внутри, они заботятся только о визуальном представлении PDF. (На самом деле, в последние годы оба этих продукта лучше справились с созданием PDF-файлов, хотя все еще не идеально.)

Если вы хотите увидеть внутреннюю структуру вашего PDF-файла и запустите Adobe Acrobat Pro Preflight (это может быть в Инструменты или Печать). В открывшемся окне нажмите «Параметры» в правом верхнем углу, а затем «Внутренняя структура PDF-файла в браузере». Щелкните значок головоломки с надписью «BT» вверху. Откройте заданную страницу и разверните узел «Содержание». Каждая текстовая запись начинается с BT и заканчивается ET. Разверните каждый, и вы увидите что-то вроде (test) Tj. Скобки отмечают начало / остановку фактического текста для вывода. Сравните это с тем, что вы на самом деле ожидаете.

Если вы действительно, действительно должны исправить это на уровне iTextSharp, тогда вам предстоит выполнить некоторые вычисления. Вам потребуется либо подкласс TextExtractionStrategy или реализовать ITextExtractionStrategy интерфейс. См. Эти ссылки для получения основных сведений. По сути, iTextSharp будет делать то же самое, что и раньше, но вместе с текстом вы получите некоторые координаты, и вам нужно будет выяснить, как собрать все вместе. Вам нужно будет определить расстояние между буквами, чтобы определить, где буква должна быть вставлена ​​в слово или действительно ли буква образует новое слово / предложение. Удачи!

person Chris Haas    schedule 24.04.2012