我使用getbaseline[vector.I2]
来计算下标和上标。通过这样做,我无法从PDF中提取换行符。你能告诉我如何使用iTextSharp从PDF获取换行符吗?
答案 0 :(得分:1)
您提供的代码并非完全不言自明。因此,我做了一些假设,最重要的是您的代码是RenderText(TextRenderInfo)
实现的RenderListener
方法的一些摘录,可能是SimpleTextExtractionStrategy
的一些扩展,添加了成员变量lastBaseLine
, firstcharacter_baseline
,lastFontSize
和lastFont
。
这意味着您似乎只对阅读顺序中内容流中出现文本的文档感兴趣;否则,您的代码将基于LocationTextExtractionStrategy
或类似的基本算法。
此外,我不理解你的一些if
语句,它们总是假的或总是为真的,或者代码体是空的。也不清楚text_second
有什么用处,或者为什么在一个地方计算difference = curBaseline[Vector.I2] - curBaseline[Vector.I2]
。
所有这些,你的初始if
语句似乎测试新文本的垂直基线位置是否与之前的文本不同。因此,您可以在这里找到新行的开头。
我建议您不仅要开始存储最后一个基线,还要开始存储最后一个下行线,根据文档表示当前字体的字符串可能具有的最大范围的线< / em>,并将其与当前上升行进行比较(通过文档表示当前字体字符串可能具有的最高范围的行)。
如果当前文本的上升行低于最后一个文本的下降行,那么这应该意味着我们有一个新行,它对于下标来说太过分了。因此,在代码中:
[...]
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
坐标和开始来识别新行新文本的基线。如果新的相关金额小于旧金额,则看起来像是一个回车线,暗示新线。
当然,代码会在很多情况下遇到麻烦:
每当您期望内容流中的文本按阅读顺序发生时,如果没有实现,您就会全身心投入垃圾。
当您有多列文本时,上面的测试不会捕获一列底部和下一列顶部之间的换行符。为了解决这个问题,您可能需要检查(类似于建议检查跳转一行)新文本是否高于最后一个文本,将最后一个上升线与新下降线进行比较。
< / LI>如果您获得包含非常密集文本的PDF,则行可能与周围行的上标和下标重叠。在这种情况下,您将不得不微调比较。但是在这里你有时会明确地遇到错误检测到的休息。
如果您获得带有旋转文字的PDF文件,那么您将获得所有的垃圾邮件。
答案 1 :(得分:0)
您可以使用
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));