Как определить новую строку в PDF с помощью iTextSharp

Я использовал getbaseline[vector.I2] для вычисления нижнего и верхнего индекса. Делая это, я не могу извлечь новую строку из PDF. Не могли бы вы предложить мне, как получить новую строку из PDF с помощью iTextSharp?


person Pragya    schedule 16.03.2013    source источник
comment
По сути, вы должны распознавать небольшие вертикальные различия как нижний и верхний индексы, а большие - как новые строки. PDF-файлы, которые использовали операторы подъема текста для нижнего и верхнего индекса, еще больше упрощают эту задачу.   -  person mkl    schedule 16.03.2013
comment
не могли бы вы объяснить мне подробно .thanku   -  person Pragya    schedule 16.03.2013
comment
Пожалуйста, опишите, что вы сделали, еще более подробно, лучше всего с кодом. Как вы говорите, вы уже используете базовую строку для обнаружения нижнего и верхнего индекса, вы, кажется, уже наполовину там.   -  person mkl    schedule 16.03.2013


Ответы (2)


Приведенный вами код не совсем понятен. Таким образом, я делаю некоторые предположения, прежде всего, что ваш код является некоторым отрывком из метода RenderText(TextRenderInfo) реализации RenderListener, возможно, некоторым расширением SimpleTextExtractionStrategy с добавленными переменными-членами lastBaseLine, firstcharacter_baseline, lastFontSize и lastFont.

Это означает, что вас интересуют только те документы, в которых текст встречается в потоке контента в порядке чтения; в противном случае вы бы основывали свой код на LocationTextExtractionStrategy или подобном базовом алгоритме.

Кроме того, я не понимаю некоторые из ваших утверждений if, которые либо всегда ложны, либо всегда истинны, либо тело кода для которых пусто. Также неясно, для чего годится text_second и почему вы вычисляете difference = curBaseline[Vector.I2] - curBaseline[Vector.I2] в одном месте.

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

Я бы предложил вам начать сохранять не только последнюю базовую строку, но и последнюю строку спуска, которая, согласно документам, является строкой, представляющей самый нижний предел, который может иметь строка текущего шрифта , и сравните ее с текущей линией подъема (согласно документации строка, представляющая самый верхний предел, который может иметь строка текущего шрифта).

Если восходящая строка текущего текста находится ниже нисходящей строки последнего текста, это должно означать, что у нас есть новая строка, она находится слишком далеко для нижнего индекса. Поэтому в коде:

[...]
else if (curBaseline[Vector.I2] < lastBaseLine[Vector.I2])
{
    if (curAscentLine[Vector.I2] < lastDescentLine[Vector.I2])
    {
        firstcharacter_baseline = character_baseline;
        this.result.Append("<br/>");
    }
    else
    {
        difference = firstcharacter_baseline - curBaseline[Vector.I2];
        text_second.SetTextRise(difference);

        if (difference == 0)
        {
        }
        else
        {
            SupSubFlag = 2;
        }
    }
}
[...]

Поскольку вы ожидаете, что текст в потоке контента будет появляться в порядке чтения, вы также можете попытаться распознать новую строку, сравнив Vector.I1 координаты конца базовой строки последнего текста и начала базовой строки нового текста. текст. Если новый на соответствующую сумму меньше старого, это выглядит как возврат каретки, намекающий на новую строку.

Код, конечно, столкнется с проблемами в ряде ситуаций:

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

  • Если у вас есть многоколоночный текст, приведенный выше тест не уловит разрыв строки между нижней частью одного столбца и верхней частью следующего. Чтобы также уловить это, вы можете проверить (аналогично предложенной проверке перехода на строку вниз), находится ли новый текст намного выше предыдущего текста, сравнивая последнюю строку подъема с новой линией спуска.

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

  • Если вы получаете PDF-файлы с повернутым текстом, вы получите мусор повсюду.

person mkl    schedule 18.03.2013
comment
благодарю вас . я попробую это. - person Pragya; 18.03.2013
comment
Нужно ли мне изменить код для обнаружения индекса из pdf. есть ли другой способ обнаружения и новой строки, пожалуйста, предложите мне? - person Pragya; 19.03.2013
comment
Пожалуйста, посмотрите на код в моем ответе. Он предназначен для замены только одного из ваших блоков else if и все еще содержит строку `SupSubFlag = 2`. Таким образом, если вы правильно замените этот блок кода, обнаружение нижнего индекса все еще будет работать. только случай большого вертикального прыжка теперь трактуется иначе. - person mkl; 19.03.2013
comment
Можете ли вы отправить свой почтовый идентификатор, я отправлю pdf - person Pragya; 19.03.2013

Вы можете использовать

Document.Add(new Phrase(Environment.NewLine));

OR

  // add line below title
  LineSeparator line = new LineSeparator(1f, 100f, BaseColor.BLACK, Element.ALIGN_CENTER, -1);
  document.Add(new Chunk(line));
person Amol    schedule 16.03.2013
comment
спасибо, что ответили в ближайшее время ... при чтении текста из pdf текст извлекается без новой строки. содержимое следующей строки отображается в той же строке без новой строки. Я думаю, что приведенный выше код предназначен для создания PDF. При получении содержимого из PDF я хочу, чтобы текст был разделен разрывом строки. Может ли кто-нибудь помочь мне? Заранее спасибо - person Pragya; 16.03.2013
comment
см. это - person Amol; 16.03.2013