2012-04-13 363 views
21

¿Existe la posibilidad de extraer texto sin formato de un archivo PDF con PdfSharp? No quiero usar iTextSharp debido a su licencia.C# Extraer texto del PDF utilizando PdfSharp

Gracias por sus respuestas.

EDIT: Sé que es posible. ¿Pero cómo hago eso?

+0

Solo me pregunto, ¿por qué downvotes? (No hay comentarios aclaratorios para ayudar al autor a mejorar la pregunta.) –

Respuesta

6

PDFSharp proporciona todas las herramientas para extraer el texto de un PDF. Use la clase ContentReader para acceder a los comandos dentro de cada página y extraer las cadenas de los operadores TJ/Tj.

He subido una implementación simple al github.

+1

En muchos archivos PDF, CString.Value devuelve solo algo de basura (por ejemplo, crea un PDF usando OpenOffice.org e intenta importarlo usando este método). –

11

Lo he implementado de alguna manera similar a como lo hizo David. Aquí está mi código:

{ 
     // .... 
     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

No debería haber desmantelado StringBuilder, los archivos PDF son bastante grandes y esa solución provocará un gran consumo innecesario de memoria. –

19

Tomó la respuesta de Sergio e hizo algunos métodos de extensión. También cambié la acumulación de cadenas en un iterador.

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

Estoy usando la biblioteca PDFsharp, pero dice que la clase ContentReader está fuera de contexto. ¿Cuál podría ser el problema? –

+0

ContentReader Class está fuera de contexto. –

+2

No pude resistir. IDK lo que eso significa o cómo solucionarlo. Trato de evitar trabajar con PDF como la plaga porque las herramientas para trabajar con ellos son basura y pretender que un formato legible por las personas es legible por máquina es una tarea totalmente tonta. –

Cuestiones relacionadas