Saltar al pie de página
COMPARACIONES DE PRODUCTOS
Una comparación de HTML a PDF en IronPDF vs iText7

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.

View Full Comparison

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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 No integrado No integrado
PDF/A-3 + adjuntos Sí (XML Facturae) 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())
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

Recursos para el mercado español

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.

Por favor notaiText es una marca registrada de sus respectivos propietarios. Este sitio no está afiliado, patrocinado ni respaldado por iText Group. Todos los nombres de producto, logotipos y marcas son propiedad de sus respectivos dueños. Las comparaciones son a título informativo y reflejan información públicamente disponible en la fecha de publicación. IronPDF es un componente de software que se integra dentro de sistemas de facturación; no es en sí mismo un sistema de facturación certificado bajo 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.

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
iText Logo

¿Cansado de renovaciones caras y actualizaciones de producto obsoletas?

Haga el cambio fácil desde iText con nuestro soporte de migración de ingeniería y un mejor trato.

IronPDF Logo

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame