Componente PDF para software de facturación VeriFactu: IronPDF, Aspose y Syncfusion bajo la penalización de €150.000/año
El Real Decreto-Ley 15/2025 de 2 de diciembre de 2025 introdujo una disposición que ha cambiado el orden de prioridades en la evaluación de componentes de software para desarrolladores españoles: las sanciones de hasta 150.000 €/año a proveedores de software de facturación no conforme con VeriFactu no recaen sobre los usuarios finales, sino sobre los ISVs que distribuyen o mantienen ese software. Esta realidad convierte la selección de la biblioteca PDF en una decisión que pertenece tanto al área de compliance como al área técnica.
Este análisis no pretende ser una comparativa genérica de características entre IronPDF, Aspose.PDF y Syncfusion PDF. Su propósito es más específico: ayudar al ISV español a entender qué variables de riesgo entran en juego cuando el componente PDF forma parte de un sistema de facturación que debe cumplir con VeriFactu, TicketBAI, Facturae y los requisitos del Suministro Inmediato de Información (SII).
Qué exige VeriFactu al componente PDF del software de facturación
VeriFactu (con implementación aplazada a 1 de enero de 2027 para sujetos pasivos del Impuesto sobre Sociedades y 1 de julio de 2027 para el resto, según RDL 15/2025) establece requisitos específicos sobre la representación impresa de la factura:
Leyenda obligatoria en visualizaciones: Las facturas emitidas bajo VeriFactu deben incluir la cadena literal VERI*FACTU (con asterisco en el centro) en las visualizaciones. Opcionalmente, puede aparecer en su lugar la leyenda Factura verificable en la sede electrónica de la AEAT. Estas cadenas deben preservarse literalmente — no son susceptibles de adaptación tipográfica ni traducción.
Código QR de verificación AEAT: El PDF de la factura debe incluir un código QR que apunte al endpoint de verificación de la Agencia Estatal de Administración Tributaria (AEAT). Este QR contiene los datos de identificación del registro de facturación: NIF, número de factura, fecha, importe y la huella encadenada.
Huella encadenada: El sistema de facturación genera un hash (SHA-256 o equivalente) que encadena cada registro con el anterior, garantizando la integridad de la secuencia. El PDF es la representación visual de ese registro; el componente PDF debe embeber correctamente la huella para que el documento sea consistente con el registro XML.
Lo que el componente PDF no hace es certificar el software de facturación. IronPDF, Aspose.PDF y Syncfusion son componentes que se integran dentro del sistema — la certificación es responsabilidad del conjunto del producto y de los procesos del ISV.
El factor de riesgo que distingue el mercado español: la intersección VeriFactu × AGPL
En la mayoría de los países europeos, usar una biblioteca PDF con licencia AGPL en software propietario es un riesgo legal gestionable mediante la adquisición de una licencia comercial del proveedor. En España, ese riesgo tiene una dimensión adicional que no existe en otros mercados.
La AGPL (Affero General Public License) exige que cualquier software que use una biblioteca AGPL — ya sea distribuido como producto instalable o prestado como servicio en red — libere su código fuente completo bajo los mismos términos. Para un ISV que ha desarrollado lógica propietaria de facturación (algoritmos de cálculo de impuestos, integración con SII de la AEAT, generación de huella VeriFactu), esto significa exponer bajo licencia copyleft exactamente el código que hace su producto diferencial.
La intersección con VeriFactu agudiza el problema: el componente AGPL que genera los PDFs de factura es el mismo componente que procesa los registros de mayor sensibilidad fiscal del producto. Un ISV que distribuya software de facturación sin resolver su exposición AGPL acumula simultáneamente riesgo de incumplimiento copyleft y riesgo de sanción VeriFactu sobre el mismo componente.
IronPDF, Aspose.PDF y Syncfusion son todos propietarios — ninguno presenta este riesgo. La comparación relevante en el mercado español no es entre las tres bibliotecas comerciales respecto al riesgo AGPL (las tres están en la misma posición: sin riesgo), sino entre cualquiera de ellas y alternativas como iText 7 en su modalidad AGPL, que crea esta intersección de exposición.
Análisis de los tres componentes desde la perspectiva del ISV bajo VeriFactu
IronPDF: enfoque HTML-first para plantillas de factura mantenibles
La ventaja diferencial de IronPDF en el contexto de facturación española es el motor Chromium integrado. Las plantillas de factura — incluidos los elementos obligatorios VERI*FACTU y el QR AEAT — se pueden mantener en HTML/CSS por el equipo contable o de producto sin tocar el código C#. El resultado es un PDF pixel-perfect que respeta el diseño de la plantilla.
El flujo de generación con IronPDF es directo para un ISV con lógica de facturación ya implementada:
using IronPdf;
// Plantilla mantenida en HTML — incluye literales VeriFactu obligatorios
string facturaHtml = @"
<!DOCTYPE html>
<html lang='es'>
<head>
<style>
body { font-family: Arial; margin: 40px; font-size: 11px; }
.cabecera-fiscal { background: #1a3a5c; color: #fff; padding: 15px; }
.bloque-verifactu {
border: 2px solid #1a3a5c;
padding: 8px;
text-align: center;
font-weight: bold;
margin-top: 20px;
font-size: 10px;
}
table { width: 100%; border-collapse: collapse; margin-top: 15px; }
th { background: #34495e; color: #fff; padding: 6px; text-align: left; }
td { border: 1px solid #ddd; padding: 6px; }
.total-row { font-weight: bold; background: #f5f5f5; }
.formato-es { text-align: right; }
</style>
</head>
<body>
<div class='cabecera-fiscal'>
<h1>FACTURA Nº 2027-A-001234</h1>
<p>NIF emisor: B12345678 | Fecha: 15/01/2027 | Serie: A</p>
</div>
<table>
<thead>
<tr><th>Concepto</th><th>Cant.</th><th>Precio unit.</th><th>IVA %</th><th>Total</th></tr>
</thead>
<tbody>
<tr>
<td>Módulo software facturación VeriFactu</td>
<td class='formato-es'>1</td>
<td class='formato-es'>2.400,00 €</td>
<td class='formato-es'>21 %</td>
<td class='formato-es'>2.904,00 €</td>
</tr>
</tbody>
<tfoot>
<tr class='total-row'>
<td colspan='4'>Base imponible</td>
<td class='formato-es'>2.400,00 €</td>
</tr>
<tr class='total-row'>
<td colspan='4'>IVA (21 %)</td>
<td class='formato-es'>504,00 €</td>
</tr>
<tr class='total-row'>
<td colspan='4'><strong>TOTAL</strong></td>
<td class='formato-es'><strong>2.904,00 €</strong></td>
</tr>
</tfoot>
</table>
<img src='qr_aeat_{{NIF}}_{{NumFactura}}.png' width='80' height='80'
alt='Verificación AEAT' style='float:right;margin-top:10px;' />
<div class='bloque-verifactu'>
VERI*FACTU<br/>
Factura verificable en la sede electrónica de la AEAT
</div>
</body>
</html>";
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 0;
renderer.RenderingOptions.EnableJavaScript = false;
// Sustituir marcadores con datos del registro VeriFactu
string html = facturaHtml
.Replace("{{NIF}}", nifEmisor)
.Replace("{{NumFactura}}", numFactura);
using var pdfFactura = renderer.RenderHtmlAsPdf(html);
pdfFactura.SaveAs($"factura_{numFactura}.pdf");
using IronPdf;
// Plantilla mantenida en HTML — incluye literales VeriFactu obligatorios
string facturaHtml = @"
<!DOCTYPE html>
<html lang='es'>
<head>
<style>
body { font-family: Arial; margin: 40px; font-size: 11px; }
.cabecera-fiscal { background: #1a3a5c; color: #fff; padding: 15px; }
.bloque-verifactu {
border: 2px solid #1a3a5c;
padding: 8px;
text-align: center;
font-weight: bold;
margin-top: 20px;
font-size: 10px;
}
table { width: 100%; border-collapse: collapse; margin-top: 15px; }
th { background: #34495e; color: #fff; padding: 6px; text-align: left; }
td { border: 1px solid #ddd; padding: 6px; }
.total-row { font-weight: bold; background: #f5f5f5; }
.formato-es { text-align: right; }
</style>
</head>
<body>
<div class='cabecera-fiscal'>
<h1>FACTURA Nº 2027-A-001234</h1>
<p>NIF emisor: B12345678 | Fecha: 15/01/2027 | Serie: A</p>
</div>
<table>
<thead>
<tr><th>Concepto</th><th>Cant.</th><th>Precio unit.</th><th>IVA %</th><th>Total</th></tr>
</thead>
<tbody>
<tr>
<td>Módulo software facturación VeriFactu</td>
<td class='formato-es'>1</td>
<td class='formato-es'>2.400,00 €</td>
<td class='formato-es'>21 %</td>
<td class='formato-es'>2.904,00 €</td>
</tr>
</tbody>
<tfoot>
<tr class='total-row'>
<td colspan='4'>Base imponible</td>
<td class='formato-es'>2.400,00 €</td>
</tr>
<tr class='total-row'>
<td colspan='4'>IVA (21 %)</td>
<td class='formato-es'>504,00 €</td>
</tr>
<tr class='total-row'>
<td colspan='4'><strong>TOTAL</strong></td>
<td class='formato-es'><strong>2.904,00 €</strong></td>
</tr>
</tfoot>
</table>
<img src='qr_aeat_{{NIF}}_{{NumFactura}}.png' width='80' height='80'
alt='Verificación AEAT' style='float:right;margin-top:10px;' />
<div class='bloque-verifactu'>
VERI*FACTU<br/>
Factura verificable en la sede electrónica de la AEAT
</div>
</body>
</html>";
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 0;
renderer.RenderingOptions.EnableJavaScript = false;
// Sustituir marcadores con datos del registro VeriFactu
string html = facturaHtml
.Replace("{{NIF}}", nifEmisor)
.Replace("{{NumFactura}}", numFactura);
using var pdfFactura = renderer.RenderHtmlAsPdf(html);
pdfFactura.SaveAs($"factura_{numFactura}.pdf");
Imports IronPdf
' Plantilla mantenida en HTML — incluye literales VeriFactu obligatorios
Dim facturaHtml As String = "
<!DOCTYPE html>
<html lang='es'>
<head>
<style>
body { font-family: Arial; margin: 40px; font-size: 11px; }
.cabecera-fiscal { background: #1a3a5c; color: #fff; padding: 15px; }
.bloque-verifactu {
border: 2px solid #1a3a5c;
padding: 8px;
text-align: center;
font-weight: bold;
margin-top: 20px;
font-size: 10px;
}
table { width: 100%; border-collapse: collapse; margin-top: 15px; }
th { background: #34495e; color: #fff; padding: 6px; text-align: left; }
td { border: 1px solid #ddd; padding: 6px; }
.total-row { font-weight: bold; background: #f5f5f5; }
.formato-es { text-align: right; }
</style>
</head>
<body>
<div class='cabecera-fiscal'>
<h1>FACTURA Nº 2027-A-001234</h1>
<p>NIF emisor: B12345678 | Fecha: 15/01/2027 | Serie: A</p>
</div>
<table>
<thead>
<tr><th>Concepto</th><th>Cant.</th><th>Precio unit.</th><th>IVA %</th><th>Total</th></tr>
</thead>
<tbody>
<tr>
<td>Módulo software facturación VeriFactu</td>
<td class='formato-es'>1</td>
<td class='formato-es'>2.400,00 €</td>
<td class='formato-es'>21 %</td>
<td class='formato-es'>2.904,00 €</td>
</tr>
</tbody>
<tfoot>
<tr class='total-row'>
<td colspan='4'>Base imponible</td>
<td class='formato-es'>2.400,00 €</td>
</tr>
<tr class='total-row'>
<td colspan='4'>IVA (21 %)</td>
<td class='formato-es'>504,00 €</td>
</tr>
<tr class='total-row'>
<td colspan='4'><strong>TOTAL</strong></td>
<td class='formato-es'><strong>2.904,00 €</strong></td>
</tr>
</tfoot>
</table>
<img src='qr_aeat_{{NIF}}_{{NumFactura}}.png' width='80' height='80'
alt='Verificación AEAT' style='float:right;margin-top:10px;' />
<div class='bloque-verifactu'>
VERI*FACTU<br/>
Factura verificable en la sede electrónica de la AEAT
</div>
</body>
</html>"
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 0
renderer.RenderingOptions.EnableJavaScript = False
' Sustituir marcadores con datos del registro VeriFactu
Dim html As String = facturaHtml _
.Replace("{{NIF}}", nifEmisor) _
.Replace("{{NumFactura}}", numFactura)
Using pdfFactura = renderer.RenderHtmlAsPdf(html)
pdfFactura.SaveAs($"factura_{numFactura}.pdf")
End Using
El diseño en formato español (1.234,56 € con punto de miles y coma decimal) se mantiene en la plantilla HTML, evitando errores de formato en montos fiscales que podrían ser motivo de rechazo por la AEAT.
Firma PAdES con certificado FNMT para TicketBAI y documentos legales
Las tres provincias del País Vasco (Bizkaia con BATUZ, Gipuzkoa y Araba) exigen que los registros TicketBAI vayan firmados con XAdES. El componente PDF debe soportar PAdES bajo eIDAS para el documento PDF de acompañamiento, firmado con certificado emitido por la FNMT (Fábrica Nacional de Moneda y Timbre) u otra CA acreditada bajo el marco europeo de firma electrónica:
using IronPdf;
using IronPdf.Signing;
using System.Security.Cryptography.X509Certificates;
// Certificado FNMT en formato PFX — gestión segura en producción via Azure Key Vault
var certFNMT = new X509Certificate2(
certBytes, // procedente de Key Vault o almacén seguro
certPassword,
X509KeyStorageFlags.Exportable);
var firmaPAdES = new PdfSignature(certFNMT)
{
SigningContact = "facturacion@empresa.es",
SigningLocation = "España — TicketBAI",
SigningReason = "Factura electrónica TicketBAI / eIDAS"
};
var pdfParaFirmar = PdfDocument.FromFile("factura_borrador.pdf");
pdfParaFirmar.Sign(firmaPAdES);
pdfParaFirmar.SaveAs("factura_firmada_ticketbai.pdf");
using IronPdf;
using IronPdf.Signing;
using System.Security.Cryptography.X509Certificates;
// Certificado FNMT en formato PFX — gestión segura en producción via Azure Key Vault
var certFNMT = new X509Certificate2(
certBytes, // procedente de Key Vault o almacén seguro
certPassword,
X509KeyStorageFlags.Exportable);
var firmaPAdES = new PdfSignature(certFNMT)
{
SigningContact = "facturacion@empresa.es",
SigningLocation = "España — TicketBAI",
SigningReason = "Factura electrónica TicketBAI / eIDAS"
};
var pdfParaFirmar = PdfDocument.FromFile("factura_borrador.pdf");
pdfParaFirmar.Sign(firmaPAdES);
pdfParaFirmar.SaveAs("factura_firmada_ticketbai.pdf");
Imports IronPdf
Imports IronPdf.Signing
Imports System.Security.Cryptography.X509Certificates
' Certificado FNMT en formato PFX — gestión segura en producción via Azure Key Vault
Dim certFNMT As New X509Certificate2(certBytes, ' procedente de Key Vault o almacén seguro
certPassword,
X509KeyStorageFlags.Exportable)
Dim firmaPAdES As New PdfSignature(certFNMT) With {
.SigningContact = "facturacion@empresa.es",
.SigningLocation = "España — TicketBAI",
.SigningReason = "Factura electrónica TicketBAI / eIDAS"
}
Dim pdfParaFirmar As PdfDocument = PdfDocument.FromFile("factura_borrador.pdf")
pdfParaFirmar.Sign(firmaPAdES)
pdfParaFirmar.SaveAs("factura_firmada_ticketbai.pdf")
La firma PAdES bajo eIDAS también cubre los requerimientos de LOPDGDD para documentos con datos personales que necesiten valor probatorio ante la AEPD.
Archivado PDF/A-3 para Facturae y Crea y Crece
Los envíos al sector público a través de FACe requieren Facturae 3.2.2 firmado. El patrón de archivo conforme con EN 16931 y la implementación española CIUS-ES combina el XML Facturae con un contenedor PDF/A-3. IronPDF soporta PDF/A-3B, que permite adjuntar el XML como archivo embebido:
using IronPdf;
using System.IO;
// PDF base ya generado con los datos de la factura
var pdfBase = PdfDocument.FromFile("factura_base.pdf");
// Adjuntar XML Facturae 3.2.2 (firmado con XAdES externamente)
byte[] facturaeXml = File.ReadAllBytes("factura_B12345678_2027001234.xml");
pdfBase.EmbedFile(facturaeXml, "factura.xml", "application/xml");
// Convertir a PDF/A-3B conforme con Crea y Crece / FACe
pdfBase.SaveAsPdfA("factura_face_pdfa3b.pdf", PdfAVersions.PdfA3B);
using IronPdf;
using System.IO;
// PDF base ya generado con los datos de la factura
var pdfBase = PdfDocument.FromFile("factura_base.pdf");
// Adjuntar XML Facturae 3.2.2 (firmado con XAdES externamente)
byte[] facturaeXml = File.ReadAllBytes("factura_B12345678_2027001234.xml");
pdfBase.EmbedFile(facturaeXml, "factura.xml", "application/xml");
// Convertir a PDF/A-3B conforme con Crea y Crece / FACe
pdfBase.SaveAsPdfA("factura_face_pdfa3b.pdf", PdfAVersions.PdfA3B);
Imports IronPdf
Imports System.IO
' PDF base ya generado con los datos de la factura
Dim pdfBase = PdfDocument.FromFile("factura_base.pdf")
' Adjuntar XML Facturae 3.2.2 (firmado con XAdES externamente)
Dim facturaeXml As Byte() = File.ReadAllBytes("factura_B12345678_2027001234.xml")
pdfBase.EmbedFile(facturaeXml, "factura.xml", "application/xml")
' Convertir a PDF/A-3B conforme con Crea y Crece / FACe
pdfBase.SaveAsPdfA("factura_face_pdfa3b.pdf", PdfAVersions.PdfA3B)
Este patrón de factura híbrida — PDF con XML Facturae embebido — es el estándar recomendado para el archivo a largo plazo bajo el calendario de Crea y Crece (obligatorio para empresas con facturación > 8 M€ en 2027, y para el resto en 2028).
Aspose.PDF: control programático con coste acumulado en suscripción
Aspose.PDF ofrece un modelo de objetos exhaustivo que proporciona control preciso sobre cada elemento del documento PDF. Para equipos que ya tienen inversión en el ecosistema Aspose (Aspose.Words, Aspose.Cells), la coherencia de proveedor tiene valor operativo. Sin embargo, para la generación de facturas desde plantillas HTML con elementos VeriFactu, la API programática es más verbosa:
using Aspose.Pdf;
using Aspose.Pdf.Text;
Document doc = new Document();
Page pagina = doc.Pages.Add();
// Construcción programática — requiere posicionamiento manual de cada elemento
TextFragment nifEmisorTxt = new TextFragment("NIF: B12345678 | Factura 2027-A-001234");
nifEmisorTxt.TextState.FontSize = 10;
pagina.Paragraphs.Add(nifEmisorTxt);
// La leyenda VERI*FACTU también requiere construcción explícita
TextFragment leyendaVeriFactu = new TextFragment("VERI*FACTU");
leyendaVeriFactu.TextState.FontStyle = FontStyles.Bold;
pagina.Paragraphs.Add(leyendaVeriFactu);
TextFragment leyendaAeat = new TextFragment("Factura verificable en la sede electrónica de la AEAT");
pagina.Paragraphs.Add(leyendaAeat);
doc.Save("factura_aspose.pdf");
using Aspose.Pdf;
using Aspose.Pdf.Text;
Document doc = new Document();
Page pagina = doc.Pages.Add();
// Construcción programática — requiere posicionamiento manual de cada elemento
TextFragment nifEmisorTxt = new TextFragment("NIF: B12345678 | Factura 2027-A-001234");
nifEmisorTxt.TextState.FontSize = 10;
pagina.Paragraphs.Add(nifEmisorTxt);
// La leyenda VERI*FACTU también requiere construcción explícita
TextFragment leyendaVeriFactu = new TextFragment("VERI*FACTU");
leyendaVeriFactu.TextState.FontStyle = FontStyles.Bold;
pagina.Paragraphs.Add(leyendaVeriFactu);
TextFragment leyendaAeat = new TextFragment("Factura verificable en la sede electrónica de la AEAT");
pagina.Paragraphs.Add(leyendaAeat);
doc.Save("factura_aspose.pdf");
Imports Aspose.Pdf
Imports Aspose.Pdf.Text
Dim doc As New Document()
Dim pagina As Page = doc.Pages.Add()
' Construcción programática — requiere posicionamiento manual de cada elemento
Dim nifEmisorTxt As New TextFragment("NIF: B12345678 | Factura 2027-A-001234")
nifEmisorTxt.TextState.FontSize = 10
pagina.Paragraphs.Add(nifEmisorTxt)
' La leyenda VERI*FACTU también requiere construcción explícita
Dim leyendaVeriFactu As New TextFragment("VERI*FACTU")
leyendaVeriFactu.TextState.FontStyle = FontStyles.Bold
pagina.Paragraphs.Add(leyendaVeriFactu)
Dim leyendaAeat As New TextFragment("Factura verificable en la sede electrónica de la AEAT")
pagina.Paragraphs.Add(leyendaAeat)
doc.Save("factura_aspose.pdf")
El modelo de suscripción anual de Aspose (superior a 1.199 €/desarrollador/año) implica que en un equipo de cinco desarrolladores el coste anual de la biblioteca PDF supera los 6.000 €. En contraste, la licencia perpetua de IronPDF implica un pago único sin renovaciones obligatorias, lo que simplifica la planificación financiera del producto bajo el calendario de cumplimiento VeriFactu.
Syncfusion PDF: idóneo dentro del ecosistema Syncfusion
Syncfusion PDF encaja bien cuando el equipo ya usa los componentes UI de Syncfusion (grids, charts, scheduling) y busca coherencia de proveedor. La biblioteca soporta cifrado, firmas digitales y PDF/A, lo que cubre los requisitos mínimos para facturación bajo VeriFactu.
La limitación relevante para el mercado español es el soporte HTML: Syncfusion PDF no soporta CSS Grid ni flexbox completo, lo que obliga a diseños de factura basados en tablas si se quiere usar el motor HTML de Syncfusion. Para plantillas de factura modernas (flexbox para alinear logos, datos fiscales y totales), esto puede requerir adaptaciones del diseño.
La edición comunitaria de Syncfusion (gratuita por debajo de cierto umbral de facturación del cliente) puede ser relevante para ISVs en etapa temprana — aunque el cambio de modelo al crecer puede crear fricción en la planificación de producto.
SII y rendimiento: volumen de facturas en tiempo real
El Suministro Inmediato de Información (SII) obliga a las grandes empresas a comunicar el detalle de facturas a la AEAT en un plazo de 4 días hábiles desde la emisión. Para el ISV cuyo software de facturación sirve a clientes con obligación SII, el componente PDF debe generar documentos a un volumen y velocidad que no cree un cuello de botella en el pipeline.
El patrón recomendado con IronPDF en contextos de alto volumen es reutilizar la instancia del renderer para evitar la sobrecarga de inicialización del motor Chromium por cada factura:
// Patrón para procesamiento SII de alto volumen
private static readonly ChromePdfRenderer _renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
EnableJavaScript = false, // Desactivar si no se usa JS en las plantillas
Timeout = 10000, // 10 segundos — ajustar según plantilla
PaperSize = IronPdf.Rendering.PdfPaperSize.A4
}
};
public async Task<byte[]> GenerarPdfFacturaAsync(DatosFactura datos)
{
string html = await _plantillaService.RenderizarAsync(datos);
using var pdf = _renderer.RenderHtmlAsPdf(html);
return pdf.BinaryData;
}
// Patrón para procesamiento SII de alto volumen
private static readonly ChromePdfRenderer _renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
EnableJavaScript = false, // Desactivar si no se usa JS en las plantillas
Timeout = 10000, // 10 segundos — ajustar según plantilla
PaperSize = IronPdf.Rendering.PdfPaperSize.A4
}
};
public async Task<byte[]> GenerarPdfFacturaAsync(DatosFactura datos)
{
string html = await _plantillaService.RenderizarAsync(datos);
using var pdf = _renderer.RenderHtmlAsPdf(html);
return pdf.BinaryData;
}
Imports System.Threading.Tasks
Imports IronPdf
' Patrón para procesamiento SII de alto volumen
Private Shared ReadOnly _renderer As New ChromePdfRenderer With {
.RenderingOptions = New ChromePdfRenderOptions With {
.EnableJavaScript = False, ' Desactivar si no se usa JS en las plantillas
.Timeout = 10000, ' 10 segundos — ajustar según plantilla
.PaperSize = IronPdf.Rendering.PdfPaperSize.A4
}
}
Public Async Function GenerarPdfFacturaAsync(datos As DatosFactura) As Task(Of Byte())
Dim html As String = Await _plantillaService.RenderizarAsync(datos)
Using pdf = _renderer.RenderHtmlAsPdf(html)
Return pdf.BinaryData
End Using
End Function
Para lotes de generación mensual (resúmenes, liquidaciones periódicas al SII), IronPDF soporta procesamiento asíncrono que se puede integrar con colas de mensajes tipo Azure Service Bus o RabbitMQ sin bloquear el hilo principal del servidor.
Modelo de licencia bajo el calendario VeriFactu: previsibilidad como activo
Los ISVs que construyen software de facturación bajo VeriFactu se enfrentan a un calendario de cumplimiento con fechas fijas. La previsibilidad del coste del componente PDF es un factor real en la planificación:
| Variable | IronPDF | Aspose.PDF | Syncfusion PDF |
|---|---|---|---|
| Modelo | Licencia perpetua | Suscripción anual | Suscripción / Comunidad |
| Precio entrada | 749 $ (Lite, pago único) | >1.199 €/dev/año | Por cotización / Gratuita (Comunidad) |
| Renovación | Opcional | Obligatoria | Según modelo |
| Licencia OEM | Disponible (redistribución) | Adicional | Adicional |
| Riesgo AGPL | Ninguno | Ninguno | Ninguno |
| Motor HTML | Chromium (CSS3/JS/flexbox) | Flying Saucer (limitado) | WebKit (parcial) |
| Firma PAdES | Sí (eIDAS, FNMT) | Sí | Sí |
| PDF/A-3 | Sí (con adjuntos XML) | Sí (completo) | Parcial |
Para ISVs que distribuyen el software como producto redistribuible (licencia OEM), IronPDF incluye opciones de redistribución sin regalías que simplifican el modelo comercial bajo el régimen de distribución de software de facturación.
Recursos técnicos para el mercado español
- Documentación IronPDF en español
- Firma digital PAdES con IronPDF
- Conformidad PDF/A para archivo a largo plazo
- Guía HTML a PDF con motor Chromium
- Opciones de licencia IronPDF
Inicia tu evaluación técnica con acceso completo durante 30 días para verificar la compatibilidad con tu arquitectura de facturación VeriFactu.
Comience a usar IronPDF en su proyecto hoy con una prueba gratuita.
Preguntas Frecuentes
¿Qué requisitos impone VeriFactu sobre el componente PDF del software de facturación?
VeriFactu (RDL 15/2025) requiere que las visualizaciones de facturas incluyan la leyenda literal VERI*FACTU o 'Factura verificable en la sede electrónica de la AEAT', un código QR de verificación AEAT y la huella encadenada del registro. El componente PDF debe embeber estos elementos con fidelidad.
¿IronPDF es un sistema de facturación certificado bajo VeriFactu?
No. IronPDF es un componente de software que se integra dentro del sistema de facturación del ISV. La certificación VeriFactu es responsabilidad del sistema de facturación completo del proveedor, no de la biblioteca PDF de forma aislada.
¿Por qué la intersección VeriFactu × AGPL es un riesgo específico del mercado español?
En España, los proveedores de software de facturación no conforme pueden ser sancionados con hasta €150.000/año. Usar iText 7 AGPL sin licencia comercial en ese software añade simultáneamente riesgo de divulgación copyleft y riesgo de sanción regulatoria sobre el mismo componente. IronPDF, Aspose.PDF y Syncfusion son todos propietarios, eliminando ese riesgo AGPL.
¿IronPDF soporta la firma PAdES con certificados FNMT para TicketBAI?
Sí. IronPDF proporciona la clase PdfSignature con soporte para certificados X.509, incluyendo los emitidos por la FNMT (Fábrica Nacional de Moneda y Timbre). La firma PAdES resultante cumple con el estándar eIDAS requerido para TicketBAI en Bizkaia (BATUZ), Gipuzkoa y Araba.
¿Cómo genera IronPDF facturas con la leyenda VERI*FACTU?
IronPDF usa el motor Chromium para renderizar plantillas HTML a PDF. La leyenda VERI*FACTU (con asterisco) y 'Factura verificable en la sede electrónica de la AEAT' se incluyen en la plantilla HTML y se preservan literalmente en el PDF generado.
¿Qué diferencia hay entre el motor HTML de IronPDF y el de Aspose.PDF?
IronPDF usa el motor Chromium (CSS3 completo, JavaScript, Flexbox, Grid), igual que un navegador moderno. Aspose.PDF usa Flying Saucer, que no soporta CSS Grid ni Flexbox, lo que puede obligar a adaptar las plantillas de factura para producción en PDF.
¿IronPDF soporta PDF/A-3 para Facturae y Crea y Crece?
Sí. IronPDF incluye SaveAsPdfA() con soporte para PDF/A-3B, que permite embeber el XML Facturae 3.2.2 como adjunto. Este formato es el requerido para envíos a FACe (sector público B2G) y para el archivado conforme con la ley Crea y Crece.
¿Cuál es el modelo de licencia de IronPDF para ISVs que distribuyen software de facturación?
IronPDF ofrece licencia perpetua con pago único (desde 749 $) y opciones de redistribución sin regalías para ISVs que distribuyen su software de facturación a clientes. Esto simplifica la planificación financiera bajo el calendario VeriFactu con fechas fijas (2027).



