2013-12-11 17 views
5

iTextSharpライブラリを使用してPDFからテキストを文字列に読み込もうとしています。.NETのPDFからテキストを読む

iTextSharp.text.pdf.PdfReader pdfReader = new iTextSharp.text.pdf.PdfReader(@"C:\mypdf.pdf"); 
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy(); 
string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, 1, strategy); 
text = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText))); 
pdfReader.Close(); 
Console.WriteLine(text); 

これは通常OKに動作しますが、すべての数行が空白のような出力を私に残して、省略されます:「thisismyoutputwithoutwhitespace」。正しく解析するテキストは、そうでないテキストと同じように見えます。同じテキストが一貫して正しく解析されないため、PDF内に何かがあると私は思う。

答えて

6

PDFのコンテンツストリームには、「単語」という概念はありません。 iText(シャープ)のテキスト抽出の実装では、文字を単語にグループ化する方法を決定するためのヒューリスティックスがいくつかあります。 2文字の間の距離が現在のフォントのスペースの幅の半分より大きい場合、空白が挿入されます。

恐らく、空白なしで抽出されるテキストは、「spacewidth/2」より小さい単語の間に距離があります。 SimpleTextExtractionStrategy.RenderText()

if (spacing > renderInfo.GetSingleSpaceWidth()/2f){ 
    AppendTextChunk(' '); 
} 

あなたはSimpleTextExtractionStrategyを拡張し、RenderText()を調整することができます。

LocationTextExtractionStrategyの方が便利です。あなただけIsChunkAtWordBoundary()を上書きする必要があります。

protected bool IsChunkAtWordBoundary(TextChunk chunk, TextChunk previousChunk) { 
    float dist = chunk.DistanceFromEndOf(previousChunk); 
    if(dist < -chunk.CharSpaceWidth || dist > chunk.CharSpaceWidth/2.0f) 
     return true; 

    return false; 
} 

あなたはあなたのPDFファイルのために良い結果を得るために少し実験する必要があります。あなたのケースでは、 "spacewidth/2"が明らかに大きすぎます。しかし、小さすぎるように調整すると、誤検出が発生します。空白が単語内に挿入されます。

+0

ありがとうございます!これは非常に役に立ちます。しかし、IsChunkAtBounary()はオーバーライド可能ですか?私は "抽象的な、仮想としてマークされていないので、上書きできません。"私は新しいクラス、LocationTextExtractionStrategyを拡張し、メソッドをオーバーライドしました。 –

+0

これは、JavaからC#への移植エラーと思われます。これが次のリリースで修正されることを確認します。この問題を回避するには、LocationTextExtractionStrategyコードをコピーして、ITextExtractionStrategyインターフェイスを完全に新しい実装にする必要があります。新しい実装では、isChunkAtWordBoundaryメソッドを調整できます。私は知っている...清潔な解決策ではありません。私はあまりCに精通していません。おそらくC#の経験が豊富な人は、より洗練されたソリューションを考えることができます。 – rhens

+0

LocationTextExtractionStrategyのソースコードを入手できない場合は、最新のバージョン(http://sourceforge.net/p/itextsharp/code/HEAD/tree/trunk/src/core/iTextSharp)をご覧ください。 /text/pdf/parser/LocationTextExtractionStrategy.cs – rhens

関連する問題