2017-01-10 5 views
1

J'utilise le .net de PDFBox pour analyser pour extraire le texte d'un texte pdf alongwith location.For que, lors de la recherche que j'ai trouvé le code java suivant:Impossible de remplacer PDFTextStripper.writeString (chaîne de caractères, liste <TextPosition> textPositions) à l'aide de 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); 

Je me suis converti à .net de la façon suivante:

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())); 
    } 

} 

Mais, je reçois une erreur de compilation pour le code ci-dessus que:

erreur 1 Aucune surcharge pour la méthode 'writeString' prend 2 arguments

Erreur 2 'PDFTextLocationStripper.writeString (java.lang.String, java.util.List)': pas de méthode appropriée trouvée pour remplacer

Alors, comment puis-je passer outre méthode writeString pour que je puisse extraire texte avec l'emplacement?

Répondre

0

Depuis, je ne pouvais pas surcharger le writeString method.I utilisé le processTextPosition pour extraire les mots d'un pdf avec leur positions.Here est le code:

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) 
      { 

      } 
     } 
    } 

Et voici la classe 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; } } 
    }