我已经用于getbaseline[vector.I2]
计算下标和上标。通过这样做,我无法从 PDF 中提取换行符。您能否向我建议如何使用 iTextSharp 从 PDF 中获取换行符?
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,你会得到 garbabr。
您可以使用
Document.Add(new Phrase(Environment.NewLine));
或者
// add line below title
LineSeparator line = new LineSeparator(1f, 100f, BaseColor.BLACK, Element.ALIGN_CENTER, -1);
document.Add(new Chunk(line));