Saltar al pie de página
GUíAS DE MIGRACIóN

Migrar de DynamicPDF a IronPDF: consolidar licencias y cumplir VeriFactu, TicketBAI y Crea y Crece

¿Por qué migrar de DynamicPDF a IronPDF?

Para los ISVs y desarrolladores españoles que generan documentos PDF bajo los marcos regulatorios VeriFactu (RDL 15/2025), TicketBAI (Bizkaia, Gipuzkoa, Araba) o Facturae XML para FACe, la fragmentación del producto DynamicPDF en 3-5 licencias separadas no es solo un inconveniente técnico: es un riesgo de cumplimiento. Una renovación fallida de una sola licencia DynamicPDF puede interrumpir la cadena de generación de facturas conformes, exponiendo al ISV a la penalización de hasta 150.000 €/año del régimen VeriFactu. Comprender el modelo de licencias es esencial para evaluar el coste real — y el riesgo regulatorio real — de su implementación actual.

El problema de la fragmentación de productos

DynamicPDF se vende como productos separados con licencias separadas:

  1. Generador DynamicPDF: Crea archivos PDF desde cero
  2. DynamicPDF Merger: fusiona, divide y manipula archivos PDF existentes (compra por separado)
  3. DynamicPDF Core Suite: Generador y fusión combinados
  4. DynamicPDF ReportWriter: Generación de informes
  5. DynamicPDF HTML Converter: Conversión de HTML a PDF (complemento independiente)
  6. DynamicPDF Print Manager: Imprima archivos PDF mediante programación

Una solución PDF completa requiere de 3 a 5 licencias independientes con DynamicPDF. IronPDF lo incluye todo en un solo paquete.

Comparación de arquitecturas

Aspecto DynamicPDF IronPDF
Modelo de producto Fragmentado (más de 5 productos) Biblioteca todo en uno
Licencias Se requieren varias licencias Licencia única
HTML a PDF Compra adicional por separado Integrado, basado en Chromium
Soporte CSS Limitado (requiere complemento) CSS3 completo con Flexbox/Grid
Estilo API Posicionamiento basado en coordenadas HTML/CSS + API de manipulación
Curva de aprendizaje Steep (varias API) Suave (tecnologías web)
Moderno .NET .NET Standard 2.0 .NET 6/7/8/9+ nativo

Beneficios clave de la migración

  1. Paquete único: un paquete NuGet reemplaza de 3 a 5 paquetes DynamicPDF
  2. Renderizado moderno: motor Chromium versus renderizado tradicional
  3. Tecnologías web: utilice HTML/CSS en lugar de posicionamiento basado en coordenadas
  4. API más sencilla: menos código, más legible, mantenimiento más sencillo
  5. Sin compras adicionales: HTML, fusión y seguridad, todo incluido
  6. Conformidad regulatoria española: soporte nativo para leyenda VERI*FACTU, QR de la AEAT y firma XAdES para TicketBAI con licencia comercial predecible

Contexto regulatorio español: licencias fragmentadas y riesgo VeriFactu

Para los equipos de desarrollo españoles, la fragmentación de licencias de DynamicPDF cobra una dimensión adicional bajo el régimen de VeriFactu y el ecosistema de facturación electrónica:

VeriFactu y Crea y Crece (Real Decreto-Ley 15/2025): los proveedores de software de facturación deben incluir la leyenda VERI*FACTU o Factura verificable en la sede electrónica de la AEAT en las representaciones gráficas. Con DynamicPDF, la generación del PDF de la factura (Generator) y la eventual fusión con documentos de cabecera (Merger) requieren dos licencias separadas. Una renovación fallida de una sola licencia puede interrumpir la cadena de generación de documentos conformes, exponiendo al ISV a la penalización de hasta 150.000 €/año establecida por el RDL 15/2025.

TicketBAI (Bizkaia, Gipuzkoa, Araba): la generación de facturas TicketBAI requiere firma XAdES y un QR específico por territorio histórico. La API basada en coordenadas de DynamicPDF dificulta la composición dinámica de estos elementos en la representación gráfica PDF; IronPDF, con renderizado HTML/CSS y firma integrada, simplifica este flujo.

Facturae XML / FACe: para el sector público, los PDFs que acompañan a los XML Facturae son un requisito operativo. Gestionar dos licencias DynamicPDF (Generator + HtmlConverter) para este flujo introduce superficie de error adicional en comparación con el paquete único de IronPDF.

Riesgo de licencia comercial: a diferencia de iText (cuya licencia AGPL puede obligar a publicar el código fuente del sistema de facturación), DynamicPDF es comercial pero fragmentado. IronPDF ofrece una licencia comercial única y predecible que cubre todos los escenarios de generación PDF en flujos de cumplimiento VeriFactu.

Ejemplo: factura VeriFactu con NIF/CIF y formato EUR español en IronPDF

El siguiente ejemplo genera una factura conforme con VeriFactu (RDL 15/2025) utilizando notación española de divisa (EUR 1.234,56 €), NIF del emisor y CIF del receptor, y la leyenda obligatoria VERI*FACTU. DynamicPDF requeriría Generator + HtmlConverter (dos licencias); IronPDF genera el documento completo con un único paquete:

using IronPdf;

// Generar factura conforme con leyenda VERI*FACTU
var renderer = new ChromePdfRenderer();
var html = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        .header { display: flex; justify-content: space-between; align-items: flex-start; }
        .verifactu-legend {
            border: 2px solid #003366;
            padding: 8px 12px;
            font-size: 10px;
            text-align: center;
            margin-top: 20px;
        }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { border: 1px solid #ccc; padding: 8px; }
        th { background-color: #003366; color: white; }
    </style>
</head>
<body>
    <div class='header'>
        <div>
            <strong>FACTURA</strong> Nº 2026-0042<br>
            Fecha: 20/05/2026<br>
            NIF Emisor: B-12345678
        </div>
        <div>CIF Receptor: A-98765432</div>
    </div>

    <table>
        <tr><th>Concepto</th><th>Cantidad</th><th>Precio unit.</th><th>Base imponible</th><th>IVA (21%)</th><th>Total</th></tr>
        <tr><td>Servicio de desarrollo</td><td>10 h</td><td>80,00 €</td><td>800,00 €</td><td>168,00 €</td><td>968,00 €</td></tr>
    </table>

    <div class='verifactu-legend'>
        <strong>VERI*FACTU</strong><br>
        Factura verificable en la sede electrónica de la AEAT<br>
        [QR AEAT — sede.agenciatributaria.gob.es]
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("factura-verifactu-2026-0042.pdf");
using IronPdf;

// Generar factura conforme con leyenda VERI*FACTU
var renderer = new ChromePdfRenderer();
var html = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        .header { display: flex; justify-content: space-between; align-items: flex-start; }
        .verifactu-legend {
            border: 2px solid #003366;
            padding: 8px 12px;
            font-size: 10px;
            text-align: center;
            margin-top: 20px;
        }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { border: 1px solid #ccc; padding: 8px; }
        th { background-color: #003366; color: white; }
    </style>
</head>
<body>
    <div class='header'>
        <div>
            <strong>FACTURA</strong> Nº 2026-0042<br>
            Fecha: 20/05/2026<br>
            NIF Emisor: B-12345678
        </div>
        <div>CIF Receptor: A-98765432</div>
    </div>

    <table>
        <tr><th>Concepto</th><th>Cantidad</th><th>Precio unit.</th><th>Base imponible</th><th>IVA (21%)</th><th>Total</th></tr>
        <tr><td>Servicio de desarrollo</td><td>10 h</td><td>80,00 €</td><td>800,00 €</td><td>168,00 €</td><td>968,00 €</td></tr>
    </table>

    <div class='verifactu-legend'>
        <strong>VERI*FACTU</strong><br>
        Factura verificable en la sede electrónica de la AEAT<br>
        [QR AEAT — sede.agenciatributaria.gob.es]
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("factura-verifactu-2026-0042.pdf");
Imports IronPdf

' Generar factura conforme con leyenda VERI*FACTU
Dim renderer As New ChromePdfRenderer()
Dim html As String = "
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        .header { display: flex; justify-content: space-between; align-items: flex-start; }
        .verifactu-legend {
            border: 2px solid #003366;
            padding: 8px 12px;
            font-size: 10px;
            text-align: center;
            margin-top: 20px;
        }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { border: 1px solid #ccc; padding: 8px; }
        th { background-color: #003366; color: white; }
    </style>
</head>
<body>
    <div class='header'>
        <div>
            <strong>FACTURA</strong> Nº 2026-0042<br>
            Fecha: 20/05/2026<br>
            NIF Emisor: B-12345678
        </div>
        <div>CIF Receptor: A-98765432</div>
    </div>

    <table>
        <tr><th>Concepto</th><th>Cantidad</th><th>Precio unit.</th><th>Base imponible</th><th>IVA (21%)</th><th>Total</th></tr>
        <tr><td>Servicio de desarrollo</td><td>10 h</td><td>80,00 €</td><td>800,00 €</td><td>168,00 €</td><td>968,00 €</td></tr>
    </table>

    <div class='verifactu-legend'>
        <strong>VERI*FACTU</strong><br>
        Factura verificable en la sede electrónica de la AEAT<br>
        [QR AEAT — sede.agenciatributaria.gob.es]
    </div>
</body>
</html>"

Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("factura-verifactu-2026-0042.pdf")
$vbLabelText   $csharpLabel

Con DynamicPDF, este mismo documento requiere Generator + HtmlConverter (dos licencias separadas con ciclos de renovación independientes). Con IronPDF: un único paquete NuGet, una única licencia, sin riesgo de interrupción por renovación parcial.

Preparación de la migración

Prerrequisitos

Asegúrese de que su entorno cumple estos requisitos:

  • .NET Framework 4.6.2+ o .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ o VS Code con extensión de C#
  • Acceso al gestor de paquetes NuGet
  • Clave de licencia de IronPDF (prueba gratuita disponible en ironpdf.com)

Auditar el uso de DynamicPDF

Ejecute estos comandos en su directorio de soluciones para identificar todas las referencias a DynamicPDF:

# Find all DynamicPDF references
grep -r "ceTe.DynamicPDF\|DynamicPDF" --include="*.cs" --include="*.csproj" .

# Check NuGet packages
dotnet list package | grep -i dynamic
# Find all DynamicPDF references
grep -r "ceTe.DynamicPDF\|DynamicPDF" --include="*.cs" --include="*.csproj" .

# Check NuGet packages
dotnet list package | grep -i dynamic
SHELL

Paquetes comunes a tener en cuenta:

  • ceTe.DynamicPDF.CoreSuite.NET
  • ceTe.DynamicPDF.Generator.NET
  • ceTe.DynamicPDF.Merger.NET
  • ceTe.DynamicPDF.HtmlConverter.NET

Entendiendo el cambio de paradigma

El cambio más significativo al migrar de DynamicPDF a IronPDF es el enfoque fundamental de la creación de documentos. DynamicPDF utiliza un posicionamiento basado en coordenadas en el que los elementos se colocan en coordenadas X,Y específicas en una página. IronPDF utiliza renderizado HTML/CSS donde se diseña con tecnologías web.

Este cambio de paradigma significa convertir los elementos Label, TextArea y Table2 en sus equivalentes HTML, un cambio que generalmente resulta en un código más legible y fácil de mantener.

Proceso de migración paso a paso

Paso 1: Actualizar paquetes NuGet

Elimine todos los paquetes de DynamicPDF e instale IronPDF:

# Remove DynamicPDF packages
dotnet remove package ceTe.DynamicPDF.CoreSuite.NET
dotnet remove package ceTe.DynamicPDF.Generator.NET
dotnet remove package ceTe.DynamicPDF.Merger.NET
dotnet remove package ceTe.DynamicPDF.HtmlConverter.NET

# Install IronPDF
dotnet add package IronPdf
# Remove DynamicPDF packages
dotnet remove package ceTe.DynamicPDF.CoreSuite.NET
dotnet remove package ceTe.DynamicPDF.Generator.NET
dotnet remove package ceTe.DynamicPDF.Merger.NET
dotnet remove package ceTe.DynamicPDF.HtmlConverter.NET

# Install IronPDF
dotnet add package IronPdf
SHELL

Paso 2: Actualizar referencias de espacios de nombres

Sustituya los espacios de nombres DynamicPDF por IronPDF:

// Remove these
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
using ceTe.DynamicPDF.Conversion;

// Add this
using IronPdf;
// Remove these
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
using ceTe.DynamicPDF.Conversion;

// Add this
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

Paso 3: Configurar la licencia

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Referencia completa de migración de API

Mapeo de clases principales

Clase DynamicPDF Equivalente de IronPDF
Document ChromePdfRenderer
Document PdfDocument
Page HTML <div> con salto de página
MergeDocument PdfDocument.Merge()
HtmlConverter ChromePdfRenderer

Mapeo de elementos de página a HTML

DynamicPDF PageElement Equivalente IronPDF/HTML
Label <p>, <span>, <div>
TextArea <div>, <p> con CSS
Image Etiqueta <img>
Table2 HTML <table>
PageNumberingLabel {page} / {total-pages} marcadores de posición

Claves de la API

DynamicPDF IronPDF
Document + Page ChromePdfRenderer
Label, TextArea HTML <p>, <div>
Table2 HTML <table>
MergeDocument PdfDocument.Merge()
HtmlConverter ChromePdfRenderer
document.Draw() pdf.SaveAs() / pdf.BinaryData
PageNumberingLabel %%CP%% {page} marcador de posición

Ejemplos de migración de código

Conversión de HTML a PDF

La conversión de HTML a PDF demuestra el requisito de DynamicPDF de un complemento HtmlConverter independiente frente a la representación Chromium integrada de IronPDF.

Implementación de DynamicPDF:

// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Conversion;

class Program
{
    static void Main()
    {
        string html = "<html><body><h1>Hello World</h1></body></html>";
        HtmlConverter converter = new HtmlConverter(html);
        converter.Convert("output.pdf");
    }
}
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Conversion;

class Program
{
    static void Main()
    {
        string html = "<html><body><h1>Hello World</h1></body></html>";
        HtmlConverter converter = new HtmlConverter(html);
        converter.Convert("output.pdf");
    }
}
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.Conversion

Class Program
    Shared Sub Main()
        Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
        Dim converter As New HtmlConverter(html)
        converter.Convert("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Implementación de IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        string html = "<html><body><h1>Hello World</h1></body></html>";
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        string html = "<html><body><h1>Hello World</h1></body></html>";
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

ChromePdfRenderer de IronPDF proporciona renderizado basado en Chromium con soporte completo para CSS3, sin necesidad de comprar ningún complemento por separado. Para más opciones, consulte la documentación HTML a PDF.

Fusión de varios PDF

La fusión de PDF demuestra la diferencia entre la clase MergeDocument de DynamicPDF (que requiere la licencia del producto Merger) y el método estático integrado Merge de IronPDF.

Implementación de DynamicPDF:

// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Merger;

class Program
{
    static void Main()
    {
        MergeDocument document = new MergeDocument("document1.pdf");
        document.Append("document2.pdf");
        document.Draw("merged.pdf");
    }
}
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Merger;

class Program
{
    static void Main()
    {
        MergeDocument document = new MergeDocument("document1.pdf");
        document.Append("document2.pdf");
        document.Draw("merged.pdf");
    }
}
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.Merger

Class Program
    Shared Sub Main()
        Dim document As New MergeDocument("document1.pdf")
        document.Append("document2.pdf")
        document.Draw("merged.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Implementación de IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");
        var merged = PdfDocument.Merge(pdf1, pdf2);
        merged.SaveAs("merged.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");
        var merged = PdfDocument.Merge(pdf1, pdf2);
        merged.SaveAs("merged.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim pdf1 = PdfDocument.FromFile("document1.pdf")
        Dim pdf2 = PdfDocument.FromFile("document2.pdf")
        Dim merged = PdfDocument.Merge(pdf1, pdf2)
        merged.SaveAs("merged.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

El método estático Merge de IronPDF acepta múltiples objetos PdfDocument directamente. Para obtener más opciones, consulte la documentación de fusión de PDF.

Añadir texto a PDF

La ubicación del texto demuestra el cambio de paradigma de los elementos Label basados en coordenadas de DynamicPDF a los elementos TextStamper basados en HTML de IronPDF.

Implementación de DynamicPDF:

// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;

class Program
{
    static void Main()
    {
        Document document = new Document();
        Page page = new Page(PageSize.Letter);
        Label label = new Label("Hello from DynamicPDF!", 0, 0, 504, 100);
        page.Elements.Add(label);
        document.Pages.Add(page);
        document.Draw("output.pdf");
    }
}
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;

class Program
{
    static void Main()
    {
        Document document = new Document();
        Page page = new Page(PageSize.Letter);
        Label label = new Label("Hello from DynamicPDF!", 0, 0, 504, 100);
        page.Elements.Add(label);
        document.Pages.Add(page);
        document.Draw("output.pdf");
    }
}
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.PageElements

Class Program
    Shared Sub Main()
        Dim document As New Document()
        Dim page As New Page(PageSize.Letter)
        Dim label As New Label("Hello from DynamicPDF!", 0, 0, 504, 100)
        page.Elements.Add(label)
        document.Pages.Add(page)
        document.Draw("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Implementación de IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
        var textStamper = new TextStamper()
        {
            Text = "Hello from IronPDF!",
            FontSize = 20,
            VerticalAlignment = VerticalAlignment.Top
        };
        pdf.ApplyStamp(textStamper);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
        var textStamper = new TextStamper()
        {
            Text = "Hello from IronPDF!",
            FontSize = 20,
            VerticalAlignment = VerticalAlignment.Top
        };
        pdf.ApplyStamp(textStamper);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Editing

Class Program
    Shared Sub Main()
        Dim renderer As New ChromePdfRenderer()
        Dim pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>")
        Dim textStamper As New TextStamper() With {
            .Text = "Hello from IronPDF!",
            .FontSize = 20,
            .VerticalAlignment = VerticalAlignment.Top
        }
        pdf.ApplyStamp(textStamper)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

El código TextStamper de IronPDF proporciona un posicionamiento basado en la alineación en lugar de una ubicación basada en coordenadas, lo que hace que los diseños sean más adaptables a diferentes tamaños de página. Para más opciones, consulte la documentación sobre marcas de agua y sellos.

Ejemplo completo de generación de documentos

Este completo ejemplo muestra la conversión de un documento DynamicPDF con múltiples elementos al enfoque HTML de IronPDF.

Implementación de DynamicPDF:

using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;

// Generation (requires Generator license)
Document document = new Document();
Page page = new Page(PageSize.A4);
Label title = new Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18);
title.Align = TextAlign.Center;
page.Elements.Add(title);

Table2 table = new Table2(40, 60, 515, 500);
// ... complex table setup with columns, rows, cells...
page.Elements.Add(table);
document.Pages.Add(page);
document.Draw("invoice.pdf");

// Merging (requires Merger license)
MergeDocument mergeDoc = new MergeDocument("cover.pdf");
mergeDoc.Append("invoice.pdf");
mergeDoc.Draw("final.pdf");
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;

// Generation (requires Generator license)
Document document = new Document();
Page page = new Page(PageSize.A4);
Label title = new Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18);
title.Align = TextAlign.Center;
page.Elements.Add(title);

Table2 table = new Table2(40, 60, 515, 500);
// ... complex table setup with columns, rows, cells...
page.Elements.Add(table);
document.Pages.Add(page);
document.Draw("invoice.pdf");

// Merging (requires Merger license)
MergeDocument mergeDoc = new MergeDocument("cover.pdf");
mergeDoc.Append("invoice.pdf");
mergeDoc.Draw("final.pdf");
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.PageElements
Imports ceTe.DynamicPDF.Merger

' Generation (requires Generator license)
Dim document As New Document()
Dim page As New Page(PageSize.A4)
Dim title As New Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18)
title.Align = TextAlign.Center
page.Elements.Add(title)

Dim table As New Table2(40, 60, 515, 500)
' ... complex table setup with columns, rows, cells...
page.Elements.Add(table)
document.Pages.Add(page)
document.Draw("invoice.pdf")

' Merging (requires Merger license)
Dim mergeDoc As New MergeDocument("cover.pdf")
mergeDoc.Append("invoice.pdf")
mergeDoc.Draw("final.pdf")
$vbLabelText   $csharpLabel

Implementación de IronPDF:

using IronPdf;

var renderer = new ChromePdfRenderer();

// All features in one library
var html = @"
<html>
<head>
    <style>
        body { font-family: Helvetica, sans-serif; padding: 40px; }
        h1 { text-align: center; font-size: 18pt; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { border: 1px solid #ccc; padding: 8px; }
    </style>
</head>
<body>
    <h1>Invoice Report</h1>
    <table>
        <tr><th>Product</th><th>Qty</th><th>Price</th></tr>
        <tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
    </table>
</body>
</html>";

var invoice = renderer.RenderHtmlAsPdf(html);

// Merging included - no separate license
var cover = PdfDocument.FromFile("cover.pdf");
var final = PdfDocument.Merge(cover, invoice);
final.SaveAs("final.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

// All features in one library
var html = @"
<html>
<head>
    <style>
        body { font-family: Helvetica, sans-serif; padding: 40px; }
        h1 { text-align: center; font-size: 18pt; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { border: 1px solid #ccc; padding: 8px; }
    </style>
</head>
<body>
    <h1>Invoice Report</h1>
    <table>
        <tr><th>Product</th><th>Qty</th><th>Price</th></tr>
        <tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
    </table>
</body>
</html>";

var invoice = renderer.RenderHtmlAsPdf(html);

// Merging included - no separate license
var cover = PdfDocument.FromFile("cover.pdf");
var final = PdfDocument.Merge(cover, invoice);
final.SaveAs("final.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' All features in one library
Dim html As String = "
<html>
<head>
    <style>
        body { font-family: Helvetica, sans-serif; padding: 40px; }
        h1 { text-align: center; font-size: 18pt; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { border: 1px solid #ccc; padding: 8px; }
    </style>
</head>
<body>
    <h1>Invoice Report</h1>
    <table>
        <tr><th>Product</th><th>Qty</th><th>Price</th></tr>
        <tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
    </table>
</body>
</html>"

Dim invoice As PdfDocument = renderer.RenderHtmlAsPdf(html)

' Merging included - no separate license
Dim cover As PdfDocument = PdfDocument.FromFile("cover.pdf")
Dim final As PdfDocument = PdfDocument.Merge(cover, invoice)
final.SaveAs("final.pdf")
$vbLabelText   $csharpLabel

Notas de migración críticas

Posicionamiento basado en coordenadas a HTML/CSS

El cambio de paradigma fundamental requiere convertir el posicionamiento por coordenadas X,Y a diseños basados en CSS:

// DynamicPDF - coordinate-based
var label = new Label("Hello World", 100, 200, 300, 50);

// IronPDF - CSS positioning (if absolute positioning needed)
var html = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>";

// IronPDF - preferred approach (flow-based)
var html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>";
// DynamicPDF - coordinate-based
var label = new Label("Hello World", 100, 200, 300, 50);

// IronPDF - CSS positioning (if absolute positioning needed)
var html = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>";

// IronPDF - preferred approach (flow-based)
var html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>";
$vbLabelText   $csharpLabel

Sintaxis de numeración de páginas

DynamicPDF e IronPDF utilizan una sintaxis diferente para los números de página:

// DynamicPDF placeholders
"Page %%CP%% of %%TP%%"

// IronPDF placeholders
"Page {page} of {total-pages}"
// DynamicPDF placeholders
"Page %%CP%% of %%TP%%"

// IronPDF placeholders
"Page {page} of {total-pages}"
$vbLabelText   $csharpLabel

Cabeceras y pies de página

Convertir elementos DynamicPDF Template a IronPDF HtmlHeaderFooter:

// IronPDF header/footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
// IronPDF header/footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
$vbLabelText   $csharpLabel

Para más opciones de encabezado/pie de página, consulte la documentación sobre encabezados y pies de página.

Configuración de seguridad

// IronPDF security
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";
// IronPDF security
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";
$vbLabelText   $csharpLabel

Para conocer opciones de seguridad integrales, consulte la documentación de cifrado.

Cumplimiento LOPDGDD, eIDAS y Crea y Crece: el entorno regulatorio completo

Migrar a un componente PDF que soporte el entorno completo de facturación electrónica española reduce el riesgo de un segundo cambio de motor cuando entren en vigor los siguientes plazos regulatorios.

LOPDGDD y protección de datos: Los PDFs de facturas contienen datos personales y fiscales (NIF/CIF, domicilio fiscal) sujetos a la LOPDGDD (Ley Orgánica de Protección de Datos y Garantía de Derechos Digitales) y supervisados por la AEPD (Agencia Española de Protección de Datos). IronPDF permite el procesamiento on-premise, manteniendo los datos de facturación dentro del perímetro de la organización sin enviar contenido a servicios externos — simplificando el análisis de cumplimiento LOPDGDD para ISVs que gestionan datos fiscales de contribuyentes españoles.

eIDAS y FNMT-RCM: Para la firma digital de facturas electrónicas conforme a eIDAS, IronPDF soporta certificados emitidos por la FNMT-RCM (Fábrica Nacional de Moneda y Timbre), la CA española reconocida por la AEAT. Las firmas PAdES y XAdES generadas con IronPDF son compatibles con los requisitos de FACe y la sede electrónica de la AEAT.

Crea y Crece — el siguiente horizonte: La Ley Crea y Crece establece la facturación electrónica B2B obligatoria en España: desde 2027 para empresas con facturación superior a 8M€ y desde 2028 para el resto. Las facturas deben cumplir el estándar europeo EN 16931 y su implementación española CIUS-ES, con formatos estructurados (Facturae XML) y adjunto en PDF/A para la representación visual. IronPDF soporta PDF/A, firmas PAdES y procesamiento en un único paquete — evitando un segundo cambio de motor cuando los plazos de Crea y Crece entren en vigor.

SII — integración en tiempo real: El SII (Suministro Inmediato de Información) obliga a las grandes empresas a comunicar los datos de facturación a la AEAT en tiempo real (plazo de 4 días). Los sistemas integrados con SII se benefician de un motor PDF predecible con una única licencia comercial, sin fragmentación de productos que pueda interrumpir el ciclo de emisión.

iText AGPL frente a IronPDF en el mercado español: DynamicPDF es comercial pero fragmentado; muchos equipos que migran desde DynamicPDF evalúan también iText/iText7. En España, la licencia AGPL de iText plantea una complejidad adicional para ISVs de software de facturación propietario: los que distribuyen soluciones propietarias con iText AGPL deben cumplir con las obligaciones de copyleft, lo que puede requerir publicar el código fuente. Esta restricción se amplifica bajo el régimen VeriFactu, donde la penalización de 150.000 €/año ya pesa sobre el modelo de negocio del ISV. IronPDF ofrece licenciamiento comercial único y predecible sin restricciones de distribución AGPL.

Lista de comprobación posterior a la migración

Después de completar la migración del código, verifique lo siguiente:

  • Comparación visual de los PDF generados
  • Verificar la posición y el diseño del texto
  • Probar la representación y el desbordamiento de la tabla
  • Verificar encabezados y pies de página en todas las páginas
  • Pruebe la funcionalidad de llenado de formularios
  • Verificar seguridad/cifrado
  • Evaluación comparativa del rendimiento
  • Eliminar archivos de licencia de DynamicPDF no utilizados
  • Actualización de la documentación
  • Incorporar leyenda VERI*FACTU o Factura verificable en la sede electrónica de la AEAT si el software gestiona facturación española
  • Validar QR de la AEAT y firma XAdES para TicketBAI (Bizkaia, Gipuzkoa, Araba) si aplica
  • Verificar compatibilidad con Facturae XML para envíos a FACe si se opera en el sector público
  • Verificar cumplimiento LOPDGDD para procesamiento on-premise de datos fiscales (NIF/CIF)
  • Confirmar soporte de certificados FNMT-RCM para firmas eIDAS

Consolide su arquitectura PDF antes de los plazos VeriFactu y Crea y Crece

Con .NET 10 en el horizonte y C# 14 introduciendo nuevas características del lenguaje, elegir una biblioteca PDF que adopte los patrones modernos de .NET garantiza la compatibilidad a largo plazo. Para los ISVs españoles bajo el régimen VeriFactu (RDL 15/2025) y el horizonte de Crea y Crece B2B e-invoicing, consolidar las 3-5 licencias fragmentadas de DynamicPDF en el paquete único de IronPDF elimina el riesgo de interrupción de servicio en flujos críticos de cumplimiento ante la AEAT. La licencia comercial única de IronPDF, sin restricciones de distribución AGPL, simplifica tanto la arquitectura técnica como el análisis de cumplimiento regulatorio — desde VeriFactu y TicketBAI (Bizkaia, Gipuzkoa, Araba) hasta el SII en tiempo real y los futuros requisitos Crea y Crece bajo EN 16931/CIUS-ES.

Recursos adicionales


La migración de DynamicPDF a IronPDF elimina la complejidad de gestionar varias licencias de productos, a la vez que proporciona un moderno renderizado basado en Chromium y compatibilidad total con CSS3. La transición del posicionamiento basado en coordenadas al diseño HTML/CSS suele dar como resultado un código más fácil de mantener que aprovecha las tecnologías web conocidas. Para los equipos españoles que trabajan con VeriFactu, TicketBAI o Facturae, la consolidación en un paquete único reduce la superficie de riesgo operativo en flujos de cumplimiento críticos.

Preguntas Frecuentes

¿Por qué la fragmentación de licencias de DynamicPDF es un riesgo bajo VeriFactu?

Con DynamicPDF, una solución PDF completa requiere 3-5 licencias independientes (Generator, Merger, HtmlConverter, etc.). Una renovación fallida de una sola licencia puede interrumpir la cadena de generación de facturas conformes con VeriFactu (RDL 15/2025). Los proveedores de software de facturación que operan con esta interrupción se exponen a la penalización de hasta 150.000 €/año. IronPDF consolida todo en un único paquete NuGet con una única licencia comercial.

¿IronPDF soporta TicketBAI con firma XAdES para Bizkaia, Gipuzkoa y Araba?

Sí. IronPDF incluye soporte nativo de firmas digitales XAdES, PAdES y CAdES. Las facturas TicketBAI para las tres Haciendas Forales del País Vasco (Bizkaia, Gipuzkoa, Araba) requieren firma XAdES — IronPDF proporciona esta capacidad dentro del mismo paquete, sin necesidad de bibliotecas externas adicionales como requería la arquitectura DynamicPDF fragmentada.

¿Qué diferencia hay entre DynamicPDF e iText AGPL para ISVs españoles de facturación?

DynamicPDF es comercial pero fragmentado; iText/iText7 utiliza licencia AGPL que obliga a los ISVs de software propietario a publicar su código fuente o adquirir licencia comercial de iText. En el contexto VeriFactu, donde los ISVs ya soportan la presión de la penalización de 150.000 €/año, la incertidumbre AGPL añade complejidad adicional. IronPDF ofrece licenciamiento comercial predecible sin restricciones AGPL.

¿Cómo simplifica IronPDF el cumplimiento LOPDGDD para facturas con NIF/CIF?

Los PDFs de facturas contienen datos personales (NIF, CIF, domicilio fiscal) sujetos a LOPDGDD y supervisados por la AEPD. IronPDF permite el procesamiento on-premise — el motor Chromium opera localmente dentro del perímetro de la organización, sin enviar datos de facturación a servicios externos. Esto simplifica el análisis de cumplimiento LOPDGDD para ISVs que gestionan datos fiscales de contribuyentes españoles.

¿IronPDF está preparado para los requisitos Crea y Crece (EN 16931/CIUS-ES)?

La Ley Crea y Crece establece facturación electrónica B2B obligatoria en España (desde 2027 para empresas >8M€ de facturación, desde 2028 para el resto). Las facturas deben cumplir EN 16931/CIUS-ES con adjunto PDF/A para representación visual. IronPDF soporta PDF/A, firmas PAdES y procesamiento en un único paquete, evitando un segundo cambio de motor cuando entren en vigor los plazos de Crea y Crece.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más

Equipo de soporte de Iron

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