如何使用iTextSharp从PDF中检测换行符

时间:2013-03-16 05:10:30

标签: c# itextsharp

我使用getbaseline[vector.I2]来计算下标和上标。通过这样做,我无法从PDF中提取换行符。你能告诉我如何使用iTextSharp从PDF获取换行符吗?

2 个答案:

答案 0 :(得分:1)

您提供的代码并非完全不言自明。因此,我做了一些假设,最重要的是您的代码是RenderText(TextRenderInfo)实现的RenderListener方法的一些摘录,可能是SimpleTextExtractionStrategy的一些扩展,添加了成员​​变量lastBaseLinefirstcharacter_baselinelastFontSizelastFont

这意味着您似乎只对阅读顺序中内容流中出现文本的文档感兴趣;否则,您的代码将基于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));