【问题标题】:iTextSharp reporting text position incorrectlyiTextSharp 错误地报告文本位置
【发布时间】:2012-08-29 01:31:53
【问题描述】:

我正在开发一个使用 iTextSharp 从 PDF 文件中提取文本的系统。我已经创建了一个实现 ITextExtractionStrategy 的类并实现了 RenderText()、GetResultantText() 等方法。我也研究了 iTextSharp 本身提供的 LocationTextExtractionStrategy 类。

我面临的问题是,对于特定的 PDF 文档,RenderText() 方法会错误地报告一些文本块的水平位置。这发生在页面上总共 700 多个文本块中的大约 15-20 个块中。我正在使用以下简单代码来获取 RenderText() 中的文本位置:

Vector curBaselineStart = renderInfo.GetBaseline().GetStartPoint();
LineSegment segment = renderInfo.GetBaseline();
TextChunk location = new TextChunk(renderInfo.GetText(), segment.GetStartPoint(), segment.GetEndPoint(), renderInfo.GetSingleSpaceWidth());
chunks.Add(location);

收集所有文本块后,我尝试使用 Graphics 类和以下简单循环将它们绘制在位图上:

for (int k = 0; k < chunks.Count; k++)
{
    var ch = chunks[k];
    g.DrawString(ch.text, fnt, Brushes.Black, ch.startLocation[Vector.I1], bmp.Height - ch.startLocation[Vector.I2], StringFormat.GenericTypographic);
}

问题仅发生在这几个文本块的 X(水平)维度上。它们看起来比实际位置稍微靠左。想知道我的代码是否有问题。

舒雅特

【问题讨论】:

  • 以下链接中的 C# 4.0 项目演示了该问题。它尝试从第 14 页提取文本块并将它们绘制到位图上。您将在表格的第 3 列中看到错误文本位置的示例(例如,“Ma”、“Bio”等实际上是第 4 列的一部分,当您使用 Acrobat 打开 PDF 文件时会看到)。 C# 项目链接:4shared.com/get/6w2SUo0q/TjTest.html
  • 以上链接需要创建帐户,我们有些人不喜欢。我现在也将相同的文件上传到了 MediaFire。无需创建帐户。这是链接:mediafire.com/?nz0o7xs9md1lg7q

标签: c# itextsharp


【解决方案1】:

终于想通了。在 PDF 中,计算实际文本位置比简单地获取基线坐标更复杂。您还需要结合字符和单词间距、水平和垂直缩放以及其他一些因素。我与 iText 人员进行了一些通信,他们现在在 TextRenderInfo 类中合并了一个新方法,该方法通过处理上述所有因素来提供实际的逐个字符位置。

【讨论】:

  • 方法名是什么?
  • @AlexKapustian:那是大约 3 年前的事了,这意味着 iTextSharp 桥下流过很多水。我不确定这些更改是否会在 iTextSharp 的未来版本中持续存在(甚至演变)。只是给你一个起点,尝试在 TextRenderInfo 类中搜索 GetWordSpacing()getCharacterSpacing() 函数。 This link 有更多关于我与相关人员讨论的详细信息。
猜你喜欢
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多