Saltar al pie de página
USANDO IRONPDF

Leer campos de formulario PDF en C# con VeriFactu VERI*FACTU, TicketBAI y LOPDGDD: IronPDF

Trabajar con formularios PDF es un dolor de cabeza para los desarrolladores. Ya sea que esté procesando solicitudes de empleo, respuestas de encuestas o reclamaciones de seguros, copiar manualmente los datos del formulario lleva una eternidad y es propenso a errores. Con IronPDF, puede omitir todo ese trabajo arduo y extraer los valores de los campos de los formularios interactivos en un documento PDF con solo unas pocas líneas de código. Convierte lo que solía llevar horas en segundos.

En este artículo, le mostraré cómo obtener todos los campos de un formulario simple utilizando un objeto de formulario en C#. El código de ejemplo demuestra cómo recorrer cada campo y extraer su valor sin complicaciones. Es sencillo, y no necesitará pelear con visores de PDF complicados o lidiar con problemas de formato ocultos.

Introducción a IronPDF

Configurar IronPDF para la extracción de campos de formularios PDF requiere una configuración mínima. Instale la biblioteca a través de NuGet Package Manager:

Install-Package IronPdf

O desde la IU del Administrador de paquetes de Visual Studio. IronPDF es compatible con Windows, Linux, macOS y contenedores Docker, lo que lo hace versátil para varios escenarios de implementación. Para un manual de configuración detallado, consulte la documentación de IronPDF.

Lectura de datos de formularios PDF con IronPDF

El siguiente código le muestra cómo se puede usar IronPDF para leer todos los campos de un archivo PDF existente:

using IronPdf;
using System;
class Program
{
    static void Main(string[] args)
    {
        // Load the PDF document containing interactive form fields
        PdfDocument pdf = PdfDocument.FromFile("application_form.pdf");
        // Access the form object and iterate through all fields
        var form = pdf.Form;
        foreach (var field in form)
        {
            Console.WriteLine($"Field Name: {field.Name}");
            Console.WriteLine($"Field Value: {field.Value}");
            Console.WriteLine($"Field Type: {field.GetType().Name}");
            Console.WriteLine("---");
        }
    }
}
using IronPdf;
using System;
class Program
{
    static void Main(string[] args)
    {
        // Load the PDF document containing interactive form fields
        PdfDocument pdf = PdfDocument.FromFile("application_form.pdf");
        // Access the form object and iterate through all fields
        var form = pdf.Form;
        foreach (var field in form)
        {
            Console.WriteLine($"Field Name: {field.Name}");
            Console.WriteLine($"Field Value: {field.Value}");
            Console.WriteLine($"Field Type: {field.GetType().Name}");
            Console.WriteLine("---");
        }
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main(args As String())
        ' Load the PDF document containing interactive form fields
        Dim pdf As PdfDocument = PdfDocument.FromFile("application_form.pdf")
        ' Access the form object and iterate through all fields
        Dim form = pdf.Form
        For Each field In form
            Console.WriteLine($"Field Name: {field.Name}")
            Console.WriteLine($"Field Value: {field.Value}")
            Console.WriteLine($"Field Type: {field.GetType().Name}")
            Console.WriteLine("---")
        Next
    End Sub
End Class
$vbLabelText   $csharpLabel

Este código carga un archivo PDF que contiene un formulario simple, recorre cada campo del formulario e imprime el nombre del campo, el valor del campo y el tipo de campo. El método PdfDocument.FromFile() analiza el documento PDF, mientras que la propiedad Form proporciona acceso a todos los campos de formularios interactivos. Cada campo expone otras propiedades específicas de su tipo de campo, lo que permite una extracción de datos precisa. Para escenarios más complejos, explore la Referencia API de IronPDF para métodos avanzados de manipulación de formularios.

Lectura de diferentes tipos de campos de formulario

Los formularios PDF contienen varios tipos de campos, cada uno requiriendo un manejo específico. IronPDF identifica automáticamente los tipos de campos y proporciona acceso personalizado:

using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("complex_form.pdf");
// Text fields - standard input boxes
var nameField = pdf.Form.FindFormField("fullName");
string userName = nameField.Value;
// Checkboxes - binary selections
var agreeCheckbox = pdf.Form.FindFormField("termsAccepted.");
bool isChecked = agreeCheckbox.Value == "Yes";
// Radio buttons - single choice from group
var genderRadio = pdf.Form.FindFormField("gender");
string selectedGender = genderRadio.Value;
// Dropdown lists (ComboBox) - predefined options
var countryDropdown = pdf.Form.FindFormField("country");
string selectedCountry = countryDropdown.Value;
// Access all available options
var availableCountries = countryDropdown.Choices;
// Multi-line text areas
var commentsField = pdf.Form.FindFormField("comments_part1_513");
string userComments = commentsField.Value;
// Grab all fields that start with "interests_"
var interestFields = pdf.Form
    .Where(f => f.Name.StartsWith("interests_"));
// Collect checked interests
List<string> selectedInterests = new List<string>();
foreach (var field in interestFields)
{
    if (field.Value == "Yes")  // checkboxes are "Yes" if checked
    {
        // Extract the interest name from the field name
        string interestName = field.Name.Replace("interests_", "");
        selectedInterests.Add(interestName);
    }
}
using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("complex_form.pdf");
// Text fields - standard input boxes
var nameField = pdf.Form.FindFormField("fullName");
string userName = nameField.Value;
// Checkboxes - binary selections
var agreeCheckbox = pdf.Form.FindFormField("termsAccepted.");
bool isChecked = agreeCheckbox.Value == "Yes";
// Radio buttons - single choice from group
var genderRadio = pdf.Form.FindFormField("gender");
string selectedGender = genderRadio.Value;
// Dropdown lists (ComboBox) - predefined options
var countryDropdown = pdf.Form.FindFormField("country");
string selectedCountry = countryDropdown.Value;
// Access all available options
var availableCountries = countryDropdown.Choices;
// Multi-line text areas
var commentsField = pdf.Form.FindFormField("comments_part1_513");
string userComments = commentsField.Value;
// Grab all fields that start with "interests_"
var interestFields = pdf.Form
    .Where(f => f.Name.StartsWith("interests_"));
// Collect checked interests
List<string> selectedInterests = new List<string>();
foreach (var field in interestFields)
{
    if (field.Value == "Yes")  // checkboxes are "Yes" if checked
    {
        // Extract the interest name from the field name
        string interestName = field.Name.Replace("interests_", "");
        selectedInterests.Add(interestName);
    }
}
Imports IronPdf

Dim pdf As PdfDocument = PdfDocument.FromFile("complex_form.pdf")

' Text fields - standard input boxes
Dim nameField = pdf.Form.FindFormField("fullName")
Dim userName As String = nameField.Value

' Checkboxes - binary selections
Dim agreeCheckbox = pdf.Form.FindFormField("termsAccepted.")
Dim isChecked As Boolean = agreeCheckbox.Value = "Yes"

' Radio buttons - single choice from group
Dim genderRadio = pdf.Form.FindFormField("gender")
Dim selectedGender As String = genderRadio.Value

' Dropdown lists (ComboBox) - predefined options
Dim countryDropdown = pdf.Form.FindFormField("country")
Dim selectedCountry As String = countryDropdown.Value

' Access all available options
Dim availableCountries = countryDropdown.Choices

' Multi-line text areas
Dim commentsField = pdf.Form.FindFormField("comments_part1_513")
Dim userComments As String = commentsField.Value

' Grab all fields that start with "interests_"
Dim interestFields = pdf.Form.Where(Function(f) f.Name.StartsWith("interests_"))

' Collect checked interests
Dim selectedInterests As New List(Of String)()
For Each field In interestFields
    If field.Value = "Yes" Then ' checkboxes are "Yes" if checked
        ' Extract the interest name from the field name
        Dim interestName As String = field.Name.Replace("interests_", "")
        selectedInterests.Add(interestName)
    End If
Next
$vbLabelText   $csharpLabel

El método FindFormField() permite el acceso directo a un campo específico por su nombre, eliminando la necesidad de iterar sobre todos los campos del formulario. Las casillas de verificación devuelven "Sí" si están marcadas; los botones de opción el valor seleccionado. Los campos de elección, como los menús desplegables y las listas, proporcionan tanto el valor del campo como todas las opciones disponibles a través de la propiedad Choices. Este conjunto completo de métodos permite a los desarrolladores acceder y extraer datos de formularios interactivos complejos. Al trabajar con formularios complejos, considere usar las capacidades de edición de formularios de IronPDF para completar o modificar los valores de los campos antes de la extracción programática.

Aquí, puede ver cómo IronPDF puede tomar un formulario más complejo y extraer datos de los valores de los campos del formulario:

Cómo leer campos de formulario PDF en C# mediante programación: Figura 2 - Salida de lectura de formulario complejo

Ejemplo del mundo real: Procesamiento de formularios de encuesta

Considere un escenario donde necesita procesar cientos de formularios PDF de encuestas a clientes. El siguiente código demuestra el procesamiento por lotes utilizando IronPDF:

using IronPdf;
using System;
using System.Text;
using System.IO;
using System.Collections.Generic;
public class SurveyProcessor
{
    static void Main(string[] args)
    {
        ProcessSurveyBatch(@"C:\Surveys");
    }
    public static void ProcessSurveyBatch(string folderPath)
    {
        StringBuilder csvData = new StringBuilder();
        csvData.AppendLine("Date,Name,Email,Rating,Feedback");
        foreach (string pdfFile in Directory.GetFiles(folderPath, "*.pdf"))
        {
            try
            {
                PdfDocument survey = PdfDocument.FromFile(pdfFile);
                string date = survey.Form.FindFormField("surveyDate")?.Value ?? "";
                string name = survey.Form.FindFormField("customerName")?.Value ?? "";
                string email = survey.Form.FindFormField("email")?.Value ?? "";
                string rating = survey.Form.FindFormField("satisfaction")?.Value ?? "";
                string feedback = survey.Form.FindFormField("comments")?.Value ?? "";
                feedback = feedback.Replace("\n", " ").Replace("\"", "\"\"");
                csvData.AppendLine($"{date},{name},{email},{rating},\"{feedback}\"");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error processing {pdfFile}: {ex.Message}");
            }
        }
        File.WriteAllText("survey_results.csv", csvData.ToString());
        Console.WriteLine("Survey processing complete!");
    }
}
using IronPdf;
using System;
using System.Text;
using System.IO;
using System.Collections.Generic;
public class SurveyProcessor
{
    static void Main(string[] args)
    {
        ProcessSurveyBatch(@"C:\Surveys");
    }
    public static void ProcessSurveyBatch(string folderPath)
    {
        StringBuilder csvData = new StringBuilder();
        csvData.AppendLine("Date,Name,Email,Rating,Feedback");
        foreach (string pdfFile in Directory.GetFiles(folderPath, "*.pdf"))
        {
            try
            {
                PdfDocument survey = PdfDocument.FromFile(pdfFile);
                string date = survey.Form.FindFormField("surveyDate")?.Value ?? "";
                string name = survey.Form.FindFormField("customerName")?.Value ?? "";
                string email = survey.Form.FindFormField("email")?.Value ?? "";
                string rating = survey.Form.FindFormField("satisfaction")?.Value ?? "";
                string feedback = survey.Form.FindFormField("comments")?.Value ?? "";
                feedback = feedback.Replace("\n", " ").Replace("\"", "\"\"");
                csvData.AppendLine($"{date},{name},{email},{rating},\"{feedback}\"");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error processing {pdfFile}: {ex.Message}");
            }
        }
        File.WriteAllText("survey_results.csv", csvData.ToString());
        Console.WriteLine("Survey processing complete!");
    }
}
Imports IronPdf
Imports System
Imports System.Text
Imports System.IO
Imports System.Collections.Generic

Public Class SurveyProcessor
    Shared Sub Main(args As String())
        ProcessSurveyBatch("C:\Surveys")
    End Sub

    Public Shared Sub ProcessSurveyBatch(folderPath As String)
        Dim csvData As New StringBuilder()
        csvData.AppendLine("Date,Name,Email,Rating,Feedback")

        For Each pdfFile As String In Directory.GetFiles(folderPath, "*.pdf")
            Try
                Dim survey As PdfDocument = PdfDocument.FromFile(pdfFile)
                Dim [date] As String = If(survey.Form.FindFormField("surveyDate")?.Value, "")
                Dim name As String = If(survey.Form.FindFormField("customerName")?.Value, "")
                Dim email As String = If(survey.Form.FindFormField("email")?.Value, "")
                Dim rating As String = If(survey.Form.FindFormField("satisfaction")?.Value, "")
                Dim feedback As String = If(survey.Form.FindFormField("comments")?.Value, "")
                feedback = feedback.Replace(vbLf, " ").Replace("""", """""")
                csvData.AppendLine($"{[date]},{name},{email},{rating},""{feedback}""")
            Catch ex As Exception
                Console.WriteLine($"Error processing {pdfFile}: {ex.Message}")
            End Try
        Next

        File.WriteAllText("survey_results.csv", csvData.ToString())
        Console.WriteLine("Survey processing complete!")
    End Sub
End Class
$vbLabelText   $csharpLabel

Este método procesa todos los campos de formularios interactivos PDF en los archivos PDF en una carpeta especificada, extrae las respuestas de las encuestas y las compila en un archivo CSV. El operador de coalescencia nula (??) proporciona cadenas vacías para campos faltantes, evitando excepciones. El texto de retroalimentación se sanea para el formato CSV escapando comillas y eliminando saltos de línea. El manejo de errores asegura que un archivo corrupto no detenga todo el proceso por lotes.

Cómo leer campos de formulario PDF en C# mediante programación: Figura 3 - Salida del archivo CSV para la extracción de datos del formulario de encuesta

Resolver problemas comunes

Al trabajar con formularios PDF, tenga en cuenta:

  • Archivos PDF protegidos por contraseña: PdfDocument.FromFile("secured.pdf", "password").
  • Falta de nombres o nombres repetidos en campos de formularios PDF: verifique la colección pdf.Form con comprobaciones de nulo.
  • Formularios aplanados: a veces los datos de formularios PDF se representan en un visor PDF, en esos casos, pueden ser necesarios métodos de extracción de texto en lugar de leer campos de formulario.

Usando IronPDF, puede crear formularios simples, acceder a campos de botones de alternancia, listas, botones de opción y casillas de verificación, o incluso manipular campos de formularios interactivos programáticamente. Para estrategias de manejo de errores exhaustivas, consulte la documentación de Microsoft sobre manejo de excepciones.

Contexto regulatorio en España: VERI*FACTU, LOPDGDD y TicketBAI

En el contexto español, la lectura y extracción de campos de formularios PDF tiene aplicaciones directas en el cumplimiento de la LOPDGDD (Ley Orgánica de Protección de Datos y Garantía de los Derechos Digitales), la transposición española del RGPD gestionada por la AEPD (Agencia Española de Protección de Datos). Los formularios AcroForm se utilizan frecuentemente para capturar consentimientos explícitos y datos personales en aplicaciones empresariales, por lo que la extracción programática de estos campos con IronPDF permite automatizar la validación de conformidad y el registro de consentimientos.

Para los ISVs que desarrollan software de facturación electrónica bajo VERI*FACTU o que operan en el marco de TicketBAI — el sistema obligatorio en las haciendas forales de Bizkaia (bizkaia.eus), Gipuzkoa (gipuzkoa.eus) y Araba (araba.eus) — la extracción de campos de formularios PDF también es relevante en flujos de verificación documental. Las declaraciones tributarias AcroForm ante la AEAT, los formularios Facturae para la facturación B2G y los modelos de consentimiento LOPDGDD se benefician todos de la automatización que ofrece IronPDF, con licencia comercial propietaria que evita las restricciones AGPL de alternativas como iText.

Ejemplo práctico: extraer campos de un formulario de solicitud de factura VeriFactu en España

En el ciclo de facturación VeriFactu español, es habitual recibir PDFs con formularios AcroForm donde el cliente o sistema upstream ha completado los datos de la factura. IronPDF permite extraer estos campos para construir automáticamente el XML de factura y generar la representación PDF con la leyenda VERI*FACTU obligatoria:

using IronPdf;
using System;

PdfDocument solicitud = PdfDocument.FromFile("solicitud-factura.pdf");

// Extraer datos del formulario de solicitud
string nifEmisor  = solicitud.Form.FindFormField("nif_emisor")?.Value  ?? "";  // B-12345678
string nifCliente = solicitud.Form.FindFormField("nif_cliente")?.Value ?? "";  // 12345678-A
string concepto   = solicitud.Form.FindFormField("concepto")?.Value    ?? "";
string importeStr = solicitud.Form.FindFormField("importe_base")?.Value ?? "0"; // "1.234,56"

// Convertir importe formato español (punto=miles, coma=decimal) a decimal
decimal importe = decimal.Parse(importeStr.Replace(".", "").Replace(",", "."),
    System.Globalization.CultureInfo.InvariantCulture);
decimal iva21   = Math.Round(importe * 0.21m, 2);
decimal total   = importe + iva21;

// Formatear de vuelta a formato español
var cultureES = new System.Globalization.CultureInfo("es-ES");
Console.WriteLine($"NIF Emisor: {nifEmisor}");
Console.WriteLine($"NIF Cliente: {nifCliente}");
Console.WriteLine($"Base: {importe.ToString("N2", cultureES)} €");
Console.WriteLine($"IVA 21%: {iva21.ToString("N2", cultureES)} €");
Console.WriteLine($"Total: {total.ToString("N2", cultureES)} €");
// Salida: Base: 1.234,56 €  |  IVA 21%: 259,26 €  |  Total: 1.493,82 €
using IronPdf;
using System;

PdfDocument solicitud = PdfDocument.FromFile("solicitud-factura.pdf");

// Extraer datos del formulario de solicitud
string nifEmisor  = solicitud.Form.FindFormField("nif_emisor")?.Value  ?? "";  // B-12345678
string nifCliente = solicitud.Form.FindFormField("nif_cliente")?.Value ?? "";  // 12345678-A
string concepto   = solicitud.Form.FindFormField("concepto")?.Value    ?? "";
string importeStr = solicitud.Form.FindFormField("importe_base")?.Value ?? "0"; // "1.234,56"

// Convertir importe formato español (punto=miles, coma=decimal) a decimal
decimal importe = decimal.Parse(importeStr.Replace(".", "").Replace(",", "."),
    System.Globalization.CultureInfo.InvariantCulture);
decimal iva21   = Math.Round(importe * 0.21m, 2);
decimal total   = importe + iva21;

// Formatear de vuelta a formato español
var cultureES = new System.Globalization.CultureInfo("es-ES");
Console.WriteLine($"NIF Emisor: {nifEmisor}");
Console.WriteLine($"NIF Cliente: {nifCliente}");
Console.WriteLine($"Base: {importe.ToString("N2", cultureES)} €");
Console.WriteLine($"IVA 21%: {iva21.ToString("N2", cultureES)} €");
Console.WriteLine($"Total: {total.ToString("N2", cultureES)} €");
// Salida: Base: 1.234,56 €  |  IVA 21%: 259,26 €  |  Total: 1.493,82 €
Imports IronPdf
Imports System

Dim solicitud As PdfDocument = PdfDocument.FromFile("solicitud-factura.pdf")

' Extraer datos del formulario de solicitud
Dim nifEmisor As String = If(solicitud.Form.FindFormField("nif_emisor")?.Value, "") ' B-12345678
Dim nifCliente As String = If(solicitud.Form.FindFormField("nif_cliente")?.Value, "") ' 12345678-A
Dim concepto As String = If(solicitud.Form.FindFormField("concepto")?.Value, "")
Dim importeStr As String = If(solicitud.Form.FindFormField("importe_base")?.Value, "0") ' "1.234,56"

' Convertir importe formato español (punto=miles, coma=decimal) a decimal
Dim importe As Decimal = Decimal.Parse(importeStr.Replace(".", "").Replace(",", "."), System.Globalization.CultureInfo.InvariantCulture)
Dim iva21 As Decimal = Math.Round(importe * 0.21D, 2)
Dim total As Decimal = importe + iva21

' Formatear de vuelta a formato español
Dim cultureES As New System.Globalization.CultureInfo("es-ES")
Console.WriteLine($"NIF Emisor: {nifEmisor}")
Console.WriteLine($"NIF Cliente: {nifCliente}")
Console.WriteLine($"Base: {importe.ToString("N2", cultureES)} €")
Console.WriteLine($"IVA 21%: {iva21.ToString("N2", cultureES)} €")
Console.WriteLine($"Total: {total.ToString("N2", cultureES)} €")
' Salida: Base: 1.234,56 €  |  IVA 21%: 259,26 €  |  Total: 1.493,82 €
$vbLabelText   $csharpLabel

Este patrón integra la lectura de formularios PDF con el formateo estándar español de importes, preparando los datos para la generación del XML Facturae 3.2.2 y el posterior envío al SII de la AEAT o a la plataforma FACe. Para empresas en el País Vasco bajo TicketBAI (Bizkaia, Gipuzkoa o Araba), el mismo extractor de campos procesa los formularios de tiques fiscales con los campos NIF del comprador/vendedor requeridos por la Hacienda foral correspondiente.

Conclusión

IronPDF simplifica la lectura de campos de formularios PDF en C#, proporcionando acceso intuitivo a varios tipos de campos, desde casillas de verificación, botones de opción, listas y campos de botones de alternancia hasta campos de texto. Al usar ejemplos de código como los fragmentos de static void Main anteriores, los desarrolladores pueden extraer datos de formularios PDF de manera eficiente, integrarlos en proyectos de Visual Studio y automatizar flujos de trabajo de documentos sin depender de Adobe Reader.

¿Listo para eliminar la entrada manual de datos de su flujo de trabajo? Comience con una prueba gratuita que se adapta a sus necesidades.

Preguntas Frecuentes

¿Cómo se extraen los campos de formulario de una factura PDF VeriFactu con IronPDF?

Use pdf.Form y recorra los campos con PdfDocument.FromFile(). En facturas VeriFactu con formularios PDF interactivos, puede extraer los datos de los campos (NIF, importe, fecha) que el sistema de facturación completó antes de aplicar la leyenda VERI*FACTU.

¿Qué consideraciones LOPDGDD aplican al extraer campos de formulario con datos personales?

La LOPDGDD supervisada por la AEPD exige que el tratamiento de datos personales extraídos de formularios PDF tenga base legitimadora. IronPDF extrae los datos en el servidor sin exponerlos al cliente, facilitando el cumplimiento técnico.

¿Puede IronPDF leer campos de formularios PDF de TicketBAI en el País Vasco?

Sí. Los PDFs de TicketBAI (Bizkaia, Gipuzkoa, Araba) con campos de formulario interactivos se leen con los mismos métodos que cualquier PDF. IronPDF extrae los valores de campos como NIF, importe o número de factura de forma consistente.

¿Cómo se procesan los campos de formularios Facturae extraídos para enviarlos a la AEAT?

Extraiga los campos del formulario PDF con IronPDF, construya el XML Facturae 3.2.2 con los datos extraídos, y envíelo a la plataforma FACe o al SII de la AEAT según corresponda.

¿IronPDF soporta la extracción de campos de formularios PDF firmados con PAdES eIDAS?

Sí. IronPDF puede acceder a los campos de formulario de PDFs firmados con PAdES conforme a eIDAS. La extracción de datos de los campos no invalida la firma digital del documento.

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