Extraer PDF de texto

El formato de archivo PDF es popular porque el contenido del archivo no se puede modificar fácilmente, en comparación con otros formatos de archivo de procesamiento de texto. Sin embargo, puede extraer texto de documentos PDF con Aspose.PDF for .NET API. En este artículo, exploremos algunas de las muchas posibilidades para buscar y extraer texto de archivos PDF usando C#. La siguiente es una lista de características que discutiremos en este blog:

Extraiga texto de un documento PDF completo usando C#

La lectura de contenido de texto de un documento PDF es una característica de uso frecuente. Puede extraer todo el texto de todas las páginas del documento siguiendo los pasos a continuación:

  1. Cargar documento PDF
  2. Crear objeto TextAbsorber
  3. Aceptar el absorbedor para todas las páginas
  4. Escriba el texto extraído en un archivo y guárdelo

El siguiente fragmento de código sigue estos pasos y muestra cómo extraer texto de un documento PDF completo usando C#:

// Abrir documento PDF
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Crear objeto TextAbsorber para extraer texto
TextAbsorber textAbsorber = new TextAbsorber();
// Aceptar el absorbedor para todas las páginas
pdfDocument.Pages.Accept(textAbsorber);
// Obtener el texto extraído
string extractedText = textAbsorber.Text;
// Crea un escritor y abre el archivo.
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Escribir una línea de texto en el archivo.
tw.WriteLine(extractedText);
// Cierra la corriente
tw.Close();

Buscar y extraer texto de una página específica en PDF en C#

Después de explorar la extracción de texto a nivel de documento, extraigamos texto de una página específica de un documento PDF. Simplemente siga los pasos a continuación para lograr sus requisitos:

  1. Cargar documento PDF
  2. Crear objeto TextAbsorber
  3. Aceptar el absorbedor para una página específica
  4. Escriba el texto extraído en un archivo y guárdelo

El siguiente fragmento de código sigue estos pasos para leer texto de cualquier página de un archivo PDF usando C#:

// Abrir documento PDF
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Acceda a la página requerida en el documento PDF
Page page = pdfDocument.Pages[1];
// Crear objeto TextAbsorber para extraer texto
TextAbsorber textAbsorber = new TextAbsorber();
// Aceptar el absorbedor para la página especificada
page.Accept(textAbsorber);
// Obtener el texto extraído
string extractedText = textAbsorber.Text;
// Crea un escritor y abre el archivo.
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Escribir una línea de texto en el archivo.
tw.WriteLine(extractedText);
// Cierra la corriente
tw.Close();

Busque y extraiga texto de una región específica de una página PDF en C#

Llevemos esta extracción de texto un paso más allá. Considere buscar algún texto de un área específica de la página. Es importante comprender aquí que la unidad de medida básica en Aspose.PDF for .NET es el punto, donde 72 puntos equivalen a 1 pulgada. Además, la esquina inferior izquierda se considera como el origen (0,0) de la página. Los siguientes son los pasos para leer texto de un área o sección específica de la página en un documento PDF:

  1. Cargar documento PDF de origen
  2. Crear objeto TextAbsorber
  3. Establezca TextSearchOptions y especifique coordenadas rectangulares
  4. Aceptar el absorbedor para una página específica
  5. Escribir texto extraído en un archivo

El fragmento de código a continuación muestra estos pasos para extraer texto de una región específica usando C#:

// Abrir documento
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Crear objeto TextAbsorber para extraer texto
TextAbsorber absorber = new TextAbsorber();
absorber.TextSearchOptions.LimitToPageBounds = true;
absorber.TextSearchOptions.Rectangle = new Aspose.Pdf.Rectangle(100, 200, 250, 350);
// Aceptar el absorbedor para la primera página
pdfDocument.Pages[1].Accept(absorber);
// Obtener el texto extraído
string extractedText = absorber.Text;
// Crea un escritor y abre el archivo.
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Escribir una línea de texto en el archivo.
tw.WriteLine(extractedText);
// Cierra la corriente
tw.Close();

Busque o extraiga texto específico de un archivo PDF con expresiones regulares usando C#

Puede extraer texto específico de un documento PDF que coincida con algún patrón. Por ejemplo, es posible que desee extraer algunas palabras o números específicos. Para este propósito, necesitaría diseñar una expresión regular. La API utilizará esa expresión regular para encontrar texto coincidente en el documento PDF. Los siguientes pasos son las pautas para buscar y extraer texto específico de archivos PDF:

  • Cargar documento PDF de entrada
  • Crear objeto TextAbsorber
  • Diseñe y configure una expresión regular para que coincida con algún texto
  • Recorra cada fragmento de texto extraído

El siguiente fragmento de código de C# utiliza una expresión regular que busca el texto que contiene 4 dígitos, por ejemplo, 1999,2000, etc. en todas las páginas del documento.

// documento abierto
Document pdfDocument = new Document(dataDir + @"Test.pdf");
// crear objeto TextAbsorber para encontrar todas las instancias de la frase de búsqueda de entrada
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(@"\d{4}"); //like 1999-2020                                                                                                                // set text search option to specify regular expression usage
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.TextSearchOptions = textSearchOptions;
// aceptar el absorbedor para todas las páginas
pdfDocument.Pages.Accept(textFragmentAbsorber);
// obtener los fragmentos de texto extraídos
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.TextFragments;     
// recorre los fragmentos
foreach (TextFragment textFragment in textFragmentCollection)
{
    Console.WriteLine(textFragment.Text);
}

Extraiga texto de las celdas de la tabla en un documento PDF usando C#

Extraer texto de tablas en una página PDF es un poco diferente. Hemos estado trabajando con la clase TextAbsorber en ejemplos anteriores, pero extraer texto de una tabla es un poco diferente. Por lo tanto, debe seguir los pasos a continuación para extraer texto de los objetos de la tabla:

  1. Cargar archivo PDF de origen
  2. Crear un objeto de la clase TableAbsorber
  3. Iterar a través de AbsorbedTable
  4. Recorra cada celda en cada fila de la tabla

El siguiente fragmento de código sigue estos pasos y extrae de manera eficiente el texto de las celdas de la tabla en un documento PDF usando C#:

Document pdfDocument = new Document(dataDir + "Test.pdf");
TableAbsorber absorber = new TableAbsorber();
absorber.Visit(pdfDocument.Pages[1]);
foreach (AbsorbedTable table in absorber.TableList)
{
    foreach (AbsorbedRow row in table.RowList)
    {
        foreach (AbsorbedCell cell in row.CellList)
        {
            TextFragment textfragment = new TextFragment();
            TextFragmentCollection textFragmentCollection = cell.TextFragments;
            foreach (TextFragment fragment in textFragmentCollection)
            {
                Console.WriteLine(fragment.Text);
            }
        }
    }
}

Busque y extraiga texto resaltado de un documento PDF usando C#

El texto resaltado está presente como anotación en los archivos PDF. Contienen Texto Marcado que los diferencia del texto convencional en un documento. Los pasos a continuación describen cómo leer el texto resaltado usando C#:

  1. Cargar documento de origen
  2. Recorrer todas las anotaciones
  3. Filtrar TextMarkupAnnotation
  4. Recuperar fragmentos de texto resaltados

El siguiente es un fragmento de código basado en los pasos anteriores, se puede usar para obtener texto resaltado de archivos PDF:

Document doc = new Document(dataDir + "ExtractHighlightedText.pdf");
// Recorrer todas las anotaciones
foreach (Annotation annotation in doc.Pages[1].Annotations)
{
    // Filtrar TextMarkupAnnotation
    if (annotation is TextMarkupAnnotation)
    {
        TextMarkupAnnotation highlightedAnnotation = annotation as TextMarkupAnnotation;
        // Recuperar fragmentos de texto resaltados
        TextFragmentCollection collection = highlightedAnnotation.GetMarkedTextFragments();
        foreach (TextFragment tf in collection)
        {
            // Mostrar texto resaltado
            Console.WriteLine(tf.Text);
        }
    }
}

Extraiga texto PDF con bajo consumo de memoria usando C#

Los siguientes son dos enfoques diferentes para optimizar el consumo de memoria al extraer texto de documentos PDF utilizando el lenguaje C#.

i) Usar el método Reset() y FreeMemory()

A veces, la extracción de texto puede consumir una gran cantidad de memoria y procesador. Posiblemente cuando el archivo de entrada es enorme y contiene mucho texto. Porque el objeto TextFragmentAsorber almacena todos los fragmentos de texto encontrados en la memoria.

Por lo tanto, la solución que recomendamos aquí es llamar al método absorber.Reset() después de procesar cada página. Además, si solo está realizando operaciones de lectura, también puede liberar la memoria que tienen los objetos de la página, con el método page.FreeMemory(). Por lo tanto, debe seguir los pasos a continuación para utilizar recursos mínimos:

  1. Cargar documento PDF de origen
  2. Especifique TextEditOptions
  3. Leer TextFragment
  4. Llamar al método Reset()
  5. Llamar al método FreeMemory()

El siguiente fragmento de código demuestra la extracción de texto de documentos PDF usando C#:

Document pdfDocument = new Document(dataDir + @"ITF-TTF Manual.pdf");
TextFragmentAbsorber absorber = new TextFragmentAbsorber(new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));
foreach (Page page in pdfDocument.Pages)
{
    page.Accept(absorber);
    //Leer algo de fragmentos
    count += absorber.TextFragments.Count;
    absorber.Reset();
    page.FreeMemory();
    //GC.Recoger();        
}

Hemos probado este fragmento de código con un enorme archivo de muestra que contiene 450 páginas, 24500 fragmentos de texto y muchas imágenes rasterizadas y vectoriales. El proceso consumió apenas 500 MB de memoria. Otro consejo aquí es que puede cobrarle al recolector de basura .NET para reducir el consumo máximo de memoria a alrededor de 250 MB con un costo adicional de 10 segundos de tiempo de procesamiento.

ii) Uso de la enumeración MemorySaving

Aspose.PDF for .NET API admite la configuración del modo de ahorro de memoria mientras lee texto de un archivo PDF. La enumeración TextExtractionOptions.TextFormattingMode sirve para el consumo óptimo de recursos. Los siguientes pasos resumen los pasos que debe seguir para este enfoque:

  1. Cargar archivo PDF de origen
  2. Crear objeto TextDevice
  3. Establecer TextExtractionOptions
  4. Extraer texto y escribir texto en un archivo

El siguiente fragmento de código demuestra el enfoque de ahorro de memoria usando C#:

// Abrir documento
Document pdfDocument = new Document(dataDir + "Test.pdf");
System.Text.StringBuilder builder = new System.Text.StringBuilder();
// Cadena para contener el texto extraído
string extractedText = "";
foreach (Page pdfPage in pdfDocument.Pages)
{
    using (MemoryStream textStream = new MemoryStream())
    {
        // Crear dispositivo de texto
        TextDevice textDevice = new TextDevice();

        // Establecer opciones de extracción de texto: establecer el modo de extracción de texto (sin formato o puro)
        TextExtractionOptions textExtOptions = new
        TextExtractionOptions(TextExtractionOptions.TextFormattingMode.MemorySaving);
        textDevice.ExtractionOptions = textExtOptions;
        // Convierta una página en particular y guarde el texto en la secuencia
        textDevice.Process(pdfPage, textStream);
        // Convierta una página en particular y guarde el texto en la secuencia
        textDevice.Process(pdfDocument.Pages[1], textStream);
        // Cerrar flujo de memoria
        textStream.Close();
        // Obtener texto del flujo de memoria
        extractedText = Encoding.Unicode.GetString(textStream.ToArray());
    }
    builder.Append(extractedText);
}
dataDir = dataDir + "Memory_Text_Extracted.txt";
// Guarde el texto extraído en un archivo de texto
File.WriteAllText(dataDir, builder.ToString());

Conclusión

Hemos explorado algunos de los muchos casos de uso útiles en este artículo, hay infinitas posibilidades de extraer texto de documentos PDF usando C# con Aspose.PDF for .NET API. Puede obtener más información a través de la documentación de la API. En caso de cualquier consulta, comuníquese con nosotros en Foros de soporte gratuitos.

Ver también