2012-04-13 4 views
21

Есть ли возможность извлечь простой текст из PDF-файла с помощью PdfSharp? Я не хочу использовать iTextSharp из-за его лицензии.C# Извлечь текст из PDF с помощью PdfSharp

Спасибо за ваши ответы.

EDIT: Я знаю, что это возможно. Но как мне это сделать?

+0

Просто интересно, почему downvotes? (Нет комментариев, чтобы помочь автору улучшить этот вопрос.) –

ответ

6

PDFSharp предоставляет все инструменты для извлечения текста из PDF. Используйте класс ContentReader для доступа к командам на каждой странице и извлеките строки из операторов TJ/Tj.

Я загрузил простую реализацию в github.

+1

Во многих PDF-файлах CString.Value возвращает только некоторый барахл (например, создайте PDF с помощью OpenOffice.org и попытайтесь импортировать его с помощью этого метода). –

11

Я внедрил его так или иначе, как это сделал Дэвид. Вот мой код:

{ 
     // .... 
     var page = document.Pages[1]; 
     CObject content = ContentReader.ReadContent(page); 
     var extractedText = ExtractText(content); 
     // ... 
    } 

    private IEnumerable<string> ExtractText(CObject cObject) 
    { 
     var textList = new List<string>(); 
     if (cObject is COperator) 
     { 
      var cOperator = cObject as COperator; 
      if (cOperator.OpCode.Name== OpCodeName.Tj.ToString() || 
       cOperator.OpCode.Name == OpCodeName.TJ.ToString()) 
      { 
       foreach (var cOperand in cOperator.Operands) 
       { 
        textList.AddRange(ExtractText(cOperand)); 
       } 
      } 
     } 
     else if (cObject is CSequence) 
     { 
      var cSequence = cObject as CSequence; 
      foreach (var element in cSequence) 
      { 
       textList.AddRange(ExtractText(element)); 
      } 
     } 
     else if (cObject is CString) 
     { 
      var cString = cObject as CString; 
      textList.Add(cString.Value); 
     } 
     return textList; 
    } 
+0

Вы не должны урезать StringBuilder, PDF-файлы довольно большие, и это решение вызовет огромное ненужное потребление памяти. –

19

принял ответ Sergio и сделал некоторые методы расширения. Я также изменил накопление строк в итераторе.

public static class PdfSharpExtensions 
{ 
    public static IEnumerable<string> ExtractText(this PdfPage page) 
    {  
     var content = ContentReader.ReadContent(page);  
     var text = content.ExtractText(); 
     return text; 
    } 

    public static IEnumerable<string> ExtractText(this CObject cObject) 
    { 
     if (cObject is COperator) 
     { 
      var cOperator = cObject as COperator; 
      if (cOperator.OpCode.Name== OpCodeName.Tj.ToString() || 
       cOperator.OpCode.Name == OpCodeName.TJ.ToString()) 
      { 
       foreach (var cOperand in cOperator.Operands) 
        foreach (var txt in ExtractText(cOperand)) 
         yield return txt; 
      } 
     } 
     else if (cObject is CSequence) 
     { 
      var cSequence = cObject as CSequence; 
      foreach (var element in cSequence) 
       foreach (var txt in ExtractText(element)) 
        yield return txt; 
     } 
     else if (cObject is CString) 
     { 
      var cString = cObject as CString; 
      yield return cString.Value; 
     } 
    } 
} 
+0

Я использую библиотеку PDFsharp, но он говорит, что класс ContentReader не соответствует контексту. Какая может быть проблема? –

+0

Класс ContentReader не соответствует контексту. –

+2

Не смог устоять. IDK, что это означает или как его исправить. Я стараюсь избегать работы с PDF-файлами, такими как чума, потому что инструменты для работы с ними - дерьмо и притворяются, что читаемый человеком формат является машиносчитываемым, является полным безумным поручением. –

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

  • Нет связанных вопросов^_^