2017-01-10 3 views
1

Я пытаюсь найти текст в pdf-файле и возвращать координаты, если текст существует. Я изучал сеть и выяснил, что это можно сделать с помощью библиотеки itextsharp.Искать текст в pdf-файле и возвращать координаты, если существует текст

Я нашел этот код, и я пытаюсь его модифицировать в соответствии с моими требованиями. Как передать файл в этот класс.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var testFile = @"test.pdf"; 
     //Create an instance of our strategy 
     var t = new MyLocationTextExtractionStrategy("test"); 

     //Parse page 1 of the document above 
     using (var r = new PdfReader(testFile)) 
     { 
      var ex = PdfTextExtractor.GetTextFromPage(r, 1, t); 
     } 

     //Loop through each chunk found 
     foreach (var p in t.myPoints) 
     { 
      Console.WriteLine(string.Format("Found text {0} at {1}x{2}", p.Text, p.Rect.Left, p.Rect.Bottom)); 
     } 

     Console.Read(); 
    } 
public class RectAndText 
    { 
     public iTextSharp.text.Rectangle Rect; 
     public String Text; 
     public RectAndText(iTextSharp.text.Rectangle rect, String text) 
     { 
      this.Rect = rect; 
      this.Text = text; 
     } 
    } 

    public class MyLocationTextExtractionStrategy : LocationTextExtractionStrategy 
    { 
     //Hold each coordinate 
     public List<RectAndText> myPoints = new List<RectAndText>(); 

     //The string that we're searching for 
     public String TextToSearchFor { get; set; } 

     //How to compare strings 
     public System.Globalization.CompareOptions CompareOptions { get; set; } 

     public MyLocationTextExtractionStrategy(String textToSearchFor, System.Globalization.CompareOptions compareOptions = System.Globalization.CompareOptions.None) 
     { 
      this.TextToSearchFor = textToSearchFor; 
      this.CompareOptions = compareOptions; 
     } 

     //Automatically called for each chunk of text in the PDF 
     public override void RenderText(TextRenderInfo renderInfo) 
     { 
      base.RenderText(renderInfo); 

      //See if the current chunk contains the text 
      var startPosition = System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(renderInfo.GetText(), this.TextToSearchFor, this.CompareOptions); 

      //If not found bail 
      if (startPosition < 0) 
      { 
       return; 
      } 

      //Grab the individual characters 
      var chars = renderInfo.GetCharacterRenderInfos().Skip(startPosition).Take(this.TextToSearchFor.Length).ToList(); 

      //Grab the first and last character 
      var firstChar = chars.First(); 
      var lastChar = chars.Last(); 


      //Get the bounding box for the chunk of text 
      var bottomLeft = firstChar.GetDescentLine().GetStartPoint(); 
      var topRight = lastChar.GetAscentLine().GetEndPoint(); 

      //Create a rectangle from it 
      var rect = new iTextSharp.text.Rectangle(
                bottomLeft[Vector.I1], 
                bottomLeft[Vector.I2], 
                topRight[Vector.I1], 
                topRight[Vector.I2] 
                ); 

      //Add this to our main collection 
      this.myPoints.Add(new RectAndText(rect, this.TextToSearchFor)); 
     } 
    } 
+0

Проблема, скорее всего, связана с тем, как структурирован ваш входной документ. Поэтому, если вы можете поделиться файлом, я могу указать на проблему и помочь вам найти решение. – blagae

+1

Очень краткое объяснение: в файле PDF можно записать любое слово с одной инструкцией рендеринга на каждую букву, включая все возможные перестановки, такие как «te», «s» и «t», не обязательно в этом порядке. В то время, когда вызывается «RenderText», эти отдельные текстовые шрифты еще не объединены в одно слово. Поэтому в любое время слово «тест» не записывается вместе в одной команде рендеринга, ваш код будет терпеть неудачу. – blagae

ответ

1

Мне кажется, что PdfReader принимает строку, которая представляет собой путь к файлу, который вы хотите прочитать. Поэтому просто измените

var testFile = @"test.pdf"; 

Чтобы указать файл, который хотите использовать. (возможно, вам придется добавить полный путь, если он не находится в рабочей папке приложения)

+0

Спасибо. Да, я передаю полный путь и строку поиска, но программа действует как строка не в файле pdf. –

0

omg! Ваш код настолько большой для этой задачи. Я могу порекомендовать много простого решения. Пожалуйста, смотрите следующие

//Open PDF document 
using (var doc = PdfDocument.Load(@"d:\0\test_big.pdf")) 
{ 
    //Enumerate pages 
    foreach(var page in doc.Pages) 
    { 
     var found = page.Text.Find("text for search", FindFlags.MatchWholeWord, 0); 
     if (found == null) 
      return; //nothing found 
     do 
     { 
      var textInfo = found.FindedText; 
      foreach(var rect in textInfo.Rects) 
      { 
       float x = rect.left; 
       float y = rect.top; 
       //... 
      } 
     } while (found.FindNext()); 

     page.Dispose(); 
    } 
} 
+0

Исходный плакат использует itext (или itextsharp), как указано в тегах вопроса и в теле вопроса. Похоже, вы используете какую-то другую библиотеку, или, по крайней мере, имена классов, которые вы используете, не являются именами itextsharp. Таким образом, ваш ответ не подходит для вопроса. – mkl

Смежные вопросы