【问题标题】:How to detect newline from PDF using iTextSharp [closed]如何使用 iTextSharp 从 PDF 中检测换行符 [关闭]
【发布时间】:2013-03-18 19:25:57
【问题描述】:

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

【问题讨论】:

  • 本质上,您必须将小的垂直差异识别为下标和上标,而将较大的垂直差异识别为换行符。使用文本上升运算符作为下标和上标的 Pdfs 使这更容易。
  • 你能详细解释一下吗?谢谢
  • 请更详细地描述您已经完成的工作,最好使用一些代码。正如您所说,您已经使用基线进行下标和上标检测,您似乎已经完成了一半。

标签: c# itextsharp


【解决方案1】:

您提供的代码并非完全不言自明。因此我做了一些假设,首先你的代码是RenderListener实现的RenderText(TextRenderInfo)方法的一些摘录,可能是SimpleTextExtractionStrategy的一些扩展,添加了成员​​变量lastBaseLinefirstcharacter_baselinelastFontSize,和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,你会得到满是乱码。

【讨论】:

  • 谢谢。我会试试这个。
  • 我是否需要更改代码以检测 pdf 中的下标。有没有其他方法可以检测和换行请建议我?
  • 请看我回答中的代码。它旨在替换您的 else if 块之一,它仍然包含 `SupSubFlag = 2` 行。因此,如果您正确替换该代码块,您的下标检测仍然有效。现在只对大垂直跳跃的情况进行不同的处理。
  • 你可以发送你的邮件ID我会发送pdf
【解决方案2】:

你可以使用

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));

【讨论】:

  • 感谢您尽快回复...从 pdf 中读取文本时,提取的文本没有换行符。下一行内容显示在同一行,没有换行符。我认为上面的代码是用于创建 PDF。从 PDF 中获取内容时,我希望文本由换行符分隔。有人可以帮帮我吗?提前谢谢你
  • This
猜你喜欢
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
相关资源
最近更新 更多