2017-02-06 22 views
0

から単語内にスペースを挿入し、私は以下のPDFファイルからテキストを抽出しようとしています:iTextSharpはiTextSharpを使用してPDFファイル

https://www.treasury.gov/ofac/downloads/sdnlist.pdf

これはコードです:

var currentText = PdfTextExtractor.GetTextFromPage(pdfReader, 2, new SimpleTextExtractionStrategy()); 
        if (currentText.Length > 0) 
          { 
           var capture = new Capture(); 
           capture.Text = currentText; 

           // write the results to the DB, if any data was found 
           _dataService.AddCapture(capture); 
          } 

使い方SimpleTextExtractionStrategyを使用すると、結果は単語内に無数の不必要なスペースを入れてデータベースに書き込まれます。 2ページ書き込みの最初の数行:

特別指定国民& BLOCKED PERSONS 2017年2月3日外国資産管理局 - 2 - A.A. RASPLET IN; a。 a。 AL MAZ -AN TEY MSDB; a.k.a。 AL MAZ -ANTEY PV O 'AI R防衛' CO NCERNリードSYSTE M S設計局OAO 'OPEN JO INT -STOCK 同社IMENI ACADEMIC IAN aの化合物。表。 RASPLETIN; a.k .a。 GO LOVNOYE SISTEMN OYE KONS TRUKT ORSKOY E BYURO OPEN J OIN T-SタックC OMPアルマズ-AN TEY PVO C ONCERN I MEN IアカデミーA .A OF ANY 。 RASPLE TIN; a.k. a。 ACADE MICIAN A.A.によって命名SYSTE M設計局IN JO INT STOCK C OMPANY A LMA Z-AN TEY AI R DEFENSE CON CERN MA

例えば第四&第六行のワード「JO INT」、そして最後の行に第二のワード「CONのCERN」を参照してください。これらのタイプのスペースは、結果全体にわたって発生します。これは残念なことに、テキストの照会を不可能にします。

誰もが、これはこれを実行し、これを解決する方法を、なぜ任意のアイデアを持っていますか?

答えて

1

なぜこれがこの

原因は、実際に必要に応じて、あなたのケースでは動作しませんテキスト抽出戦略の機能ですありません。

背景のビット:あなたはPDFファイルで単語間のスペースとして認識することは、必ずしも、スペースの文字の描画命令にされて入って来ていない、それはまた、シフト命令の結果であり得ますテキストの挿入位置は少し右です。したがって、テキスト抽出戦略では、通常、そのような十分に大きな右シフトを見つけるときに空白文字が追加されます。これに関するいくつかの詳細(特に、「十分に大きい」部分)は、例えば、 this answer

あなたの文書の場合、テキスト本文のフォントのフォント幅情報が小さすぎます(そのまま使用すると、文字は間にスペースを入れずに貼り付けて表示されます)。したがって、連続したキャラクタの各カップルの間には小さな右シフトが存在し、上記のメカニズムによってワードの分離として誤って識別されるほど十分に広いシフトが生じる。あなたのPDF内の単語の分離はスペース文字を描画する命令で作成されたよう

にこれを解決する方法を

、あなたは、上述の機能を必要としません。したがって、問題を解決する最も簡単な方法は、その機能を持たないテキスト抽出戦略を使用することです。

あなたはSimpleTextExtractionStrategyのソースコードをコピーすることによって、このような戦略を作成することができる(例えばhereから)と、以下のような方法RenderTextからいくつかの行をコメントアウト:この単純化された抽出戦略を使用して

public virtual void RenderText(TextRenderInfo renderInfo) 
{ 
    [...] 

    if (hardReturn) 
    { 
     //System.out.Println("<< Hard Return >>"); 
     AppendTextChunk('\n'); 
    } 
    else if (!firstRender) 
    { 
//  if (result[result.Length - 1] != ' ' && renderInfo.GetText().Length > 0 && renderInfo.GetText()[0] != ' ') 
//  { // we only insert a blank space if the trailing character of the previous string wasn't a space, and the leading character of the current string isn't a space 
//   float spacing = lastEnd.Subtract(start).Length; 
//   if (spacing > renderInfo.GetSingleSpaceWidth()/2f) 
//   { 
//    AppendTextChunk(' '); 
//    //System.out.Println("Inserting implied space before '" + renderInfo.GetText() + "'"); 
//   } 
//  } 
    } 
    else 
    { 
     //System.out.Println("Displaying first string of content '" + text + "' :: x1 = " + x1); 
    } 

    [...] 
} 

、あなたのテキストが適切に抽出されます。

+0

私はこれらの部分の周りを見ましたが、あなたは確かにこの主題の王です。あなたの偉大な知恵と助けをありがとう! – Stpete111

関連する問題