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