как удалить символ в pdf используя pdflib - PullRequest
2 голосов
/ 05 июля 2011

Я хочу удалить скрытое пространство в PDF, используя PDF lib.

Когда я извлекаю слово «Грегор» в PDF, оно появляется как «Грегор», но я действительно хочу его как «Грегор».

Какие могут быть причины для этого?Или как мне избежать этих "скрытых мест"?

Ответы [ 3 ]

4 голосов
/ 05 июля 2011

Много лет назад я работал в Adobe над Acrobat версии 1.0 и выше. В то время я написал инструменты для поиска, выделения и копирования. Я попытаюсь объяснить, почему вы вероятно видите то, что видите, и почему вы, вероятно, также SOL (если вы не хотите взламывать PDF lib).

В PDF содержимое страницы представлено программой на языке RPN, аналогичном PostScript. Он отличается тем, что не является полным по Тьюрингу. В нем отсутствуют циклы, разумное определение функций, рекурсия и т. Д., Что позволяет обойти эту досадную проблему остановки. Типичная программа с содержимым страницы выглядит примерно так:

255 0 0 sc 72 72 m 144 72 l 144 144 l 72 144 l f

, что означает, установите красный цвет (255 0 0), перейдите к (72, 72), подключите линию к (144, 72) и т. Д. И, наконец, заполните путь. Это создаст красный квадрат, один дюйм на стороне с нижним левым углом, расположенным на 1 дюйм вверх и справа от нижней части страницы.

Теперь, когда вы работаете с текстом, все немного сложнее. Существует четыре оператора для рисования текста: Tj, ', "и TJ. Они в основном отличаются тем, как они влияют на размещение текста либо до, либо после применения оператора. Тем не менее, в нормальном мире вы ожидаете, что в вашем документе будет что-то как это в потоке контента:

BT 72 288 Td (Gregor) Tj ET

, что означает начало текста, перемещение позиции текста в (72, 288), размещение текста «Грегор» и конец текста.

Вероятно, это не тот случай. Вместо этого ваш документ, вероятно, выглядит примерно так:

BT 72 288 Td (Gre) Tj --stuff-- 88 288 Td (gor) Tj ET

где --stuff-- - ноль или более других операторов PDF. PDF - это язык описания страниц, а не формат текстового файла. Таким образом, PDF не диктует, как вы должны планировать поток контента для создания страницы. На самом деле существует бесконечное количество способов создания эквивалентных / идентичных страниц.

Таким образом, автору любого куска кода, предназначенного для извлечения текста из PDF-документа, нужно некоторое время, чтобы очень четко ответить на вопрос "что такое слово?" Если на этот вопрос сначала нет правильного ответа, то у вас никогда не будет разумного извлечения текста. Хотя я не знаю конкретно, я очень подозреваю, что pdflib определяет слово как «любая подстрока, разделенная пробелами, из оператора размещения текста». Это определение даст вам, возможно, 80% пути туда. Может быть, больше, но не намного. Это почти тривиальное определение для реализации, но оно потерпит неудачу, если слова не будут установлены с помощью отдельных операторов размещения текста. Черт возьми, есть даже страницы в формате PDF, на которых текст не расположен близко к порядку чтения. Например, troff (по крайней мере, раньше) сначала выкладывает весь простой текст, затем курсив, затем жирный текст.

Тогда вы должны думать о проблеме по-другому. Что если вы определите слово как упорядоченную последовательность глифов, которые близки друг к другу в физическом пространстве и похожи по размеру? Затем вы обнаружите, что определение полностью охватывает случаи успеха предыдущего определения, а также правильно включает огромное количество предыдущих ошибок, которые присущи предыдущему определению «что такое слово». Вы также обнаружите, что фактическая реализация этого определения в коде значительно сложнее . Хотя первое определение может быть сделано примерно через час, это определение больше похоже на недели или месяцы времени, чтобы по-настоящему понять, потому что вы должны ответить на вопросы «что близко?» и "что похоже по размеру?" И пока вы занимаетесь этим, вам нужно учитывать и другие вещи, такие как кодирование текста, лигатуры, произвольные дефисы, текст, выложенный вдоль кривой (я не могу сказать вам, как я был счастлив, когда Acrobat был способен находить слова на картах).

Таким образом, из этого следует сделать вывод, что извлечение текста из PDF является нетривиальным, и вы должны ожидать большое количество сбоев в тривиально написанном коде.

1 голос
/ 05 июля 2011

Прочитайте pdf построчно и замените «Грегор» на «Грегор».

0 голосов
/ 29 сентября 2011

Я настоятельно рекомендую вам взглянуть на PdfTextStream.Они проделали тяжелую работу, описанную в посте плинтуса.

http://www.snowtide.com/

Они стремятся получить наиболее естественное (как бы читатель мог ожидать слово) определение слова.

...