Saltar al pie de página
USANDO IRONPDF

Firma PDF .NET para España: XAdES (TicketBAI), PAdES-LTV (LOPDGDD) y eIDAS con FNMT | IronPDF

Los tres regímenes de firma electrónica en España que debe conocer todo ISV

España es el único país de la Unión Europea donde los ISV que desarrollan software de facturación gestionan simultáneamente tres regímenes de firma electrónica con marcos normativos distintos, organismos supervisores diferentes y plazos de cumplimiento propios. Comprenderlos es imprescindible antes de elegir una biblioteca de firma PDF.

Régimen 1: XAdES para TicketBAI (País Vasco)

TicketBAI es el sistema de facturación electrónica obligatorio en el País Vasco, gestionado por tres haciendas forales con implementaciones distintas:

  • Bizkaia (bizkaia.eus): sistema BATUZ, XAdES obligatorio sobre el registro de facturación. Implantación por sectores desde 2022.
  • Gipuzkoa (gipuzkoa.eus): XAdES sobre el bloque XML <TicketBAI>. Plazos de implantación escalonados por tipo de empresa.
  • Araba (araba.eus): tercer esquema foral con variantes en los campos XML del registro TicketBAI.

XAdES (XML Advanced Electronic Signatures) es la firma de documentos XML —los registros TicketBAI son XMLs firmados—. IronPDF proporciona la firma PAdES del PDF de visualización que se entrega al receptor; la firma XAdES del XML TicketBAI la implementa el motor de negocio del ISV.

Régimen 2: PAdES-LTV para archivo bajo LOPDGDD

La LOPDGDD (Ley Orgánica de Protección de Datos y Garantía de Derechos Digitales), supervisada por la AEPD (Agencia Española de Protección de Datos), exige que los documentos con datos personales archivados durante años mantengan la validez jurídica de su firma electrónica.

PAdES-LTV (PDF Advanced Electronic Signatures — Long-Term Validation) incrusta los datos OCSP y CRL necesarios para que la firma sea verificable incluso cuando el certificado original haya caducado. Sin PAdES-LTV, un documento firmado cuyo certificado ha expirado no puede validarse con garantías jurídicas —lo que compromete su valor probatorio en procesos legales o auditorías posteriores al archivo.

Régimen 3: Firmas cualificadas eIDAS mediante FNMT

El reglamento europeo eIDAS establece tres niveles de firma electrónica. Para documentos de alto valor jurídico —contratos mercantiles, escrituras notariales, documentación regulatoria, licencias de actividad— se requieren firmas cualificadas emitidas por prestadores de confianza cualificados (TSP).

En España, la FNMT (Fábrica Nacional de Moneda y Timbre) es el principal emisor de certificados cualificados tanto para personas físicas (DNIe, certificados CERES) como para personas jurídicas (certificados de representante). Los certificados FNMT se exportan como ficheros PFX/P12 y son compatibles con IronPDF.


Instalación de IronPDF para firma de PDFs en .NET

Install-Package IronPdf

Seleccione .NET 8.0 (LTS) para nuevos proyectos:

Cómo crear una firma PDF en .NET, Figura 2: Crear un nuevo proyecto en Visual Studio Crear un nuevo proyecto en Visual Studio

Cómo crear una firma PDF en .NET, Figura 3: Configure su nuevo proyecto Configurar el nuevo proyecto

Cómo crear una firma PDF en .NET, Figura 4: Selección de .NET Framework Selección del framework .NET

Cómo crear una firma PDF en .NET, Figura 5: Navegue e instale el paquete IronPDF en la interfaz de usuario del Administrador de paquetes NuGet Instalar el paquete IronPDF en el Administrador de Paquetes NuGet


Firma PAdES con certificado FNMT: flujo VeriFactu completo

El flujo de trabajo completo para una factura conforme con VeriFactu combina el motor de negocio del ISV (huella encadenada, QR AEAT) con IronPDF (generación del PDF y firma PAdES):

using IronPdf;
using IronPdf.Signing;

// 1. El motor VeriFactu del ISV ha calculado la huella y generado la URL del QR AEAT
string huellaEncadenada = "ABC123DEF456..."; // SHA-256 encadenada por el ISV
string urlQrAeat = "https://sede.agenciatributaria.gob.es/..."; // URL verificación AEAT

// 2. IronPDF genera el PDF con la leyenda VERI*FACTU y el QR AEAT
ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.InputEncoding = System.Text.Encoding.UTF8;

string htmlFactura = $@"
    <html lang='es'><head><meta charset='UTF-8'/>
    <style>
        body {{ font-family: Arial, sans-serif; font-size: 11px; }}
        .verifactu {{ margin-top:20px; padding:8px; background:#fff3cd;
                      border:1px solid #ffc107; font-weight:bold; text-align:center; }}
    </style></head>
    <body>
        <h2>Factura N.º 2026-100</h2>
        <p>NIF: B98765432 | Empresa: Servicios Digitales Norte S.L.</p>
        <p>Base: 5.000,00 € | IVA 21%: 1.050,00 € | <strong>Total: 6.050,00 €</strong></p>
        <div class='verifactu'>
            VERI*FACTU | Factura verificable en la sede electrónica de la AEAT
            <br/><img src='{urlQrAeat}' width='80' height='80' alt='QR AEAT'/>
        </div>
    </body></html>";

PdfDocument pdfDoc = renderer.RenderHtmlAsPdf(htmlFactura);

// 3. Firma PAdES con certificado FNMT o corporativo (PFX/P12)
// Use un certificado FNMT cualificado para firmas eIDAS de alto valor jurídico
var firmaPades = new PdfSignature("cert-empresa.pfx", "contraseña-certificado")
{
    SigningContact  = "admin@serviciosdigitalesnorte.es",
    SigningLocation = "Bilbao, España",
    SigningReason   = "Factura VeriFactu conforme con RDL 15/2025"
};
pdfDoc.Sign(firmaPades);

// 4. Guardar el PDF firmado para archivo bajo LOPDGDD
pdfDoc.SaveAs("factura-2026-100-verifactu-firmada.pdf");
using IronPdf;
using IronPdf.Signing;

// 1. El motor VeriFactu del ISV ha calculado la huella y generado la URL del QR AEAT
string huellaEncadenada = "ABC123DEF456..."; // SHA-256 encadenada por el ISV
string urlQrAeat = "https://sede.agenciatributaria.gob.es/..."; // URL verificación AEAT

// 2. IronPDF genera el PDF con la leyenda VERI*FACTU y el QR AEAT
ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.InputEncoding = System.Text.Encoding.UTF8;

string htmlFactura = $@"
    <html lang='es'><head><meta charset='UTF-8'/>
    <style>
        body {{ font-family: Arial, sans-serif; font-size: 11px; }}
        .verifactu {{ margin-top:20px; padding:8px; background:#fff3cd;
                      border:1px solid #ffc107; font-weight:bold; text-align:center; }}
    </style></head>
    <body>
        <h2>Factura N.º 2026-100</h2>
        <p>NIF: B98765432 | Empresa: Servicios Digitales Norte S.L.</p>
        <p>Base: 5.000,00 € | IVA 21%: 1.050,00 € | <strong>Total: 6.050,00 €</strong></p>
        <div class='verifactu'>
            VERI*FACTU | Factura verificable en la sede electrónica de la AEAT
            <br/><img src='{urlQrAeat}' width='80' height='80' alt='QR AEAT'/>
        </div>
    </body></html>";

PdfDocument pdfDoc = renderer.RenderHtmlAsPdf(htmlFactura);

// 3. Firma PAdES con certificado FNMT o corporativo (PFX/P12)
// Use un certificado FNMT cualificado para firmas eIDAS de alto valor jurídico
var firmaPades = new PdfSignature("cert-empresa.pfx", "contraseña-certificado")
{
    SigningContact  = "admin@serviciosdigitalesnorte.es",
    SigningLocation = "Bilbao, España",
    SigningReason   = "Factura VeriFactu conforme con RDL 15/2025"
};
pdfDoc.Sign(firmaPades);

// 4. Guardar el PDF firmado para archivo bajo LOPDGDD
pdfDoc.SaveAs("factura-2026-100-verifactu-firmada.pdf");
Imports IronPdf
Imports IronPdf.Signing
Imports System.Text

' 1. El motor VeriFactu del ISV ha calculado la huella y generado la URL del QR AEAT
Dim huellaEncadenada As String = "ABC123DEF456..." ' SHA-256 encadenada por el ISV
Dim urlQrAeat As String = "https://sede.agenciatributaria.gob.es/..." ' URL verificación AEAT

' 2. IronPDF genera el PDF con la leyenda VERI*FACTU y el QR AEAT
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.InputEncoding = Encoding.UTF8

Dim htmlFactura As String = $"
    <html lang='es'><head><meta charset='UTF-8'/>
    <style>
        body {{ font-family: Arial, sans-serif; font-size: 11px; }}
        .verifactu {{ margin-top:20px; padding:8px; background:#fff3cd;
                      border:1px solid #ffc107; font-weight:bold; text-align:center; }}
    </style></head>
    <body>
        <h2>Factura N.º 2026-100</h2>
        <p>NIF: B98765432 | Empresa: Servicios Digitales Norte S.L.</p>
        <p>Base: 5.000,00 € | IVA 21%: 1.050,00 € | <strong>Total: 6.050,00 €</strong></p>
        <div class='verifactu'>
            VERI*FACTU | Factura verificable en la sede electrónica de la AEAT
            <br/><img src='{urlQrAeat}' width='80' height='80' alt='QR AEAT'/>
        </div>
    </body></html>"

Dim pdfDoc As PdfDocument = renderer.RenderHtmlAsPdf(htmlFactura)

' 3. Firma PAdES con certificado FNMT o corporativo (PFX/P12)
' Use un certificado FNMT cualificado para firmas eIDAS de alto valor jurídico
Dim firmaPades As New PdfSignature("cert-empresa.pfx", "contraseña-certificado") With {
    .SigningContact = "admin@serviciosdigitalesnorte.es",
    .SigningLocation = "Bilbao, España",
    .SigningReason = "Factura VeriFactu conforme con RDL 15/2025"
}
pdfDoc.Sign(firmaPades)

' 4. Guardar el PDF firmado para archivo bajo LOPDGDD
pdfDoc.SaveAs("factura-2026-100-verifactu-firmada.pdf")
$vbLabelText   $csharpLabel

La leyenda VERI*FACTU (con asterisco, forma exacta exigida por la AEAT) se incluye en el HTML antes de firmar. La firma PAdES cubre el contenido íntegro del PDF, incluyendo la leyenda y el QR AEAT.


Firma PAdES con imagen visual (contratos y documentos LOPDGDD)

Para documentos que requieren representación visual de la firma —contratos, poderes notariales, documentación regulatoria LOPDGDD—:

using IronPdf.Signing;
using IronSoftware.Drawing;

// Crear el objeto PdfSignature con imagen visual de firma/sello
var sig = new PdfSignature("certificado-empresa.pfx", "contraseña");
sig.SignatureImage = new PdfSignatureImage(
    "sello-empresa.png",
    0,  // número de página (0 = primera)
    new CropRectangle(0, 600, 100, 100)  // posición x, y, ancho, alto en puntos PDF
);
using IronPdf.Signing;
using IronSoftware.Drawing;

// Crear el objeto PdfSignature con imagen visual de firma/sello
var sig = new PdfSignature("certificado-empresa.pfx", "contraseña");
sig.SignatureImage = new PdfSignatureImage(
    "sello-empresa.png",
    0,  // número de página (0 = primera)
    new CropRectangle(0, 600, 100, 100)  // posición x, y, ancho, alto en puntos PDF
);
Imports IronPdf.Signing
Imports IronSoftware.Drawing

' Crear el objeto PdfSignature con imagen visual de firma/sello
Dim sig As New PdfSignature("certificado-empresa.pfx", "contraseña")
sig.SignatureImage = New PdfSignatureImage(
    "sello-empresa.png",
    0,  ' número de página (0 = primera)
    New CropRectangle(0, 600, 100, 100)  ' posición x, y, ancho, alto en puntos PDF
)
$vbLabelText   $csharpLabel

Validación de firmas en documentos archivados bajo LOPDGDD

La validación de firmas es un requisito habitual en auditorías LOPDGDD y en la verificación de facturas históricas. PAdES-LTV permite esta validación incluso cuando el certificado original ha caducado:

using IronPdf;

// Cargar el documento archivado
PdfDocument pdfArchivado = PdfDocument.FromFile("factura-archivada.pdf");

// Verificar todas las firmas del documento
bool esValida = pdfArchivado.VerifyPdfSignatures();

if (esValida)
    Console.WriteLine("Firma válida: documento íntegro para archivo LOPDGDD");
else
    Console.WriteLine("Firma no válida: revisar integridad del documento");
using IronPdf;

// Cargar el documento archivado
PdfDocument pdfArchivado = PdfDocument.FromFile("factura-archivada.pdf");

// Verificar todas las firmas del documento
bool esValida = pdfArchivado.VerifyPdfSignatures();

if (esValida)
    Console.WriteLine("Firma válida: documento íntegro para archivo LOPDGDD");
else
    Console.WriteLine("Firma no válida: revisar integridad del documento");
Imports IronPdf

' Cargar el documento archivado
Dim pdfArchivado As PdfDocument = PdfDocument.FromFile("factura-archivada.pdf")

' Verificar todas las firmas del documento
Dim esValida As Boolean = pdfArchivado.VerifyPdfSignatures()

If esValida Then
    Console.WriteLine("Firma válida: documento íntegro para archivo LOPDGDD")
Else
    Console.WriteLine("Firma no válida: revisar integridad del documento")
End If
$vbLabelText   $csharpLabel

Para que la validación PAdES-LTV funcione a largo plazo, los datos OCSP/CRL deben haberse incrustado en el momento de la firma —condición que se cumple automáticamente cuando la firma se aplica con un certificado válido y el servicio OCSP de la CA estaba accesible en el momento de firmar.


Marcas de agua para documentos pendientes de firma

En entornos de desarrollo o para documentos borrador que aún no disponen de certificado digital:

using IronPdf;
using IronPdf.Editing;

var pdf = PdfDocument.FromFile("borrador-contrato.pdf");

pdf.ApplyWatermark(
    "<img src='sello-borrador.png'/>",
    90,
    VerticalAlignment.Bottom,
    HorizontalAlignment.Right
);

pdf.SaveAs("borrador-contrato-pendiente-firma.pdf");
using IronPdf;
using IronPdf.Editing;

var pdf = PdfDocument.FromFile("borrador-contrato.pdf");

pdf.ApplyWatermark(
    "<img src='sello-borrador.png'/>",
    90,
    VerticalAlignment.Bottom,
    HorizontalAlignment.Right
);

pdf.SaveAs("borrador-contrato-pendiente-firma.pdf");
Imports IronPdf
Imports IronPdf.Editing

Dim pdf = PdfDocument.FromFile("borrador-contrato.pdf")

pdf.ApplyWatermark(
    "<img src='sello-borrador.png'/>",
    90,
    VerticalAlignment.Bottom,
    HorizontalAlignment.Right
)

pdf.SaveAs("borrador-contrato-pendiente-firma.pdf")
$vbLabelText   $csharpLabel

Ventaja económica de la licencia comercial de IronPDF para ISV bajo VeriFactu

VeriFactu (RDL 15/2025) establece penalizaciones de hasta €150.000 anuales para proveedores de software de facturación no conformes. Este riesgo económico hace que la elección de la biblioteca PDF adquiera relevancia contractual:

El riesgo compuesto de iText AGPL: iText 7, la alternativa más conocida, usa licencia AGPL, que obliga a divulgar el código fuente al distribuir software propietario. Para un ISV que vende software de facturación propietario, esto supone un riesgo dual: exposición AGPL sobre el código propietario + exposición VeriFactu si el cumplimiento se ve comprometido durante una auditoría técnica. Ambos riesgos se materializan simultáneamente en el peor caso.

IronPDF: licencia comercial propietaria, pago único, sin obligaciones de divulgación de código fuente. El equipo legal del ISV no necesita evaluar implicaciones AGPL.

Cómo crear una firma PDF en .NET, Figura 6: Licencias de IronPDF Licencias de IronPDF

Consulte las opciones de licencia o inicie una prueba gratuita con funcionalidad completa.


Conclusión: un ISV español, tres regímenes de firma

La firma electrónica de documentos PDF en España exige manejar en paralelo regímenes normativos con organismos supervisores distintos: XAdES para TicketBAI (tres variantes forales del País Vasco: Bizkaia/BATUZ, Gipuzkoa, Araba), PAdES-LTV para el archivo a largo plazo supervisado por la AEPD bajo LOPDGDD, y firmas cualificadas eIDAS mediante certificados FNMT para documentos de alto valor jurídico.

IronPDF proporciona la capa de generación y firma PAdES dentro del software de facturación del ISV —no sustituye al motor de negocio certificado VeriFactu ni implementa la firma XAdES de los XMLs TicketBAI, responsabilidades que corresponden al motor del ISV.

Para implementaciones con HSM (habitual en grandes ISV bajo VeriFactu), consulte la guía de firma con HSM. Para el archivo conforme como PDF/A, la guía de PDF/A. Para todos los detalles de implementación de firma, consulte la guía completa de firma digital de IronPDF.

Preguntas Frecuentes

¿Qué diferencia hay entre XAdES y PAdES en el contexto español?

XAdES (XML Advanced Electronic Signatures) se usa para firmar documentos XML como los registros TicketBAI del País Vasco. PAdES (PDF Advanced Electronic Signatures) se usa para firmar documentos PDF. En el flujo de facturación TicketBAI, el ISV firma el XML con XAdES y usa IronPDF para generar el PDF de visualización con firma PAdES. Para archivo bajo LOPDGDD se recomienda PAdES-LTV que incrusta los datos de validación a largo plazo.

¿Cómo implemento la firma PAdES con un certificado FNMT en IronPDF?

Exporte su certificado FNMT como archivo PFX desde el almacén de certificados de Windows. Cree un objeto PdfSignature con la ruta al PFX y la contraseña: new PdfSignature("certificado-fnmt.pfx", "password"). Aplique la firma con doc.Sign(firma) y guarde con doc.SaveAs().

¿Cómo garantizo que la leyenda VERI*FACTU aparezca correctamente en el PDF firmado?

Incluya la leyenda exacta 'VERI*FACTU' (con asterisco en el medio) o 'Factura verificable en la sede electrónica de la AEAT' en el HTML de la factura antes de aplicar la firma. La firma PAdES cubre el contenido completo del PDF, incluida la leyenda.

¿Cuáles son las diferencias entre las tres variantes forales de TicketBAI?

Bizkaia (bizkaia.eus) usa el sistema BATUZ con XAdES obligatorio en el registro de facturación. Gipuzkoa (gipuzkoa.eus) y Araba (araba.eus) tienen sus propios esquemas con variaciones en los campos XML. Los ISV que sirven al País Vasco deben implementar las tres variantes. IronPDF gestiona la generación del PDF de visualización; la firma XAdES del XML TicketBAI la implementa el motor de negocio del ISV.

¿Cómo valido firmas PAdES en documentos archivados bajo LOPDGDD?

Use el método VerifyPdfSignatures() de IronPDF. Las firmas PAdES-LTV incrusta los datos OCSP/CRL en el momento de la firma para que la validación funcione incluso después de la caducidad del certificado, lo que es esencial para el archivo a largo plazo exigido por LOPDGDD.

¿Por qué es especialmente relevante la licencia comercial de IronPDF para ISV bajo VeriFactu?

VeriFactu impone penalizaciones de hasta €150.000 anuales a los proveedores de software de facturación no conformes. iText usa licencia AGPL que obliga a divulgar el código fuente al distribuir software propietario. Este riesgo compuesto (penalización VeriFactu + exposición AGPL) hace que la licencia comercial propietaria de IronPDF sea una ventaja crítica para los ISV españoles.

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