2012-08-29 53 views
1

我正在使用iTextSharp从PDF文件中提取文本提取系统。我已经创建了一个实现ITextExtractionStrategy的类,并实现了像RenderText(),GetResultantText()等方法。我也研究了iTextSharp本身提供的LocationTextExtractionStrategy类。iTextSharp错误地报告文本位置

我面临的问题是,对于特定的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); 

收集所有的文本块后,我试着画在一个位图,使用图形类和下面的简单循环:

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(水平)尺寸只有这几个文本块。它们比实际位置略微向左。想知道我的代码是否有问题。

舒贾特

+0

以下链接中的C#4.0项目演示了此问题。它试图从第14页提取文本块并将它们绘制到位图上。您会在表格的第3列中看到错误文本位置的示例(例如,“Ma”,“Bio”等实际上是第4列的一部分,正如您在用Acrobat打开PDF文件时看到的那样)。 C#项目链接:http://www.4shared.com/get/6w2SUo0q/TjTest.html – dotNET

+0

上面的链接需要创建帐户,我们有些人不喜欢。我现在也上传了同样的文件到MediaFire。不需要创建帐户。这里的链接:http://www.mediafire.com/?nz0o7xs9md1lg7q – dotNET

回答

0

终于想通了这一点。在PDF中,计算实际文本位置比简单获取基线坐标更复杂。你需要结合字符和字间距,水平和垂直缩放以及其他一些因素。我做了一些与iText工作人员的对话,他们现在在TextRenderInfo类中引入了一种新方法,通过照顾所有上述因素来提供实际的逐字符位置。

+0

什么名称的方法? –

+0

@AlexKapustian:那是3年前的事,这意味着iTextSharp桥下有许多水流。我不确定这些更改是否会在iTextSharp未来版本中持续(甚至是演变)。只要给出一个起点,就可以在TextRenderInfo类中搜索“GetWordSpacing()”和“getCharacterSpacing()”函数。 [此链接](http://itext.2136553.n4.nabble.com/PdfContentStreamProcessor-not-handling-TJ-operator-correctly-maybe-td4656117i20.html)有关于我与有关人员讨论的更多细节。 – dotNET