2012-08-29 49 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