2016-11-18 4 views
3

特定の構造と形式のPDFのコンテンツの文脈や意味関係を分析して理解できるプログラムを開発する必要があります。以下はPDFからC#

なPDFの内容の一部を示しており、サンプルです: enter image description here

だから私は、このようなフォントとして、PDF内のテキストが、また、metedataないだけを抽出することができますPDFの読み込みライブラリが必要サイズ、フォントスタイル(太字、イタリック)、背景色、表とその子要素、表のセルの背景色、チェックボックス、要素の位置などがあります。

無料の.NETライブラリがありますか?本当にありがとう。

PS:私はこの投稿を承知しています:Extract Data from .PDF filesしかし、図書館の能力は精緻化されていません。

+0

少し私はPDFについて知っているから、彼らのような高レベルの概念が含まれている場合、私は非常に驚くだろう「テーブルセルを。」 – adv12

+0

ファイルの情報は、PDFリーダに背景なしでの売り上げと、緑色での売却を指示するのに十分です。それは少なくともそれを示す何かがあることを意味します。 – VincentZHANG

+0

確かに、塗りつぶされた矩形と塗りつぶされていない矩形がありますが、それ以上の意味を持つものは何も期待しません。つまり、この矩形はテーブルの最初の列のヘッダーを表します。 "私は様々なライブラリを使ってPDFを書きましたが、そのような高レベルの概念はAPIの一部であることはありませんでした。 – adv12

答えて

2

を私は素早く答えを持っていないが、私は最後の2週間費やしてきました成功したこの正確な問題を解決します。私はApache PDFBoxを使ってPDFテキストをTextPositionsに抽出しました。これらのTextPositionsには、テキスト内の各文字に関する情報(位置、太字、斜体、フォントなど)が含まれています。この情報を使用して、すべての表要素の境界ボックスを設定し、テキスト整列、列メンバーシップなどのデシファーの項目を設定してから、PDFページを再作成し、1000行未満のコードでExcelの表を再作成しました。

チェックボックスのようなグラフィック要素を抽出する必要はありませんでしたが、Apache PDFBoxはCOSStreamsに抽出します。グラフィックスやフォーム要素はこれらのストリームから解析される可能性があります。私のコードはあなたが示したテーブルを再構築することができ、チェックボックスと背景色が不足しているだけです。

私は単純な解決策を探していましたが、これは簡単な方法ではありません。

編集:これがあなたを納得させることができなかった場合は、開始方法を教えてください。まず、PDFTextStripperまたはPDFTextStripperByAreaのいずれかを拡張します。これにより、processTextPositionオーバーライドを介してTextPositionにアクセスできます。次のコードは、TextPositionsを自分のカスタムクラスTextCharにどのように変換したかを示しています。私は、基本的なコンテキスト情報を動作するように相対textpositionsを使用します。

public class PDFStripper : PDFTextStripper 
    { 
     private List<TextChar>[] tcPages; 

     public PDFStripper(java.util.List pages) 
     { 
      int pagecount = pages.size(); 
      tcPages = new List<TextChar>[pagecount+1]; 
      base.processPages(pages); 
     } 

     protected override void processTextPosition(TextPosition tp) 
     { 
      PDGraphicsState gs = getGraphicsState(); 
      TextChar tc = BuildTextChar(tp, gs); 
      int currentPageNo = getCurrentPageNo(); 
      if (tcPages.ElementAtOrDefault(currentPageNo) == null) 
      { 
       tcPages[currentPageNo] = new List<TextChar>(); 
      } 
      tcPages[currentPageNo].Add(tc); 
     } 

     private static TextChar BuildTextChar(TextPosition tp, PDGraphicsState gstate) 
     { 
      TextChar tc = new TextChar(); 
      tc.Char = tp.getCharacter()[0]; 

      float h = (float)Math.Floor(tp.getHeightDir()); 
      tc.Box = new RectangleF 
      (
       tp.getXDirAdj(), 
       (float)Math.Round(tp.getYDirAdj(), 0, MidpointRounding.ToEven) - h, // adjusted Y to top 
       tp.getWidthDirAdj(), 
       h 
      ); 

      tc.Direction = tp.getDir(); 
      tc.SpaceWidth = tp.getWidthOfSpace(); 

      tc.Font = tp.getFont().getBaseFont(); 
      tc.FontSize = tp.getFontSizeInPt(); 

      try 
      { 
       int[] flags =  
        GetBits(tp.getFont().getFontDescriptor().getFlags()); 
       tc.IsBold = findBold(tp, flags, gstate); 
       tc.IsItalic = findItalics(tp, flags); 
      } 
      catch { } 

      return tc; 
     } 

     protected override void writePage() { return; } //prevents exception 
    } 
1

NuGetパッケージhttps://www.nuget.org/packages/TikaOnDotNet/を追加します。 これはApacheティカ

のDOTNETのバージョンは、この行います:

var extracted = new TikaOnDotNet.TextExtractor().Extract("file.pdf"); 
var text = extracted.Text; 
var metaData = extracted.Metadata; 

幸運の仲間:)

+0

あなたの答えをありがとう、申し訳ありませんが、それらのメタデータは、PDFファイルについてのものではなく、私の質問の詳細を参照してください、私は取得する必要がありますコンテンツの形式に関する情報です。 – VincentZHANG

+1

私は仲間を参照して、私は徹底的にあなたの質問を読んでいなかった:)、しかし、ちょうどあなたに必要なものをアイデアを与えるために、私はおそらく、コマンドラインツールを使用して私のC# htmlの場合、私はhtmlの結果を扱います:) – Sep