2017-01-10 11 views
1

Я использую .net PdfBox для синтаксического анализа для извлечения текста из текста PDF Alongwith location.For, что при поиске я нашел следующий код Java:Невозможно переопределить метод PDFTextStripper.writeString (String text, List <TextPosition> textPositions) с использованием C#?

PDFTextStripper stripper = new PDFTextStripper() 
{ 
    @Override 
    protected void writeString(String text, List<TextPosition> textPositions) throws IOException 
    { 
     super.writeString(text, textPositions); 

     TextPosition firstProsition = textPositions.get(0); 
     TextPosition lastPosition = textPositions.get(textPositions.size() - 1); 
     writeString(String.format("[%s - %s/%s]", firstProsition.getXDirAdj(), lastPosition.getXDirAdj() + lastPosition.getWidthDirAdj(), firstProsition.getYDirAdj())); 
    } 
}; 
stripper.setSortByPosition(true); 
return stripper.getText(document); 

Я превращал его в .net следующим образом:

class PDFTextLocationStripper : PDFTextStripper 
{ 
    public string textWithPostion = ""; 
    protected override void processTextPosition(TextPosition text) 
    { 
      textWithPostion += "String[" + text.getXDirAdj() + "," + 
      text.getYDirAdj() + " fs=" + text.getFontSize() + " xscale=" + 
      text.getXScale() + " height=" + text.getHeightDir() + " space=" + 
      text.getWidthOfSpace() + " width=" + 
      text.getWidthDirAdj() + "]" + text.getCharacter(); 
    } 

    protected override void writeString(java.lang.String text, java.util.List textPositions) 
    { 
      base.writeString(text, textPositions); 
      TextPosition firstProsition = (TextPosition)textPositions.get(0); 
      TextPosition lastPosition =(TextPosition) textPositions.get(textPositions.size() - 1); 
      writeString(String.Format("[%s - %s/%s]", firstProsition.getXDirAdj(), lastPosition.getXDirAdj() + lastPosition.getWidthDirAdj(), firstProsition.getYDirAdj())); 
    } 

} 

Но, я получаю ошибку компиляции для приведенного выше кода, что:

Ошибка 1 Нет перегрузки метода 'WriteString' принимает 2 аргумента

Ошибка 2 'PDFTextLocationStripper.writeString (java.lang.String, java.util.List)': не подходящий метод нашел переопределить

Итак, как же я переопределить метод WriteString, так что я могу извлечь текст вместе с местоположением?

ответ

0

Поскольку я не был в состоянии перегружать WriteString method.I использовал processTextPosition для извлечения слов из PDF вместе с их positions.Here является код:

class PDFTextLocationStripper : PDFTextStripper 
    { 
     public string textWithPostion = ""; 
     public Dictionary<float, Dictionary<float, PdfWord>> pdfWordsByXByY; 

     public PDFTextLocationStripper(): base() 
     { 
      try 
      { 
       textWithPostion = ""; 
       pdfWordsByXByY = new Dictionary<float, Dictionary<float, PdfWord>>(); 
      } 
      catch (Exception ex) 
      { 

      } 
     } 

     protected override void processTextPosition(TextPosition text) 
     { 
      try 
      { 
       float textX = text.getXDirAdj(); 
       float textY = text.getYDirAdj(); 
       if (!String.IsNullOrWhiteSpace(text.getCharacter())) 
       { 
        if (pdfWordsByXByY.ContainsKey(textY)) 
        { 
         Dictionary<float, PdfWord> wordsByX = pdfWordsByXByY[textY]; 
         if (wordsByX.ContainsKey(textX)) 
         { 
          PdfWord word = wordsByX[textX]; 
          wordsByX.Remove(word.Right); 
          word.EndCharWidth = text.getWidthDirAdj(); 
          word.Height = text.getHeightDir(); 
          word.EndX = textX; 
          word.Text += text.getCharacter(); 
          if (!wordsByX.Keys.Contains(word.Right)) 
          { 
           wordsByX.Add(word.Right, word); 
          } 
         } 
         else 
         { 
          float requiredX = -1; 
          float minDiff = float.MaxValue; 
          for (int index = 0; index < wordsByX.Keys.Count; index++) 
          { 
           float key = wordsByX.Keys.ElementAt(index); 
           float diff = key - textX; 
           if (diff < 0) 
           { 
            diff = -diff; 
           } 
           if (diff < minDiff) 
           { 
            minDiff = diff; 
            requiredX = key; 
           } 
          } 
          if (requiredX > -1 && minDiff <= 1) 
          { 
           PdfWord word = wordsByX[requiredX]; 
           wordsByX.Remove(requiredX); 
           word.EndCharWidth = text.getWidthDirAdj(); 
           word.Height = text.getHeightDir(); 
           word.EndX = textX; 
           word.Text += text.getCharacter(); 
           if (!wordsByX.ContainsKey(word.Right)) 
           { 
            wordsByX.Add(word.Right, word); 
           } 
          } 
          else 
          { 
           PdfWord word = new PdfWord(); 
           word.Text = text.getCharacter(); 
           word.EndX = word.StartX = textX; 
           word.Y = textY; 
           word.EndCharWidth = word.StartCharWidth = text.getWidthDirAdj(); 
           word.Height = text.getHeightDir(); 
           if (!wordsByX.ContainsKey(word.Right)) 
           { 
            wordsByX.Add(word.Right, word); 
           } 
           pdfWordsByXByY[textY] = wordsByX; 
          } 
         } 
        } 
        else 
        { 
         Dictionary<float, PdfWord> wordsByX = new Dictionary<float, PdfWord>(); 
         PdfWord word = new PdfWord(); 
         word.Text = text.getCharacter(); 
         word.EndX = word.StartX = textX; 
         word.Y = textY; 
         word.EndCharWidth = word.StartCharWidth = text.getWidthDirAdj(); 
         word.Height = text.getHeightDir(); 
         wordsByX.Add(word.Right, word); 
         pdfWordsByXByY.Add(textY, wordsByX); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 

      } 
     } 
    } 

А вот класс PdfWord ,

class PdfWord 
    { 
     public float StartX { get; set; } 
     public float EndX { get; set; } 
     public float Y { get; set; } 
     public float StartCharWidth { get; set; } 
     public float EndCharWidth { get; set; } 
     public float Height { get; set; } 
     public string Text { get; set; } 
     public float Right { get { return EndX + EndCharWidth; } } 
    }