【问题标题】:identify paragraphs of pdf fiiles using itextsharp使用 itextsharp 识别 pdf 文件的段落
【发布时间】:2016-07-29 05:38:16
【问题描述】:

由于一些语义分析工作,我需要使用 iTextSharp 从 pdf 文件中识别段落。我知道 iTextSharp 的坐标位于页面的左下角。我找到了定义段落边界的三个特征:

  1. 如果一行中第一个单词的横轴小于总行;
  2. 如果连续两行的前导大于一般行的前导;
  3. 如果一行以“.”结尾并且结尾词的横轴小于其他行的横轴

但是,我被第二个卡住了。我如何知道段落中两行之间的一般引导?我的意思是两个连续的行之间有不同的间隔,因为像 'f'、'g' 这样的字母比其他的像 'a'、'n' 等需要更多的空间。

感谢您的帮助!

【问题讨论】:

  • 我的意思是两条连续的线之间有不同的间距——别想gap,想想基线到基线的距离,可能是减去字体大小之后.

标签: pdf itextsharp paragraphs


【解决方案1】:

我假设您正在使用 iTextSharp 中提供的解析器功能解析您的 PDF 文件。例如,请参阅 Extract font height and rotation from PDF files with iText/iTextSharp 以了解其他人在您之前是如何做到这一点的。更详细的文章可以在这里找到:Using Open Source PDF Technology to Solve the Unstructured Data Problem in Healthcare

您的问题是:如何计算领先?即:我怎么知道两条连续线的基线之间的距离?

当您使用 iTextSharp 解析 PDF 时,您会将每一行视为一系列 TextRenderInfo 对象。这些对象允许您获取文本的基线:

LineSegment baseline = renderInfo.GetBaseline();
Vector startpoint = baseline.GetStartPoint();

这个Vector 由不同的元素组成:Getting Coordinates of string using ITextExtractionStrategy and LocationTextExtractionStrategy in Itextsharp

您需要startpoint[Vector.I2]。另见:How to detect newline from PDF using iTextSharp

两个连续行的值之间的差异为您提供现代意义的前导值。在过去的印刷时代,每个字符都是一个固定大小的块。打印机(人,而不是机器)在成排的积木之间放置一条铅,以在行之间创造一些额外的空间。在现代计算中,这个词被保留了下来,但它的含义发生了变化。不再有“块”,但您可以使用字体大小。字体大小是字体中字形的平均大小。有些字形会占用更多的高度空间,有些会占用更少的空间,但是考虑到前导(基线之间的距离)和字体大小(每个字形的平均高度),您可以对“间距线条”。

【讨论】:

  • 领先?那就是:我怎么知道两条连续线的基线之间的距离 - 实际上我已经看到了该术语的两种不同定义,一种像您的定义,另一种从基线距离中减去字体大小。 OP 听起来像是他的第二个想法。
  • 啊哈,第二个定义可以追溯到这个词的起源。每个字符都是一个固定大小的块,打印机(人而不是机器)在块的行之间放置一条铅条,以在行之间创建一些额外的空间。在现代计算中,这个词被保留了下来,但它的含义发生了变化。如果是原来的意思,我误解了这个问题。
  • @BrunoLowagie 我知道您的回答包含足够的详细信息。这是一个很好的方向。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-06-13
  • 2011-07-01
  • 2011-04-20
  • 2012-12-21
  • 2023-04-08
  • 2015-06-14
  • 2011-02-07
  • 2015-04-04
相关资源
最近更新 更多