Cómo Convertir Código QR a PDF
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:
Crear un nuevo proyecto en Visual Studio
Configurar el nuevo proyecto
Selección del framework .NET
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")
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
)
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
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")
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.
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
¿Cómo puedo integrar una biblioteca PDF for .NET Core en mi proyecto?
Para integrar una biblioteca PDF como IronPDF en tu proyecto para .NET Core, puedes crear una nueva Aplicación de Consola en Visual Studio, elegir el .NET Framework preferido e instalar IronPDF a través de la Consola del Administrador de Paquetes usando el comando Install-Package IronPDF.
¿Qué funcionalidades ofrece una biblioteca PDF for .NET para la seguridad de documentos?
Una biblioteca PDF for .NET como IronPDF ofrece funcionalidades como agregar firmas digitales, encriptación y redacción para mejorar la seguridad y autenticidad de documentos.
¿Cómo agrego una firma digital a un documento PDF programáticamente?
Puedes agregar una firma digital a un documento PDF usando IronPDF creando un objeto PdfSignature con un certificado digital y aplicando el método Sign al PDF. Guarda el documento firmado usando el método SaveAs.
¿Cuál es el proceso para validar firmas digitales en PDFs?
Para validar firmas digitales en PDFs, usa el método VerifyPdfSignatures de IronPDF para asegurarte de que las firmas sean auténticas y no hayan sido alteradas.
¿Puedo usar marcas de agua como alternativa a las firmas digitales en PDFs?
Sí, las marcas de agua pueden usarse como alternativa para indicar la propiedad o el estado del documento cuando no se dispone de certificados digitales para firmas.
¿Hay una prueba disponible para probar una biblioteca PDF for .NET?
IronPDF ofrece una prueba gratuita que permite a los desarrolladores evaluar su gama completa de funcionalidades antes de comprometerse con una licencia comercial.
¿Cómo pueden las firmas digitales mejorar la integridad de los documentos PDF?
Las firmas digitales brindan una forma de verificar la autenticidad e integridad de los documentos PDF, asegurando que el contenido no haya sido alterado desde que se aplicó la firma.
¿Cuáles son los pasos para crear un certificado autofirmado para firmas PDF?
Puedes crear un certificado autofirmado para firmas PDF en IronPDF generando un archivo PFX y usándolo con la clase PdfSignature para firmar tus documentos.
¿IronPDF es totalmente compatible con .NET 10 y qué beneficios aporta?
Sí, IronPDF es totalmente compatible con .NET 10 y admite todas sus nuevas funciones clave de entorno de ejecución y lenguaje. Los desarrolladores pueden usar IronPDF en .NET 10 para aplicaciones web, de escritorio, de microservicios y MAUI sin necesidad de soluciones alternativas. La compatibilidad se traduce en un mejor rendimiento gracias a la reducción de las asignaciones de montón, nuevas API para la seguridad, como el hash mejorado, y acceso a las mejoras de C# 14, como los bloques de extensión y los parámetros lambda simples. Instale mediante NuGet como de costumbre y las API funcionarán de forma idéntica a las versiones anteriores de .NET.




