Alternativas a iText 7 AGPL para C# en España: VeriFactu y la intersección de riesgos copyleft
Full Comparison
Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Itext on pricing, HTML support, and licensing.
Para los desarrolladores C# de ISVs españoles, iText 7 representa un caso de riesgo que en 2026 tiene una dimensión adicional respecto a otros mercados europeos. La licencia AGPL de iText 7 ya supone, en cualquier mercado, la obligación de publicar el código fuente si se distribuye el software o se presta como servicio en red. En España, ese riesgo se intersecta con el régimen VeriFactu: la penalización de hasta €150.000/año a los proveedores de software de facturación no conforme afecta al ISV, y el componente que gestiona los PDF de facturación — iText o cualquier alternativa — está en el centro de esa exposición.
Este artículo analiza las alternativas a iText 7 AGPL para C# desde la perspectiva del ISV español bajo el marco VeriFactu, TicketBAI y Facturae.
La especificidad española del riesgo iText 7 AGPL
La AGPL (GNU Affero General Public License) impone que cualquier software que use iText 7 en modalidad AGPL — ya sea distribuido como instalable o accesible como servicio de red — libere su código fuente completo. En el ecosistema .NET, iText 7 es la biblioteca de generación de PDF con mayor penetración histórica, por lo que muchos ISVs tienen proyectos que la incorporan sin haber revisado la compatibilidad de licencia con su modelo de distribución.
Para el ISV español que desarrolla software de facturación, la intersección VeriFactu × AGPL crea tres capas de riesgo simultáneas:
Capa 1 — Riesgo copyleft clásico: La distribución del software de facturación usando iText 7 AGPL sin licencia comercial exige publicar el código fuente. Los algoritmos de generación de huella (hash encadenado VeriFactu), las rutinas de integración con la AEAT y la lógica de cálculo de IVA quedan expuestos bajo AGPL.
Capa 2 — Riesgo regulatorio VeriFactu: La AEAT puede sancionar con hasta €150.000/año al proveedor cuyo software de facturación no cumple los requisitos técnicos de VeriFactu. El ISV es el sancionado, no el usuario final.
Capa 3 — Riesgo de auditoría de licencias: Las grandes empresas clientes del ISV (con obligación de SII o Crea y Crece) realizan auditorías de terceros en sus proveedores de software. Un componente AGPL en un producto de facturación comercial es un hallazgo de auditoría que puede bloquear contratos.
Alternativas a iText 7 AGPL para C# en el contexto español
IronPDF: licencia comercial predecible, motor Chromium para plantillas HTML
IronPDF es una biblioteca PDF nativa .NET con licencia comercial perpetua. Para el ISV español que construye software de facturación bajo VeriFactu, las ventajas sobre iText 7 son concretas:
- Sin riesgo AGPL: La licencia comercial de IronPDF es propietaria; no impone obligaciones de código abierto sobre el software que lo incorpora.
- Motor Chromium para HTML a PDF: Las plantillas de factura diseñadas en HTML/CSS se convierten pixel-perfect sin las limitaciones CSS de iText 7 / pdfHTML.
- Firma PAdES nativa: Soporte directo de firmas digitales bajo eIDAS con certificados FNMT, necesario para TicketBAI y documentos legales bajo LOPDGDD.
- PDF/A-3 con adjuntos XML: Permite generar el formato híbrido Facturae XML + PDF/A-3 para envíos a FACe y cumplimiento de Crea y Crece.
Ejemplo: factura VeriFactu con VERI*FACTU y QR AEAT
using IronPdf;
// IronPDF: HTML a PDF con motor Chromium
// La plantilla HTML incluye literales VeriFactu obligatorios
string htmlFacturaVeriFactu = @"
<!DOCTYPE html>
<html lang='es'>
<head>
<style>
body { font-family: Arial, sans-serif; font-size: 11px; margin: 30px; }
.encabezado { background:#1a3a5c; color:#fff; padding:15px; margin-bottom:15px; }
table { width:100%; border-collapse:collapse; margin:15px 0; }
th { background:#2c3e50; color:#fff; padding:6px; text-align:left; }
td { padding:6px; border:1px solid #ddd; }
.totales td { font-weight:bold; background:#ecf0f1; }
.leyenda-verifactu {
border:2px solid #1a3a5c; padding:10px;
text-align:center; font-weight:bold;
margin-top:20px; font-size:10px;
}
.qr-verificacion { float:right; margin-left:15px; }
</style>
</head>
<body>
<div class='encabezado'>
<h2>FACTURA NÚM. {{NumeroFactura}}</h2>
<p>{{NombreEmisor}} — NIF: {{NifEmisor}}</p>
<p>Fecha: {{FechaFactura}}</p>
</div>
<table>
<thead><tr><th>Descripción</th><th>Cant.</th><th>P. unit.</th><th>IVA</th><th>Total</th></tr></thead>
<tbody>{{FilasFactura}}</tbody>
<tfoot class='totales'>
<tr><td colspan='4'>Base imponible</td><td>{{BaseImponible}} €</td></tr>
<tr><td colspan='4'>IVA ({{TipoIva}} %)</td><td>{{CuotaIva}} €</td></tr>
<tr><td colspan='4'><strong>TOTAL</strong></td><td><strong>{{TotalFactura}} €</strong></td></tr>
</tfoot>
</table>
<img class='qr-verificacion' src='data:image/png;base64,{{QrAeatBase64}}'
width='90' height='90' alt='QR verificación AEAT' />
<div class='leyenda-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.EnableJavaScript = false;
string html = htmlFacturaVeriFactu
.Replace("{{NumeroFactura}}", factura.Numero)
.Replace("{{NombreEmisor}}", factura.Emisor.Nombre)
.Replace("{{NifEmisor}}", factura.Emisor.Nif)
.Replace("{{FechaFactura}}", factura.Fecha.ToString("dd/MM/yyyy"))
.Replace("{{QrAeatBase64}}", qrAeatBase64);
// ... resto de sustituciones
using var pdfResult = renderer.RenderHtmlAsPdf(html);
pdfResult.SaveAs($"factura_{factura.Numero}.pdf");
using IronPdf;
// IronPDF: HTML a PDF con motor Chromium
// La plantilla HTML incluye literales VeriFactu obligatorios
string htmlFacturaVeriFactu = @"
<!DOCTYPE html>
<html lang='es'>
<head>
<style>
body { font-family: Arial, sans-serif; font-size: 11px; margin: 30px; }
.encabezado { background:#1a3a5c; color:#fff; padding:15px; margin-bottom:15px; }
table { width:100%; border-collapse:collapse; margin:15px 0; }
th { background:#2c3e50; color:#fff; padding:6px; text-align:left; }
td { padding:6px; border:1px solid #ddd; }
.totales td { font-weight:bold; background:#ecf0f1; }
.leyenda-verifactu {
border:2px solid #1a3a5c; padding:10px;
text-align:center; font-weight:bold;
margin-top:20px; font-size:10px;
}
.qr-verificacion { float:right; margin-left:15px; }
</style>
</head>
<body>
<div class='encabezado'>
<h2>FACTURA NÚM. {{NumeroFactura}}</h2>
<p>{{NombreEmisor}} — NIF: {{NifEmisor}}</p>
<p>Fecha: {{FechaFactura}}</p>
</div>
<table>
<thead><tr><th>Descripción</th><th>Cant.</th><th>P. unit.</th><th>IVA</th><th>Total</th></tr></thead>
<tbody>{{FilasFactura}}</tbody>
<tfoot class='totales'>
<tr><td colspan='4'>Base imponible</td><td>{{BaseImponible}} €</td></tr>
<tr><td colspan='4'>IVA ({{TipoIva}} %)</td><td>{{CuotaIva}} €</td></tr>
<tr><td colspan='4'><strong>TOTAL</strong></td><td><strong>{{TotalFactura}} €</strong></td></tr>
</tfoot>
</table>
<img class='qr-verificacion' src='data:image/png;base64,{{QrAeatBase64}}'
width='90' height='90' alt='QR verificación AEAT' />
<div class='leyenda-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.EnableJavaScript = false;
string html = htmlFacturaVeriFactu
.Replace("{{NumeroFactura}}", factura.Numero)
.Replace("{{NombreEmisor}}", factura.Emisor.Nombre)
.Replace("{{NifEmisor}}", factura.Emisor.Nif)
.Replace("{{FechaFactura}}", factura.Fecha.ToString("dd/MM/yyyy"))
.Replace("{{QrAeatBase64}}", qrAeatBase64);
// ... resto de sustituciones
using var pdfResult = renderer.RenderHtmlAsPdf(html);
pdfResult.SaveAs($"factura_{factura.Numero}.pdf");
Imports IronPdf
' IronPDF: HTML a PDF con motor Chromium
' La plantilla HTML incluye literales VeriFactu obligatorios
Dim htmlFacturaVeriFactu As String = "
<!DOCTYPE html>
<html lang='es'>
<head>
<style>
body { font-family: Arial, sans-serif; font-size: 11px; margin: 30px; }
.encabezado { background:#1a3a5c; color:#fff; padding:15px; margin-bottom:15px; }
table { width:100%; border-collapse:collapse; margin:15px 0; }
th { background:#2c3e50; color:#fff; padding:6px; text-align:left; }
td { padding:6px; border:1px solid #ddd; }
.totales td { font-weight:bold; background:#ecf0f1; }
.leyenda-verifactu {
border:2px solid #1a3a5c; padding:10px;
text-align:center; font-weight:bold;
margin-top:20px; font-size:10px;
}
.qr-verificacion { float:right; margin-left:15px; }
</style>
</head>
<body>
<div class='encabezado'>
<h2>FACTURA NÚM. {{NumeroFactura}}</h2>
<p>{{NombreEmisor}} — NIF: {{NifEmisor}}</p>
<p>Fecha: {{FechaFactura}}</p>
</div>
<table>
<thead><tr><th>Descripción</th><th>Cant.</th><th>P. unit.</th><th>IVA</th><th>Total</th></tr></thead>
<tbody>{{FilasFactura}}</tbody>
<tfoot class='totales'>
<tr><td colspan='4'>Base imponible</td><td>{{BaseImponible}} €</td></tr>
<tr><td colspan='4'>IVA ({{TipoIva}} %)</td><td>{{CuotaIva}} €</td></tr>
<tr><td colspan='4'><strong>TOTAL</strong></td><td><strong>{{TotalFactura}} €</strong></td></tr>
</tfoot>
</table>
<img class='qr-verificacion' src='data:image/png;base64,{{QrAeatBase64}}'
width='90' height='90' alt='QR verificación AEAT' />
<div class='leyenda-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.EnableJavaScript = False
Dim html As String = htmlFacturaVeriFactu _
.Replace("{{NumeroFactura}}", factura.Numero) _
.Replace("{{NombreEmisor}}", factura.Emisor.Nombre) _
.Replace("{{NifEmisor}}", factura.Emisor.Nif) _
.Replace("{{FechaFactura}}", factura.Fecha.ToString("dd/MM/yyyy")) _
.Replace("{{QrAeatBase64}}", qrAeatBase64)
' ... resto de sustituciones
Using pdfResult = renderer.RenderHtmlAsPdf(html)
pdfResult.SaveAs($"factura_{factura.Numero}.pdf")
End Using
A diferencia de iText 7 + pdfHTML, no se requiere ningún complemento separado para la conversión HTML a PDF — el motor Chromium está integrado en el paquete NuGet.
Comparativa de API: iText 7 vs IronPDF para facturación española
// iText 7 AGPL: construcción programática, requiere pdfHTML para HTML-to-PDF
using iText.Html2pdf;
// Para HTML a PDF se necesita el complemento pdfHTML (licencia separada)
using (FileStream htmlSource = File.Open("factura.html", FileMode.Open))
using (FileStream pdfDest = File.Open("factura.pdf", FileMode.Create))
{
ConverterProperties props = new ConverterProperties();
// pdfHTML tiene soporte CSS limitado — no renderiza flexbox/grid correctamente
HtmlConverter.ConvertToPdf(htmlSource, pdfDest, props);
}
// IronPDF: sin complemento adicional, motor Chromium completo
var renderer = new ChromePdfRenderer();
using var pdf = renderer.RenderHtmlAsPdf(File.ReadAllText("factura.html"));
pdf.SaveAs("factura.pdf");
// iText 7 AGPL: construcción programática, requiere pdfHTML para HTML-to-PDF
using iText.Html2pdf;
// Para HTML a PDF se necesita el complemento pdfHTML (licencia separada)
using (FileStream htmlSource = File.Open("factura.html", FileMode.Open))
using (FileStream pdfDest = File.Open("factura.pdf", FileMode.Create))
{
ConverterProperties props = new ConverterProperties();
// pdfHTML tiene soporte CSS limitado — no renderiza flexbox/grid correctamente
HtmlConverter.ConvertToPdf(htmlSource, pdfDest, props);
}
// IronPDF: sin complemento adicional, motor Chromium completo
var renderer = new ChromePdfRenderer();
using var pdf = renderer.RenderHtmlAsPdf(File.ReadAllText("factura.html"));
pdf.SaveAs("factura.pdf");
Imports iText.Html2pdf
Imports System.IO
Imports IronPdf
' Para HTML a PDF se necesita el complemento pdfHTML (licencia separada)
Using htmlSource As FileStream = File.Open("factura.html", FileMode.Open)
Using pdfDest As FileStream = File.Open("factura.pdf", FileMode.Create)
Dim props As New ConverterProperties()
' pdfHTML tiene soporte CSS limitado — no renderiza flexbox/grid correctamente
HtmlConverter.ConvertToPdf(htmlSource, pdfDest, props)
End Using
End Using
' IronPDF: sin complemento adicional, motor Chromium completo
Dim renderer As New ChromePdfRenderer()
Using pdf = renderer.RenderHtmlAsPdf(File.ReadAllText("factura.html"))
pdf.SaveAs("factura.pdf")
End Using
Firma PAdES con certificado FNMT para TicketBAI
Las facturas electrónicas en el País Vasco deben ir firmadas bajo TicketBAI, con XAdES para el registro XML y PAdES para el PDF de acompañamiento. La firma debe hacerse con certificado emitido por una CA acreditada bajo eIDAS — habitualmente la FNMT (Fábrica Nacional de Moneda y Timbre) para empresas españolas, o certificados de entidades como ACCV o ANF AC:
using IronPdf;
using IronPdf.Signing;
using System.Security.Cryptography.X509Certificates;
// Certificado FNMT — almacenado de forma segura (Azure Key Vault en producción)
X509Certificate2 certFNMT = new X509Certificate2(
certBytes, certPassword, X509KeyStorageFlags.Exportable);
// Firma PAdES conforme con eIDAS
var firma = new PdfSignature(certFNMT)
{
SigningContact = "facturacion@empresa.es",
SigningLocation = "Bilbao, Bizkaia — TicketBAI",
SigningReason = "Factura electrónica TicketBAI"
};
var pdf = PdfDocument.FromFile("factura_verifactu.pdf");
pdf.Sign(firma);
pdf.SaveAs("factura_firmada_ticketbai.pdf");
using IronPdf;
using IronPdf.Signing;
using System.Security.Cryptography.X509Certificates;
// Certificado FNMT — almacenado de forma segura (Azure Key Vault en producción)
X509Certificate2 certFNMT = new X509Certificate2(
certBytes, certPassword, X509KeyStorageFlags.Exportable);
// Firma PAdES conforme con eIDAS
var firma = new PdfSignature(certFNMT)
{
SigningContact = "facturacion@empresa.es",
SigningLocation = "Bilbao, Bizkaia — TicketBAI",
SigningReason = "Factura electrónica TicketBAI"
};
var pdf = PdfDocument.FromFile("factura_verifactu.pdf");
pdf.Sign(firma);
pdf.SaveAs("factura_firmada_ticketbai.pdf");
Imports IronPdf
Imports IronPdf.Signing
Imports System.Security.Cryptography.X509Certificates
' Certificado FNMT — almacenado de forma segura (Azure Key Vault en producción)
Dim certFNMT As New X509Certificate2(certBytes, certPassword, X509KeyStorageFlags.Exportable)
' Firma PAdES conforme con eIDAS
Dim firma As New PdfSignature(certFNMT) With {
.SigningContact = "facturacion@empresa.es",
.SigningLocation = "Bilbao, Bizkaia — TicketBAI",
.SigningReason = "Factura electrónica TicketBAI"
}
Dim pdf = PdfDocument.FromFile("factura_verifactu.pdf")
pdf.Sign(firma)
pdf.SaveAs("factura_firmada_ticketbai.pdf")
Bizkaia (con BATUZ), Gipuzkoa y Araba tienen implementaciones TicketBAI con diferencias de detalle. La fragmentación foral real requiere que el ISV mantenga lógica específica por provincia; el componente PDF (IronPDF) proporciona la firma PAdES válida para los tres territorios bajo el estándar eIDAS común.
Archivado conforme a Crea y Crece: PDF/A-3 con XML Facturae
La ley Crea y Crece establece la obligatoriedad de facturación electrónica B2B: para empresas con facturación > 8 M€ desde 2027, y para el resto desde 2028. El formato conforme con EN 16931 y CIUS-ES combina el XML Facturae 3.2.2 con un contenedor PDF/A-3:
using IronPdf;
var pdf = PdfDocument.FromFile("factura_base.pdf");
// Adjuntar XML Facturae 3.2.2 firmado con XAdES
byte[] xmlFacturae = File.ReadAllBytes("factura_XML_Facturae_3_2_2.xml");
pdf.EmbedFile(xmlFacturae, "factura.xml", "application/xml");
// PDF/A-3B para archivo — permite adjuntos XML (requerido por Crea y Crece / FACe)
pdf.SaveAsPdfA("factura_pdfa3b_face.pdf", PdfAVersions.PdfA3B);
using IronPdf;
var pdf = PdfDocument.FromFile("factura_base.pdf");
// Adjuntar XML Facturae 3.2.2 firmado con XAdES
byte[] xmlFacturae = File.ReadAllBytes("factura_XML_Facturae_3_2_2.xml");
pdf.EmbedFile(xmlFacturae, "factura.xml", "application/xml");
// PDF/A-3B para archivo — permite adjuntos XML (requerido por Crea y Crece / FACe)
pdf.SaveAsPdfA("factura_pdfa3b_face.pdf", PdfAVersions.PdfA3B);
Imports IronPdf
Dim pdf = PdfDocument.FromFile("factura_base.pdf")
' Adjuntar XML Facturae 3.2.2 firmado con XAdES
Dim xmlFacturae As Byte() = File.ReadAllBytes("factura_XML_Facturae_3_2_2.xml")
pdf.EmbedFile(xmlFacturae, "factura.xml", "application/xml")
' PDF/A-3B para archivo — permite adjuntos XML (requerido por Crea y Crece / FACe)
pdf.SaveAsPdfA("factura_pdfa3b_face.pdf", PdfAVersions.PdfA3B)
La plataforma FACe del sector público B2G ya acepta este formato. Para el SII (Suministro Inmediato de Información) de grandes empresas, el pipeline de generación PDF debe ser capaz de procesar miles de facturas en el plazo de 4 días hábiles desde la emisión — el motor Chromium de IronPDF es adecuado para este volumen cuando se reutiliza la instancia del renderer.
Otras alternativas a iText 7 AGPL para C
Aspose.PDF: Licencia propietaria, sin riesgo AGPL. API programática con modelo de objetos completo. Motor HTML Flying Saucer con soporte CSS limitado (sin flexbox). Suscripción anual (>1.199 €/desarrollador/año). Adecuado para equipos con inversión previa en el ecosistema Aspose.
Syncfusion PDF: Licencia propietaria, sin riesgo AGPL. Motor HTML WebKit con soporte CSS parcial. Edición comunitaria disponible para ISVs pequeños bajo cierto umbral de facturación. Coherente con la suite de componentes UI de Syncfusion.
QuestPDF: MIT para ingresos bajos; licencia comercial por encima de un umbral. Sin motor HTML — construcción programática con un DSL fluente. Adecuado para layouts bien definidos y previsibles; no recomendado para plantillas HTML mantenidas por equipos no técnicos.
PDFsharp/MigraDoc: MIT, sin restricciones de distribución. Sin motor HTML nativo. Adecuado para facturas sencillas con layouts programáticos básicos. Sin soporte nativo de firma digital, lo que obliga a soluciones externas para PAdES/TicketBAI.
Tabla comparativa de alternativas a iText 7 para ISVs españoles
| Criterio | IronPDF | Aspose.PDF | Syncfusion | QuestPDF | PDFsharp |
|---|---|---|---|---|---|
| Licencia | Comercial perpetua | Suscripción anual | Comercial / Comunidad | MIT / Comercial por umbral | MIT |
| Riesgo AGPL | Ninguno | Ninguno | Ninguno | Ninguno | Ninguno |
| HTML a PDF | Chromium (CSS3/JS/flexbox) | Flying Saucer (limitado) | WebKit (parcial) | No nativo | No nativo |
| Firma PAdES / eIDAS | Sí | Sí | Sí | No integrado | No integrado |
| PDF/A-3 + adjuntos | Sí (XML Facturae) | Sí | Parcial | No | No |
| *VERIFACTU en plantilla HTML** | Directo en template | Programático | Programático | Programático | Programático |
| QR AEAT embebido | Imagen en HTML | Programático | Programático | Programático | Programático |
| API .NET | Tipada, IntelliSense | Tipada, verbosa | Tipada, moderada | DSL fluente | Básica |
| Async/await | Nativo | Limitado | Limitado | Nativo | No |
| Thread-safety | Por diseño | Por proceso | Variable | Por diseño | Limitado |
| Precio entrada | 749 $ (pago único) | >1.199 €/dev/año | Por cotización | Gratuita (umbral) | Gratuita |
Migración práctica de iText 7 a IronPDF en un proyecto de facturación
Para un ISV que ya tiene lógica de facturación sobre iText 7 y necesita migrar, las operaciones más comunes tienen equivalentes directos:
Fusión de PDFs
// iText 7
using iText.Kernel.Pdf;
using iText.Kernel.Utils;
PdfDocument resultado = new PdfDocument(new PdfWriter("fusionado.pdf"));
PdfMerger merger = new PdfMerger(resultado);
foreach (string archivo in archivos)
{
PdfDocument src = new PdfDocument(new PdfReader(archivo));
merger.Merge(src, 1, src.GetNumberOfPages());
src.Close();
}
resultado.Close();
// IronPDF
var pdfs = archivos.Select(f => PdfDocument.FromFile(f)).ToList();
var fusionado = PdfDocument.Merge(pdfs);
fusionado.SaveAs("fusionado.pdf");
pdfs.ForEach(p => p.Dispose());
// iText 7
using iText.Kernel.Pdf;
using iText.Kernel.Utils;
PdfDocument resultado = new PdfDocument(new PdfWriter("fusionado.pdf"));
PdfMerger merger = new PdfMerger(resultado);
foreach (string archivo in archivos)
{
PdfDocument src = new PdfDocument(new PdfReader(archivo));
merger.Merge(src, 1, src.GetNumberOfPages());
src.Close();
}
resultado.Close();
// IronPDF
var pdfs = archivos.Select(f => PdfDocument.FromFile(f)).ToList();
var fusionado = PdfDocument.Merge(pdfs);
fusionado.SaveAs("fusionado.pdf");
pdfs.ForEach(p => p.Dispose());
Imports iText.Kernel.Pdf
Imports iText.Kernel.Utils
Dim resultado As New PdfDocument(New PdfWriter("fusionado.pdf"))
Dim merger As New PdfMerger(resultado)
For Each archivo As String In archivos
Dim src As New PdfDocument(New PdfReader(archivo))
merger.Merge(src, 1, src.GetNumberOfPages())
src.Close()
Next
resultado.Close()
' IronPDF
Dim pdfs = archivos.Select(Function(f) PdfDocument.FromFile(f)).ToList()
Dim fusionado = PdfDocument.Merge(pdfs)
fusionado.SaveAs("fusionado.pdf")
pdfs.ForEach(Sub(p) p.Dispose())
Extracción de texto (para validación de contenido de facturas)
// iText 7
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas.Parser;
using (PdfDocument pdfDoc = new PdfDocument(new PdfReader("factura.pdf")))
{
for (int i = 1; i <= pdfDoc.GetNumberOfPages(); i++)
{
string texto = PdfTextExtractor.GetTextFromPage(pdfDoc.GetPage(i));
Console.WriteLine(texto);
}
}
// IronPDF
var pdf = PdfDocument.FromFile("factura.pdf");
foreach (var pagina in pdf.Pages)
{
Console.WriteLine(pagina.Text);
}
// iText 7
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas.Parser;
using (PdfDocument pdfDoc = new PdfDocument(new PdfReader("factura.pdf")))
{
for (int i = 1; i <= pdfDoc.GetNumberOfPages(); i++)
{
string texto = PdfTextExtractor.GetTextFromPage(pdfDoc.GetPage(i));
Console.WriteLine(texto);
}
}
// IronPDF
var pdf = PdfDocument.FromFile("factura.pdf");
foreach (var pagina in pdf.Pages)
{
Console.WriteLine(pagina.Text);
}
Imports iText.Kernel.Pdf
Imports iText.Kernel.Pdf.Canvas.Parser
Using pdfDoc As New PdfDocument(New PdfReader("factura.pdf"))
For i As Integer = 1 To pdfDoc.GetNumberOfPages()
Dim texto As String = PdfTextExtractor.GetTextFromPage(pdfDoc.GetPage(i))
Console.WriteLine(texto)
Next
End Using
' IronPDF
Dim pdf = PdfDocument.FromFile("factura.pdf")
For Each pagina In pdf.Pages
Console.WriteLine(pagina.Text)
Next
Cifrado para protección de datos bajo LOPDGDD
Las facturas contienen datos personales del destinatario (nombre, NIF, dirección) sujetos a la LOPDGDD y a la supervisión de la AEPD. El cifrado del PDF en tránsito y en reposo es una práctica recomendada bajo el marco de protección de datos:
// IronPDF: cifrado con contraseñas diferenciadas para propietario y usuario
var pdf = PdfDocument.FromFile("factura_datos_personales.pdf");
pdf.SecuritySettings.OwnerPassword = "password-administrador";
pdf.SecuritySettings.UserPassword = "password-receptor";
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserAnnotations = false;
pdf.SaveAs("factura_protegida_lopdgdd.pdf");
// IronPDF: cifrado con contraseñas diferenciadas para propietario y usuario
var pdf = PdfDocument.FromFile("factura_datos_personales.pdf");
pdf.SecuritySettings.OwnerPassword = "password-administrador";
pdf.SecuritySettings.UserPassword = "password-receptor";
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserAnnotations = false;
pdf.SaveAs("factura_protegida_lopdgdd.pdf");
' IronPDF: cifrado con contraseñas diferenciadas para propietario y usuario
Dim pdf = PdfDocument.FromFile("factura_datos_personales.pdf")
pdf.SecuritySettings.OwnerPassword = "password-administrador"
pdf.SecuritySettings.UserPassword = "password-receptor"
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserAnnotations = False
pdf.SaveAs("factura_protegida_lopdgdd.pdf")
Recursos para el mercado español
- Documentación IronPDF en español
- Guía de firma digital PAdES con IronPDF
- Conformidad PDF/A para archivo bajo Crea y Crece
- HTML a PDF con motor Chromium — CSS3 y flexbox
Inicia la evaluación técnica con prueba completa de 30 días para verificar la compatibilidad de IronPDF con tu arquitectura de facturación VeriFactu.
Preguntas Frecuentes
¿Por qué la licencia AGPL de iText 7 es un riesgo específico en España bajo VeriFactu?
En España, los proveedores de software de facturación no conforme con VeriFactu (RDL 15/2025) pueden ser sancionados con hasta €150.000/año. Usar iText 7 AGPL sin licencia comercial en ese software añade simultáneamente obligación de divulgación copyleft y riesgo de sanción regulatoria sobre el mismo componente — una intersección de dos vectores de riesgo independientes que se activan juntos.
¿IronPDF es un sistema de facturación certificado 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.
¿Puede IronPDF generar facturas con la leyenda VERI*FACTU y el QR de la AEAT?
Sí. IronPDF usa el motor Chromium para renderizar plantillas HTML a PDF. La leyenda VERI*FACTU (con asterisco literal) y 'Factura verificable en la sede electrónica de la AEAT' se incluyen en la plantilla HTML y se preservan fielmente en el PDF generado. El QR de verificación AEAT se embebe como imagen en la plantilla.
¿IronPDF soporta firma PAdES con certificados FNMT para TicketBAI?
Sí. IronPDF proporciona PdfSignature con soporte para X509Certificate2, compatible con certificados emitidos por la FNMT (Fábrica Nacional de Moneda y Timbre) y otras CAs acreditadas bajo eIDAS. La firma PAdES resultante es válida para TicketBAI en Bizkaia (BATUZ), Gipuzkoa y Araba.
¿Cuál es la diferencia entre el motor HTML de IronPDF y el de Aspose.PDF para plantillas de factura?
IronPDF usa Chromium (CSS3 completo, JavaScript, Flexbox, Grid) — el mismo motor que Chrome. Aspose.PDF usa Flying Saucer, que no soporta CSS Grid ni Flexbox. Para plantillas de factura modernas con layouts complejos, esto puede obligar a adaptar o simplificar el diseño al migrar a Aspose.
¿IronPDF soporta PDF/A-3 con XML Facturae adjunto para FACe y Crea y Crece?
Sí. IronPDF incluye SaveAsPdfA() con soporte para PDF/A-3B y EmbedFile() para adjuntar el XML Facturae 3.2.2. 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 (EN 16931/CIUS-ES).
¿QuestPDF es una alternativa viable a iText 7 para VeriFactu?
QuestPDF tiene licencia MIT para uso comercial (desde v2023.x) y es adecuado para facturas con layout estructurado. Sin embargo, no incluye firma PAdES nativa ni PDF/A-3, por lo que requeriría integración adicional para cumplir los requisitos completos de VeriFactu, TicketBAI y Facturae/FACe.



