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:
- Generador DynamicPDF: Crea archivos PDF desde cero
- DynamicPDF Merger: fusiona, divide y manipula archivos PDF existentes (compra por separado)
- DynamicPDF Core Suite: Generador y fusión combinados
- DynamicPDF ReportWriter: Generación de informes
- DynamicPDF HTML Converter: Conversión de HTML a PDF (complemento independiente)
- 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
- Paquete único: un paquete NuGet reemplaza de 3 a 5 paquetes DynamicPDF
- Renderizado moderno: motor Chromium versus renderizado tradicional
- Tecnologías web: utilice HTML/CSS en lugar de posicionamiento basado en coordenadas
- API más sencilla: menos código, más legible, mantenimiento más sencillo
- Sin compras adicionales: HTML, fusión y seguridad, todo incluido
- 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")
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
Paquetes comunes a tener en cuenta:
ceTe.DynamicPDF.CoreSuite.NETceTe.DynamicPDF.Generator.NETceTe.DynamicPDF.Merger.NETceTe.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
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
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"
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
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
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
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
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
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
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")
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")
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>";
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}"
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
};
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";
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*FACTUoFactura verificable en la sede electrónica de la AEATsi 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.

