Saltar al pie de página
USANDO IRONPDF

Leer datos de PDF en ASP.NET: Facturae, LOPDGDD y extracción de texto

IronPDF simplifica la extracción de datos PDF en ASP.NET Core al proporcionar métodos para leer texto, datos de formularios y tablas de archivos PDF utilizando código C# sencillo sin dependencias complejas ni análisis manual, con soporte para los requisitos de conformidad de la LOPDGDD y la extracción de facturas electrónicas Facturae.

Trabajar con archivos PDF en aplicaciones .NET puede ser más desafiante de lo que parece a primera vista. En el contexto español, los desarrolladores habitualmente necesitan extraer texto de facturas Facturae cargadas por clientes, recuperar datos de AcroForms de encuestas o contratos sometidos a retención bajo la LOPDGDD, o analizar tablas de informes para su integración en bases de datos. Muchos proyectos se ralentizan porque los desarrolladores recurren a bibliotecas demasiado complejas que requieren un código de análisis personalizado y extenso. IronPDF ofrece una alternativa sencilla que le permite leer y procesar documentos PDF con una configuración mínima.

Ya sea que esté manejando texto simple, campos de formulario interactivos o datos tabulares estructurados, la API de IronPDF le brinda acceso directo al contenido PDF sin análisis de bajo nivel. Esta guía explica cómo leer datos de archivos PDF en ASP.NET Core, cubriendo la extracción de texto, la recuperación de datos de formularios, el análisis de tablas y el manejo de carga de archivos asincrónica, todo con código C# que puede incorporar a su proyecto.

¿Cómo se configura IronPDF en un proyecto ASP.NET Core ?

Comenzar es sencillo. Instale el paquete NuGet de IronPDF desde NuGet Package Manager Console o desde .NET CLI utilizando cualquiera de estos comandos:

Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
SHELL

Una vez instalado el paquete, agregue el espacio de nombres IronPDF en la parte superior de cualquier archivo que funcione con documentos PDF:

using IronPdf;
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

Esa es toda la configuración necesaria para la mayoría de los proyectos. IronPDF no depende de procesos de renderizado externos ni de dependencias nativas adicionales en Windows. Para entornos Linux o Docker, consulte la documentación de IronPDF para obtener orientación específica de la plataforma.

Una licencia de prueba gratuita le permite probar el conjunto completo de funciones antes de comprometerse con el uso de producción. Puede obtener una licencia de prueba directamente desde el sitio de IronPDF y aplicarla en una sola línea de código antes de su primera operación de PDF.

¿Cómo extraer texto de un archivo PDF?

La extracción de texto es la tarea de lectura de PDF más común. IronPDF proporciona ExtractAllText para extraer todo el texto legible de un documento y ExtractTextFromPage para el acceso a nivel de página. Ambos métodos preservan el orden de lectura y manejan codificaciones de texto estándar, incluidas las codificaciones UTF-8 utilizadas en facturas Facturae y documentos PDF firmados con PAdES bajo el marco eIDAS.

// Load a PDF document from disk
var pdf = PdfDocument.FromFile("document.pdf");

// Extract all text from every page
string allText = pdf.ExtractAllText();

// Extract text from a specific page (zero-based index)
string pageOneText = pdf.ExtractTextFromPage(0);

Console.WriteLine(allText);
// Load a PDF document from disk
var pdf = PdfDocument.FromFile("document.pdf");

// Extract all text from every page
string allText = pdf.ExtractAllText();

// Extract text from a specific page (zero-based index)
string pageOneText = pdf.ExtractTextFromPage(0);

Console.WriteLine(allText);
Imports System

' Load a PDF document from disk
Dim pdf = PdfDocument.FromFile("document.pdf")

' Extract all text from every page
Dim allText As String = pdf.ExtractAllText()

' Extract text from a specific page (zero-based index)
Dim pageOneText As String = pdf.ExtractTextFromPage(0)

Console.WriteLine(allText)
$vbLabelText   $csharpLabel

ExtractAllText devuelve el contenido completo del texto como una sola cadena, conservando los saltos de línea. ExtractTextFromPage se dirige a una sola página utilizando un índice basado en cero, lo que resulta útil cuando sólo se necesita el contenido de una sección específica de un documento de varias páginas.

Para una mirada en profundidad a las opciones de extracción de texto e imágenes, la guía de extracción de texto de PDF cubre escenarios avanzados, incluida la extracción basada en regiones.

¿Cómo se conecta la extracción de texto a un controlador ASP.NET Core ?

La siguiente acción del controlador acepta un PDF cargado a través de IFormFile, lo lee en un MemoryStream y devuelve el texto extraído como JSON:

using IronPdf;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.IO;

[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
    [HttpPost("extract-text")]
    public IActionResult ExtractText(IFormFile pdfFile)
    {
        if (pdfFile == null || pdfFile.Length == 0)
            return BadRequest("No PDF file uploaded.");

        using var stream = new MemoryStream();
        pdfFile.CopyTo(stream);

        var pdf = new PdfDocument(stream.ToArray());
        string extractedText = pdf.ExtractAllText();

        return Ok(new { text = extractedText });
    }
}
using IronPdf;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.IO;

[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
    [HttpPost("extract-text")]
    public IActionResult ExtractText(IFormFile pdfFile)
    {
        if (pdfFile == null || pdfFile.Length == 0)
            return BadRequest("No PDF file uploaded.");

        using var stream = new MemoryStream();
        pdfFile.CopyTo(stream);

        var pdf = new PdfDocument(stream.ToArray());
        string extractedText = pdf.ExtractAllText();

        return Ok(new { text = extractedText });
    }
}
Imports IronPdf
Imports Microsoft.AspNetCore.Http
Imports Microsoft.AspNetCore.Mvc
Imports System.IO

<ApiController>
<Route("api/[controller]")>
Public Class PdfController
    Inherits ControllerBase

    <HttpPost("extract-text")>
    Public Function ExtractText(pdfFile As IFormFile) As IActionResult
        If pdfFile Is Nothing OrElse pdfFile.Length = 0 Then
            Return BadRequest("No PDF file uploaded.")
        End If

        Using stream As New MemoryStream()
            pdfFile.CopyTo(stream)

            Dim pdf As New PdfDocument(stream.ToArray())
            Dim extractedText As String = pdf.ExtractAllText()

            Return Ok(New With {.text = extractedText})
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

Este punto final convierte el archivo cargado en una matriz de bytes y lo pasa directamente a PdfDocument. No se escriben archivos temporales en el disco, lo que mantiene el código limpio y evita una sobrecarga de almacenamiento innecesaria. La interfaz IFormFile funciona de forma natural tanto con formularios multiparte como con clientes API como Postman.

¿Cómo leer datos de formularios PDF en ASP.NET Core?

Los formularios PDF, también llamados AcroForms , contienen campos interactivos que los usuarios completan. IronPDF expone los campos de formulario a través de la propiedad Form de PdfDocument, proporcionándole el nombre y el valor de cada campo del documento.

Cuando los formularios PDF recopilan datos personales de ciudadanos o clientes en España, el tratamiento de esos datos queda sujeto a la LOPDGDD (Ley Orgánica de Protección de Datos y Garantía de Derechos Digitales) y a la supervisión de la AEPD (Agencia Española de Protección de Datos). Antes de almacenar o procesar los valores extraídos de los formularios, asegúrese de contar con la base legitimadora adecuada (consentimiento, contrato, obligación legal) y de haber informado al usuario según los artículos 13 y 14 del RGPD con transposición española.

El siguiente punto final lee un formulario PDF cargado y devuelve todos los valores de campo como un diccionario JSON:

[HttpPost("extract-form")]
public IActionResult ExtractForm([FromForm] IFormFile pdfFile)
{
    if (pdfFile == null || pdfFile.Length == 0)
        return BadRequest("No PDF file uploaded.");

    using var stream = new MemoryStream();
    pdfFile.CopyTo(stream);

    var pdf = new PdfDocument(stream.ToArray());
    var formData = new Dictionary<string, string>();

    if (pdf.Form != null)
    {
        foreach (var field in pdf.Form)
        {
            formData[field.Name] = field.Value;
        }
    }

    return Ok(new { formFields = formData });
}
[HttpPost("extract-form")]
public IActionResult ExtractForm([FromForm] IFormFile pdfFile)
{
    if (pdfFile == null || pdfFile.Length == 0)
        return BadRequest("No PDF file uploaded.");

    using var stream = new MemoryStream();
    pdfFile.CopyTo(stream);

    var pdf = new PdfDocument(stream.ToArray());
    var formData = new Dictionary<string, string>();

    if (pdf.Form != null)
    {
        foreach (var field in pdf.Form)
        {
            formData[field.Name] = field.Value;
        }
    }

    return Ok(new { formFields = formData });
}
Imports Microsoft.AspNetCore.Mvc
Imports System.IO

<HttpPost("extract-form")>
Public Function ExtractForm(<FromForm> pdfFile As IFormFile) As IActionResult
    If pdfFile Is Nothing OrElse pdfFile.Length = 0 Then
        Return BadRequest("No PDF file uploaded.")
    End If

    Using stream As New MemoryStream()
        pdfFile.CopyTo(stream)

        Dim pdf = New PdfDocument(stream.ToArray())
        Dim formData As New Dictionary(Of String, String)()

        If pdf.Form IsNot Nothing Then
            For Each field In pdf.Form
                formData(field.Name) = field.Value
            Next
        End If

        Return Ok(New With {.formFields = formData})
    End Using
End Function
$vbLabelText   $csharpLabel

Cada campo de pdf.Form tiene una propiedad Name (el identificador de campo establecido en la herramienta de creación de PDF) y una propiedad Value (el texto o la selección que ha introducido el usuario). En esta colección aparecen cuadros de texto, casillas de verificación, botones de opción y menús desplegables.

La respuesta JSON facilita el reenvío de envíos de formularios a una base de datos, una API de terceros o una cola de mensajes sin ningún análisis adicional. Para los flujos de trabajo que implican la creación o edición de formularios PDF mediante programación, la guía de formularios PDF muestra cómo agregar campos y completar previamente valores.

¿Cómo es una respuesta típica de extracción de formulario?

Respuesta de API que muestra datos JSON extraídos de un formulario PDF con los campos Nombre, Correo electrónico y Dirección mostrados en la interfaz de pruebas de Postman con el estado 200 OK

La respuesta anterior muestra un resultado 200 OK que contiene los nombres de campo y los valores de un formulario de contacto de muestra en PDF. La estructura es un mapa clave-valor plano, que se asigna limpiamente a la mayoría de los esquemas de bases de datos o cargas útiles REST.

¿Cómo extraer datos de una tabla de un PDF?

Las tablas en archivos PDF se almacenan como texto posicionado: no existe una estructura de datos de tabla nativa en el formato PDF. Por lo tanto, extraer datos tabulares significa extraer el texto sin procesar y luego aplicar lógica de análisis para reconstruir filas y columnas.

Un escenario especialmente relevante en España es la extracción de datos de facturas en formato Facturae XML embebido en PDF/A-3, o de los valores de líneas de producto en facturas PDF generadas por software de facturación bajo VeriFactu. En estos casos, la extracción de texto estructurado puede alimentar directamente los sistemas de conciliación contable integrados con SAP o Microsoft Dynamics 365 Spain localization.

El ExtractAllText de IronPDF conserva los espacios en blanco y los caracteres de tabulación, lo que permite dividir líneas en columnas mediante programación. La siguiente acción del controlador demuestra este enfoque:

[HttpPost("extract-table")]
public IActionResult ExtractTable([FromForm] IFormFile pdfFile)
{
    if (pdfFile == null || pdfFile.Length == 0)
        return BadRequest("No PDF file uploaded.");

    using var memoryStream = new MemoryStream();
    pdfFile.CopyTo(memoryStream);

    var pdf = new PdfDocument(memoryStream.ToArray());
    string text = pdf.ExtractAllText();

    // Split into lines, then split each line into columns
    string[] lines = text.Split(
        new[] { '\r', '\n' },
        StringSplitOptions.RemoveEmptyEntries
    );

    var tableData = new List<string[]>();
    foreach (string line in lines)
    {
        string[] columns = line
            .Split('\t')
            .Where(c => !string.IsNullOrWhiteSpace(c))
            .ToArray();

        if (columns.Length > 0)
            tableData.Add(columns);
    }

    var table = tableData.Select(r => string.Join(" | ", r)).ToList();
    return Ok(new { Table = table });
}
[HttpPost("extract-table")]
public IActionResult ExtractTable([FromForm] IFormFile pdfFile)
{
    if (pdfFile == null || pdfFile.Length == 0)
        return BadRequest("No PDF file uploaded.");

    using var memoryStream = new MemoryStream();
    pdfFile.CopyTo(memoryStream);

    var pdf = new PdfDocument(memoryStream.ToArray());
    string text = pdf.ExtractAllText();

    // Split into lines, then split each line into columns
    string[] lines = text.Split(
        new[] { '\r', '\n' },
        StringSplitOptions.RemoveEmptyEntries
    );

    var tableData = new List<string[]>();
    foreach (string line in lines)
    {
        string[] columns = line
            .Split('\t')
            .Where(c => !string.IsNullOrWhiteSpace(c))
            .ToArray();

        if (columns.Length > 0)
            tableData.Add(columns);
    }

    var table = tableData.Select(r => string.Join(" | ", r)).ToList();
    return Ok(new { Table = table });
}
Imports Microsoft.AspNetCore.Mvc
Imports System.IO
Imports System.Linq

<HttpPost("extract-table")>
Public Function ExtractTable(<FromForm> pdfFile As IFormFile) As IActionResult
    If pdfFile Is Nothing OrElse pdfFile.Length = 0 Then
        Return BadRequest("No PDF file uploaded.")
    End If

    Using memoryStream As New MemoryStream()
        pdfFile.CopyTo(memoryStream)

        Dim pdf As New PdfDocument(memoryStream.ToArray())
        Dim text As String = pdf.ExtractAllText()

        ' Split into lines, then split each line into columns
        Dim lines As String() = text.Split(New Char() {ControlChars.Cr, ControlChars.Lf}, StringSplitOptions.RemoveEmptyEntries)

        Dim tableData As New List(Of String())()
        For Each line As String In lines
            Dim columns As String() = line.Split(ControlChars.Tab).Where(Function(c) Not String.IsNullOrWhiteSpace(c)).ToArray()

            If columns.Length > 0 Then
                tableData.Add(columns)
            End If
        Next

        Dim table = tableData.Select(Function(r) String.Join(" | ", r)).ToList()
        Return Ok(New With {.Table = table})
    End Using
End Function
$vbLabelText   $csharpLabel

Este enfoque funciona bien para archivos PDF cuyas tablas utilizan columnas consistentes separadas por tabulaciones. Para los documentos en los que las columnas están separadas por espacios variables, es posible que deba aplicar una heurística de espacio mínimo o inspeccionar las posiciones de los caracteres. La guía para fusionar o dividir archivos PDF es útil cuando necesita aislar páginas específicas que contienen tablas antes de la extracción.

Ejemplo práctico: extracción de datos fiscales de una factura española con AEAT QR y VERI*FACTU

En el contexto de la AEAT y el régimen VeriFactu, una factura electrónica española en PDF puede contener los siguientes campos estructurados que el sistema receptor necesita extraer y validar:

  • NIF del emisor: p.ej. B87654321 (empresa) o 12345678Z (autónomo)
  • NIF/CIF del receptor: p.ej. A28015834
  • Número de factura: p.ej. 2026-0042
  • Base imponible: p.ej. 1.500,00 EUR
  • Tipo y cuota de IVA: p.ej. 21% → 315,00 EUR
  • Total factura: p.ej. 1.815,00 EUR
  • IBAN de domiciliación: p.ej. ES91 2100 0418 4502 0005 1332
  • Leyenda: VERI*FACTU en el pie de página

El siguiente fragmento C# demuestra cómo extraer y parsear estos campos mediante IronPDF para un flujo de validación conforme con el SII (Suministro Inmediato de Información) de la AEAT:

using IronPdf;
using System.Text.RegularExpressions;

public class FacturaEspanolaParser
{
    public DatosFactura ExtraerCamposFiscales(byte[] pdfBytes)
    {
        using var pdf = new PdfDocument(pdfBytes);
        string texto = pdf.ExtractAllText();

        // Extraer NIF/CIF (formato español: letra+7 dígitos+letra o 8 dígitos+letra)
        var nifEmisor = Regex.Match(texto, @"(?:NIF|CIF)[:\s]+([A-Z]\d{7}[A-Z0-9]|\d{8}[A-Z])");

        // Extraer número de factura
        var numFactura = Regex.Match(texto, @"(?:Factura|N[uú]mero)[:\s#]+(\d{4}-\d{4})");

        // Extraer total en EUR (formato español: 1.815,00 EUR)
        var totalEur = Regex.Match(texto, @"TOTAL[:\s]+(\d{1,3}(?:\.\d{3})*,\d{2})\s*EUR");

        // Extraer IBAN (formato ES: ES + 22 dígitos)
        var iban = Regex.Match(texto, @"ES\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}");

        // Verificar presencia de la leyenda VERI*FACTU (obligatoria bajo RD 1007/2023)
        bool tieneVeriFactu = texto.Contains("VERI*FACTU") || texto.Contains("VERIFACTU");

        return new DatosFactura
        {
            NifEmisor = nifEmisor.Success ? nifEmisor.Groups[1].Value : null,
            NumeroFactura = numFactura.Success ? numFactura.Groups[1].Value : null,
            TotalEur = totalEur.Success ? totalEur.Groups[1].Value : null,
            Iban = iban.Success ? iban.Value.Replace(" ", "") : null,
            CumpleVeriFactu = tieneVeriFactu
        };
    }
}

public record DatosFactura(
    string? NifEmisor,
    string? NumeroFactura,
    string? TotalEur,
    string? Iban,
    bool CumpleVeriFactu
);
using IronPdf;
using System.Text.RegularExpressions;

public class FacturaEspanolaParser
{
    public DatosFactura ExtraerCamposFiscales(byte[] pdfBytes)
    {
        using var pdf = new PdfDocument(pdfBytes);
        string texto = pdf.ExtractAllText();

        // Extraer NIF/CIF (formato español: letra+7 dígitos+letra o 8 dígitos+letra)
        var nifEmisor = Regex.Match(texto, @"(?:NIF|CIF)[:\s]+([A-Z]\d{7}[A-Z0-9]|\d{8}[A-Z])");

        // Extraer número de factura
        var numFactura = Regex.Match(texto, @"(?:Factura|N[uú]mero)[:\s#]+(\d{4}-\d{4})");

        // Extraer total en EUR (formato español: 1.815,00 EUR)
        var totalEur = Regex.Match(texto, @"TOTAL[:\s]+(\d{1,3}(?:\.\d{3})*,\d{2})\s*EUR");

        // Extraer IBAN (formato ES: ES + 22 dígitos)
        var iban = Regex.Match(texto, @"ES\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}");

        // Verificar presencia de la leyenda VERI*FACTU (obligatoria bajo RD 1007/2023)
        bool tieneVeriFactu = texto.Contains("VERI*FACTU") || texto.Contains("VERIFACTU");

        return new DatosFactura
        {
            NifEmisor = nifEmisor.Success ? nifEmisor.Groups[1].Value : null,
            NumeroFactura = numFactura.Success ? numFactura.Groups[1].Value : null,
            TotalEur = totalEur.Success ? totalEur.Groups[1].Value : null,
            Iban = iban.Success ? iban.Value.Replace(" ", "") : null,
            CumpleVeriFactu = tieneVeriFactu
        };
    }
}

public record DatosFactura(
    string? NifEmisor,
    string? NumeroFactura,
    string? TotalEur,
    string? Iban,
    bool CumpleVeriFactu
);
Imports IronPdf
Imports System.Text.RegularExpressions

Public Class FacturaEspanolaParser
    Public Function ExtraerCamposFiscales(pdfBytes As Byte()) As DatosFactura
        Using pdf = New PdfDocument(pdfBytes)
            Dim texto As String = pdf.ExtractAllText()

            ' Extraer NIF/CIF (formato español: letra+7 dígitos+letra o 8 dígitos+letra)
            Dim nifEmisor = Regex.Match(texto, "(?:NIF|CIF)[:\s]+([A-Z]\d{7}[A-Z0-9]|\d{8}[A-Z])")

            ' Extraer número de factura
            Dim numFactura = Regex.Match(texto, "(?:Factura|N[uú]mero)[:\s#]+(\d{4}-\d{4})")

            ' Extraer total en EUR (formato español: 1.815,00 EUR)
            Dim totalEur = Regex.Match(texto, "TOTAL[:\s]+(\d{1,3}(?:\.\d{3})*,\d{2})\s*EUR")

            ' Extraer IBAN (formato ES: ES + 22 dígitos)
            Dim iban = Regex.Match(texto, "ES\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}")

            ' Verificar presencia de la leyenda VERI*FACTU (obligatoria bajo RD 1007/2023)
            Dim tieneVeriFactu As Boolean = texto.Contains("VERI*FACTU") OrElse texto.Contains("VERIFACTU")

            Return New DatosFactura(
                If(nifEmisor.Success, nifEmisor.Groups(1).Value, Nothing),
                If(numFactura.Success, numFactura.Groups(1).Value, Nothing),
                If(totalEur.Success, totalEur.Groups(1).Value, Nothing),
                If(iban.Success, iban.Value.Replace(" ", ""), Nothing),
                tieneVeriFactu
            )
        End Using
    End Function
End Class

Public Class DatosFactura
    Public Property NifEmisor As String
    Public Property NumeroFactura As String
    Public Property TotalEur As String
    Public Property Iban As String
    Public Property CumpleVeriFactu As Boolean

    Public Sub New(nifEmisor As String, numeroFactura As String, totalEur As String, iban As String, cumpleVeriFactu As Boolean)
        Me.NifEmisor = nifEmisor
        Me.NumeroFactura = numeroFactura
        Me.TotalEur = totalEur
        Me.Iban = iban
        Me.CumpleVeriFactu = cumpleVeriFactu
    End Sub
End Class
$vbLabelText   $csharpLabel

Este patrón de extracción es especialmente útil en flujos de ingesta documental conforme a Crea y Crece y a la obligación de facturación electrónica B2B que entrará en vigor a partir de 2027. Los datos extraídos — NIF, IBAN, importes en EUR — pueden alimentarse directamente al pipeline de envío al SII de la AEAT o a sistemas de conciliación contable con localización española.

¿Cuándo se deben analizar las tablas manualmente?

Respuesta de API que muestra datos de factura estructurados extraídos de PDF, incluidos detalles del cliente, metadatos de factura y productos detallados con precios en formato JSON

El análisis manual es la opción correcta cuando el PDF no se generó a partir de HTML o de una fuente de datos estructurados (por ejemplo, facturas escaneadas o documentos creados en herramientas de autoedición). El método de división de pestañas maneja muchos archivos PDF estándar de manera confiable. Cuando los límites de las columnas son irregulares, puedes refinar la lógica inspeccionando las coordenadas de los caracteres sin procesar a través de la API de acceso DOM de IronPDF.

Para los documentos generados a partir de HTML, considere realizar un viaje de ida y vuelta a través de un intermediario HTML. Generar su PDF a partir de una plantilla HTML basada en datos (cubierto en la guía de cadena HTML a PDF ) significa que las posiciones del texto serán predecibles y la extracción será sencilla.

¿Cómo gestionar las cargas asincrónicas de archivos PDF?

Las aplicaciones ASP.NET Core de producción deben manejar las cargas de archivos de forma asincrónica para evitar bloquear el grupo de subprocesos. El método IFormFile.CopyToAsync combinado con async/await mantiene el controlador sin bloqueo:

[HttpPost("process-upload")]
public async Task<IActionResult> ProcessPdf([FromForm] IFormFile file)
{
    if (file == null || file.Length == 0)
        return BadRequest("No PDF file uploaded.");

    using var ms = new MemoryStream();
    await file.CopyToAsync(ms);

    var pdf = new PdfDocument(ms.ToArray());
    string text = pdf.ExtractAllText();
    int pageCount = pdf.PageCount;

    return Ok(new
    {
        text,
        pages = pageCount
    });
}
[HttpPost("process-upload")]
public async Task<IActionResult> ProcessPdf([FromForm] IFormFile file)
{
    if (file == null || file.Length == 0)
        return BadRequest("No PDF file uploaded.");

    using var ms = new MemoryStream();
    await file.CopyToAsync(ms);

    var pdf = new PdfDocument(ms.ToArray());
    string text = pdf.ExtractAllText();
    int pageCount = pdf.PageCount;

    return Ok(new
    {
        text,
        pages = pageCount
    });
}
Imports System.IO
Imports Microsoft.AspNetCore.Mvc

<HttpPost("process-upload")>
Public Async Function ProcessPdf(<FromForm> file As IFormFile) As Task(Of IActionResult)
    If file Is Nothing OrElse file.Length = 0 Then
        Return BadRequest("No PDF file uploaded.")
    End If

    Using ms As New MemoryStream()
        Await file.CopyToAsync(ms)

        Dim pdf As New PdfDocument(ms.ToArray())
        Dim text As String = pdf.ExtractAllText()
        Dim pageCount As Integer = pdf.PageCount

        Return Ok(New With {
            .text = text,
            .pages = pageCount
        })
    End Using
End Function
$vbLabelText   $csharpLabel

El constructor PdfDocument es síncrono, pero el paso de carga -a menudo la parte más lenta del proceso- se ejecuta de forma asíncrona. Este patrón escala bien bajo carga concurrente y es compatible con puntos finales de API mínimos, controladores de Razor Pages y servicios gRPC.

¿Cómo limitar el tamaño de los archivos que se suben?

ASP.NET Core aplica un límite de tamaño de cuerpo de solicitud predeterminado de 30 MB. Para PDF más grandes, aumente el límite en Program.cs:

builder.Services.Configure<FormOptions>(options =>
{
    options.MultipartBodyLengthLimit = 100 * 1024 * 1024; // 100 MB
});
builder.Services.Configure<FormOptions>(options =>
{
    options.MultipartBodyLengthLimit = 100 * 1024 * 1024; // 100 MB
});
Imports Microsoft.Extensions.DependencyInjection
Imports Microsoft.AspNetCore.Http

builder.Services.Configure(Of FormOptions)(Sub(options)
    options.MultipartBodyLengthLimit = 100 * 1024 * 1024 ' 100 MB
End Sub)
$vbLabelText   $csharpLabel

Kestrel tiene su propio límite que posiblemente también debas aumentar:

builder.WebHost.ConfigureKestrel(options =>
{
    options.Limits.MaxRequestBodySize = 100 * 1024 * 1024;
});
builder.WebHost.ConfigureKestrel(options =>
{
    options.Limits.MaxRequestBodySize = 100 * 1024 * 1024;
});
builder.WebHost.ConfigureKestrel(Sub(options)
    options.Limits.MaxRequestBodySize = 100 * 1024 * 1024
End Sub)
$vbLabelText   $csharpLabel

Establezca estos valores en función del tamaño máximo realista de los archivos PDF que procesará su aplicación. Siempre valide el tipo MIME y la extensión del archivo cargado antes de pasarlo a IronPDF para protegerse contra entradas inesperadas.

¿Cómo convertir contenido PDF extraído a otros formatos?

Una vez que tenga datos de texto o formulario, puede canalizarlos a cualquier proceso posterior que requiera su aplicación: escrituras en bases de datos, indexación de búsqueda, generación de informes o llamadas API. IronPDF también admite la conversión en la otra dirección: renderizar HTML a PDF.

Para los casos en los que desee mostrar contenido extraído visualmente, puede renderizar el PDF original como imágenes utilizando la guía de conversión de PDF a imagen . Esto es útil para las funciones de vista previa de documentos donde desea mostrar miniaturas de páginas sin cargar el PDF completo en el navegador.

Si necesita proteger los documentos de salida antes de entregarlos a los usuarios, IronPDF admite firmas digitales compatibles con el estándar PAdES bajo eIDAS y marcas de agua como pasos de posprocesamiento. Agregar encabezados y pies de página (que se explica en la guía de encabezados y pies de página ) es igualmente sencillo.

Escenarios comunes de extracción de datos PDF y métodos IronPDF recomendados
Guión Método/propiedad IronPDF Notas
Extraer todo el texto de la página pdf.ExtractAllText() Devuelve el texto completo del documento en orden de lectura
Extraer texto de una página pdf.ExtractTextFromPage(n) Índice de página basado en cero
Leer campos de AcroForm pdf.Form Enumerar field.Name y field.Value
Analizar filas de la tabla ExtractAllText() + lógica dividida División en tabulaciones o espacios en blanco
Contar páginas pdf.PageCount Útil para paginación y validación.
Cargar desde una matriz de bytes nuevo PdfDocument(bytes) No se requieren archivos temporales
Cargar desde la ruta del archivo PdfDocument.FromFile(path) Para el acceso a archivos del lado del servidor

¿Cuáles son los siguientes pasos después de configurar la extracción de datos PDF?

Ahora tiene patrones de trabajo para extracción de texto, lectura de datos de formularios, análisis de tablas y cargas asincrónicas. A continuación se presentan algunas direcciones que puede explorar a continuación en función de los requisitos de su aplicación.

Para los ISV españoles de software de facturación, la extracción de texto es el primer paso de un flujo de trabajo que puede incluir la validación de la leyenda VERI*FACTU en facturas visualizadas, la verificación del enlace QR de la AEAT (Factura verificable en la sede electrónica de la AEAT) o la conciliación de datos con el sistema SII (Suministro Inmediato de Información) de la AEAT. IronPDF facilita estos flujos sin las restricciones de la licencia AGPL de iText, que puede comprometer la distribución de software propietario.

Si necesita generar informes en PDF junto con su flujo de trabajo de extracción, la descripción general de las características de IronPDF cubre la representación de HTML a PDF, las superposiciones de sellos y la manipulación de páginas. Para las aplicaciones que fusionan informes de múltiples fuentes, la guía de fusión o división de PDF explica cómo combinar y dividir documentos.

Para una entrega segura de documentos, las firmas digitales le permiten certificar los PDF con firmas PAdES antes de enviarlos a los clientes bajo el marco eIDAS. Las marcas de agua personalizadas agregan marca visual o etiquetas de borrador a los documentos generados.

Si su proyecto extrae datos de PDF escaneados (imágenes en lugar de texto que permita búsquedas), necesitará un paso de OCR antes de llamar a ExtractAllText. IronOCR de Iron Software se integra con IronPDF para gestionar flujos de trabajo de documentos escaneados, con soporte de idioma español incluyendo caracteres acentuados (á, é, í, ó, ú, ñ) y texto en catalán o euskera.

IronPDF está disponible bajo opciones de licencia flexibles para desarrolladores individuales y equipos. Comience con una prueba gratuita para probar todas las funciones sin restricciones. La documentación completa incluye referencia de API, guías de inicio y notas de implementación para entornos de Windows, Linux, Docker y la nube.

La lectura de datos de archivos PDF en ASP.NET Core ya no requiere código de análisis de bajo nivel ni dependencias pesadas. Con IronPDF, la ruta desde el archivo cargado hasta el contenido extraído es un puñado de líneas que se adaptan naturalmente a cualquier controlador o capa de servicio, cumpliendo al mismo tiempo los requisitos de la LOPDGDD y los flujos de trabajo de facturación electrónica bajo la normativa española.

Preguntas Frecuentes

¿Qué desafíos pueden surgir al trabajar con archivos PDF en aplicaciones .NET Core?

Trabajar con archivos PDF en .NET Core puede ser complicado debido a la necesidad de extraer texto, obtener datos de formularios o analizar tablas sin bibliotecas excesivamente complejas.

¿Cómo puede IronPDF ayudar a simplificar la lectura de datos de archivos PDF en ASP.NET?

IronPDF simplifica la lectura y procesamiento de documentos PDF al eliminar la necesidad de dependencias complicadas o un extenso código de análisis personalizado.

¿Por qué es importante evitar bibliotecas demasiadas complejas al manejar PDFs?

Usar bibliotecas excesivamente complejas puede ralentizar los proyectos e incrementar el tiempo de desarrollo, mientras que soluciones más simples como IronPDF agilizan el proceso.

¿Qué tipos de datos puede IronPDF extraer de archivos PDF?

IronPDF puede extraer texto, datos de formularios y tablas de archivos PDF, haciéndolo versátil para diversas necesidades de gestión de datos.

¿Puede IronPDF ser utilizado para procesar facturas subidas en aplicaciones ASP.NET?

Sí, IronPDF puede leer y procesar eficientemente texto de facturas subidas en aplicaciones ASP.NET.

¿Es necesario escribir código de análisis personalizado al usar IronPDF?

No, IronPDF le permite procesar documentos PDF sin la necesidad de un extenso código de análisis personalizado.

¿Cuáles son los beneficios de usar IronPDF en aplicaciones .NET Core?

IronPDF proporciona una forma directa de leer y procesar archivos PDF, mejorando las capacidades de gestión de datos sin dependencias complejas.

.NET 10: ¿IronPDF es totalmente compatible con él?

Sí. IronPDF está diseñado para ser totalmente compatible con .NET 10 (así como con .NET 9, 8, 7, 6, 5, Core, Standard y Framework 4.6.2+), lo que garantiza que pueda ejecutar todas sus funciones de lectura y escritura de PDF sin soluciones alternativas especiales en la última plataforma .NET.

¿Cómo cumple IronPDF con la LOPDGDD cuando se extraen datos de formularios PDF con datos personales?

Cuando se extraen datos personales de formularios PDF en España, la LOPDGDD exige que el tratamiento tenga una base legitimadora adecuada (consentimiento, contrato u obligación legal) y que se haya informado al usuario según los artículos 13 y 14 del RGPD. IronPDF facilita el cumplimiento técnico mediante procesamiento del lado del servidor (los datos no se exponen en el cliente), transmisión cifrada y capacidad de auditoría, pero la responsabilidad de la base legitimadora recae en el responsable del tratamiento, supervisado por la AEPD.

¿Puede IronPDF extraer texto de facturas electrónicas Facturae en España?

Sí. IronPDF puede extraer el texto de facturas en formato PDF (incluidas las generadas bajo VeriFactu) y también procesar los metadatos de documentos PDF/A-3 con Facturae XML embebido. Esta capacidad es útil para flujos de trabajo de conciliación contable integrados con SAP Spain localization o Microsoft Dynamics 365, donde los datos de líneas de factura extraídos alimentan directamente el sistema ERP.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame