Я использовал getbaseline[vector.I2]
для вычисления нижнего и верхнего индекса. Делая это, я не могу извлечь новую строку из PDF. Не могли бы вы предложить мне, как получить новую строку из PDF с помощью iTextSharp?
Как определить новую строку в PDF с помощью iTextSharp
Ответы (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-файлы с повернутым текстом, вы получите мусор повсюду.
else if
и все еще содержит строку `SupSubFlag = 2`. Таким образом, если вы правильно замените этот блок кода, обнаружение нижнего индекса все еще будет работать. только случай большого вертикального прыжка теперь трактуется иначе.
- person mkl; 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));