De TextControl a IronPDF: cumplimiento VeriFactu, TicketBAI y LOPDGDD en España
Para los ISVs y equipos de desarrollo .NET en España, la migración de TextControl a IronPDF responde a una doble necesidad: simplificar la arquitectura de generación de PDF y cumplir con el marco regulatorio de facturación electrónica español. El Real Decreto-Ley 15/2025 (VeriFactu) obliga al software de facturación a generar PDF con la leyenda VERI\*FACTU e incrustar la huella encadenada verificable en la sede electrónica de la AEAT. TextControl, orientado principalmente a la edición de documentos DOCX, no dispone de las API necesarias para estos requisitos criptográficos. Los proveedores de software de facturación se exponen a sanciones de hasta 150.000 € anuales por incumplir VeriFactu.
TicketBAI —vigente en Bizkaia, Gipuzkoa y Araba— requiere firmas XAdES y PAdES conformes a eIDAS con certificados FNMT-RCM u otros reconocidos, que TextControl tampoco puede proporcionar. La Ley Crea y Crece exige Facturae XML incrustado en PDF/A-3 para la factura electrónica B2B a través de FACe, bajo el estándar europeo EN 16931 y el perfil CIUS-ES. IronPDF cubre todos estos requisitos de forma nativa, y su procesamiento completamente on-premise garantiza el cumplimiento con la LOPDGDD y la supervisión de la AEPD sin transferir datos a terceros.
TX Text Control es un completo componente editor de documentos para .NET con controles de interfaz de usuario integrados. Sin embargo, para los equipos cuyo principal requisito es la generación de PDF —especialmente en contextos de facturación electrónica española— su arquitectura presenta sobrecarga significativa en costes, complejidad y limitaciones regulatorias.
Esta guía proporciona una ruta de migración completa de TextControl a IronPDF, con instrucciones paso a paso, comparaciones de código y ejemplos prácticos para desarrolladores .NET que evalúan esta transición en el contexto normativo español.
Por qué migrar de TextControl
La decisión de migrar de TextControl suele centrarse en adaptar las herramientas a las necesidades reales. Control de texto TXes fundamentalmente un editor de documentos que trata la generación de PDF como una función secundaria. Entre las principales razones por las que los equipos de desarrollo se plantean la migración se incluyen:
Licencias costosas: TextControl opera con una licencia comercial a un mínimo de $3,398 por año por desarrollador. Un equipo de cuatro personas puede esperar invertir alrededor de 6.749 dólares al año, con costes adicionales por licencias de tiempo de ejecución de implementación en servidor. Los costes de renovación ascienden al 40% anual, lo que es obligatorio para mantener el acceso a las actualizaciones.
PDF como ocurrencia tardía: la arquitectura central es el procesamiento de textos, no PDF. Aunque existe la posibilidad de generar archivos PDF, se trata más de una función añadida que del objetivo principal, por lo que la calidad del resultado no es óptima.
Errores de hardware: el error de gráficos Intel Iris Xe afecta la representación de documentos en los procesadores Intel más nuevos (11.ª generación), lo que requiere una solución alternativa de registro para resolverlo.
Dependencias infladas: TextControl incluye componentes de interfaz de usuario de edición de documentos que posiblemente no necesite si su enfoque es puramente en la generación de PDF.
Arquitectura de procesador de textos: no optimizada para los flujos de trabajo de HTML a PDF que exigen las aplicaciones web modernas.
API compleja: el modelo de selección y gestión de contexto de ServerTextControl agrega una complejidad innecesaria a las tareas sencillas de generación de PDF.
Comparación de costes
| Aspecto | Control de texto TX | IronPDF |
|---|---|---|
| Licencia base | $3,398+ | Reducción significativa |
| Renovación anual | 40% obligatorio | Asistencia opcional |
| Por desarrollador | Sí | Sí |
| Componentes de interfaz de usuario | Paquete (bloat) | Enfocado a PDF |
| Coste total de 3 años | $5,750+ | Mucho más bajo |
IronPDFfrente a TextControl: Comparación de características
Comprender las diferencias arquitectónicas ayuda a los responsables técnicos a evaluar la inversión en migración:
| Característica | Control de texto TX | IronPDF |
|---|---|---|
| Enfoque principal | Edición DOCX | Generación de PDF |
| Coste de la licencia | 3.398 $/año por desarrollador | 749 $ una sola vez por desarrollador |
| Calidad PDF | Función básica y complementaria | Funciones principales |
| Compatibilidad de hardware | Problemas conocidos con Intel Iris | Estable en todos los dispositivos |
| Integración con la interfaz de usuario | Requiere componentes de interfaz de usuario | Sin sobrecarga de componentes de interfaz de usuario |
| Renderización HTML/CSS | Buggy con HTML | HTML5/CSS3 moderno |
| HTML a PDF | Sí (secundario) | Sí (principal) |
| Soporte CSS | Limitado | CSS3 completo |
| JavaScript | Limitado | ES2024 completo |
| URL a PDF | Configuración compleja | Nativo |
| Encabezados/pies de página | API complejas | HTML sencillo |
| Combinación de correspondencia | Propietario | Plantillas HTML |
| PDF/A | Sí | Sí |
| Protección por contraseña | Sí | Sí |
| Firmas digitales | Sí | Sí |
| Fusionar PDF | Limitado | Sí |
| Dividir PDF | Limitado | Sí |
| Gestión del contexto | Requerido | No es necesario |
| Multiplataforma | Centrado en Windows | Sí |
Inicio rápido: Migración de TextControl a IronPDF
La migración puede comenzar inmediatamente con estos pasos básicos.
Paso 1: Sustituir paquetes NuGet
Elimine todos los paquetes de TextControl:
# Remove TX Text Control
dotnet remove package TXTextControl.TextControl
dotnet remove package TXTextControl.DocumentServer
# Remove TX Text Control
dotnet remove package TXTextControl.TextControl
dotnet remove package TXTextControl.DocumentServer
Instalar IronPDF:
# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
Paso 2: Actualizar los espacios de nombres
Sustituya los espacios de nombres TextControl por el espacio de nombres IronPdf:
// Before (TextControl)
using TXTextControl;
using TXTextControl.DocumentServer;
// After (IronPDF)
using IronPdf;
// Before (TextControl)
using TXTextControl;
using TXTextControl.DocumentServer;
// After (IronPDF)
using IronPdf;
Imports TXTextControl
Imports TXTextControl.DocumentServer
' After (IronPDF)
Imports IronPdf
Paso 3: Inicializar licencia
Añadir inicialización de licencia al inicio de la aplicación:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Ejemplos de migración de código
Convertir HTML a PDF
El caso de uso más común demuestra la diferencia arquitectónica entre estas bibliotecas PDF .NET.
Enfoque de TextControl:
// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;
namespace TextControlExample
{
class Program
{
static void Main(string[] args)
{
using (ServerTextControl textControl = new ServerTextControl())
{
textControl.Create();
string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
textControl.Load(html, StreamType.HTMLFormat);
textControl.Save("output.pdf", StreamType.AdobePDF);
}
}
}
}
// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;
namespace TextControlExample
{
class Program
{
static void Main(string[] args)
{
using (ServerTextControl textControl = new ServerTextControl())
{
textControl.Create();
string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
textControl.Load(html, StreamType.HTMLFormat);
textControl.Save("output.pdf", StreamType.AdobePDF);
}
}
}
}
Imports TXTextControl
Imports System.IO
Namespace TextControlExample
Class Program
Shared Sub Main(ByVal args As String())
Using textControl As New ServerTextControl()
textControl.Create()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"
textControl.Load(html, StreamType.HTMLFormat)
textControl.Save("output.pdf", StreamType.AdobePDF)
End Using
End Sub
End Class
End Namespace
Enfoque IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
}
Imports IronPdf
Namespace IronPdfExample
Class Program
Shared Sub Main(ByVal args As String())
Dim renderer = New ChromePdfRenderer()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Class
End Namespace
La versión TextControl requiere crear una instancia ServerTextControl, llamar a Create() para inicializar el contexto, cargar HTML con StreamType.HTMLFormat y guardar con StreamType.AdobePDF. El bloque using es obligatorio para la correcta eliminación de recursos.
IronPDF elimina por completo la gestión del contexto. El ChromePdfRenderer no requiere ninguna ceremonia de inicialización: créelo, renderice HTML y guárdelo. Esta simplificación arquitectónica reduce la carga cognitiva y los posibles errores de gestión de recursos.
Para situaciones avanzadas de conversión de HTML a PDF, consulte la Guía de conversión de HTML a PDF.
Fusión de varios PDF
La fusión de PDF revela otra importante diferencia de complejidad entre estas bibliotecas.
Enfoque de TextControl:
// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;
namespace TextControlExample
{
class Program
{
static void Main(string[] args)
{
using (ServerTextControl textControl = new ServerTextControl())
{
textControl.Create();
byte[] pdf1 = File.ReadAllBytes("document1.pdf");
textControl.Load(pdf1, StreamType.AdobePDF);
byte[] pdf2 = File.ReadAllBytes("document2.pdf");
textControl.Load(pdf2, StreamType.AdobePDF, LoadAppendMode.Append);
textControl.Save("merged.pdf", StreamType.AdobePDF);
}
}
}
}
// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;
namespace TextControlExample
{
class Program
{
static void Main(string[] args)
{
using (ServerTextControl textControl = new ServerTextControl())
{
textControl.Create();
byte[] pdf1 = File.ReadAllBytes("document1.pdf");
textControl.Load(pdf1, StreamType.AdobePDF);
byte[] pdf2 = File.ReadAllBytes("document2.pdf");
textControl.Load(pdf2, StreamType.AdobePDF, LoadAppendMode.Append);
textControl.Save("merged.pdf", StreamType.AdobePDF);
}
}
}
}
Imports TXTextControl
Imports System.IO
Namespace TextControlExample
Class Program
Shared Sub Main(ByVal args As String())
Using textControl As New ServerTextControl()
textControl.Create()
Dim pdf1 As Byte() = File.ReadAllBytes("document1.pdf")
textControl.Load(pdf1, StreamType.AdobePDF)
Dim pdf2 As Byte() = File.ReadAllBytes("document2.pdf")
textControl.Load(pdf2, StreamType.AdobePDF, LoadAppendMode.Append)
textControl.Save("merged.pdf", StreamType.AdobePDF)
End Using
End Sub
End Class
End Namespace
Enfoque IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
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;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
}
Imports IronPdf
Namespace IronPdfExample
Class Program
Shared Sub Main(ByVal args As String())
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
End Namespace
TextControl requiere leer archivos en matrices de bytes, administrar el contexto ServerTextControl y usar LoadAppendMode.Append para fusionar documentos. El método PdfDocument.Merge() deIronPDFmaneja todo con una única llamada explícita.
Para situaciones de fusión avanzadas, incluida la extracción selectiva de páginas, consulte la guía de fusión y división de PDF.
Añadir encabezados y pies de página
Los encabezados y pies de página con números de página dinámicos demuestran la diferencia de complejidad de las API.
Enfoque de TextControl:
// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;
namespace TextControlExample
{
class Program
{
static void Main(string[] args)
{
using (ServerTextControl textControl = new ServerTextControl())
{
textControl.Create();
string html = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>";
textControl.Load(html, StreamType.HTMLFormat);
HeaderFooter header = new HeaderFooter(HeaderFooterType.Header);
header.Text = "Document Header";
textControl.Sections[0].HeadersAndFooters.Add(header);
HeaderFooter footer = new HeaderFooter(HeaderFooterType.Footer);
footer.Text = "Page {page} of {numpages}";
textControl.Sections[0].HeadersAndFooters.Add(footer);
textControl.Save("output.pdf", StreamType.AdobePDF);
}
}
}
}
// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;
namespace TextControlExample
{
class Program
{
static void Main(string[] args)
{
using (ServerTextControl textControl = new ServerTextControl())
{
textControl.Create();
string html = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>";
textControl.Load(html, StreamType.HTMLFormat);
HeaderFooter header = new HeaderFooter(HeaderFooterType.Header);
header.Text = "Document Header";
textControl.Sections[0].HeadersAndFooters.Add(header);
HeaderFooter footer = new HeaderFooter(HeaderFooterType.Footer);
footer.Text = "Page {page} of {numpages}";
textControl.Sections[0].HeadersAndFooters.Add(footer);
textControl.Save("output.pdf", StreamType.AdobePDF);
}
}
}
}
Imports TXTextControl
Imports System.IO
Namespace TextControlExample
Class Program
Shared Sub Main(ByVal args As String())
Using textControl As New ServerTextControl()
textControl.Create()
Dim html As String = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>"
textControl.Load(html, StreamType.HTMLFormat)
Dim header As New HeaderFooter(HeaderFooterType.Header)
header.Text = "Document Header"
textControl.Sections(0).HeadersAndFooters.Add(header)
Dim footer As New HeaderFooter(HeaderFooterType.Footer)
footer.Text = "Page {page} of {numpages}"
textControl.Sections(0).HeadersAndFooters.Add(footer)
textControl.Save("output.pdf", StreamType.AdobePDF)
End Using
End Sub
End Class
End Namespace
Enfoque IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.AddTextHeader("Document Header");
pdf.AddTextFooter("Page {page} of {total-pages}");
pdf.SaveAs("output.pdf");
}
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.AddTextHeader("Document Header");
pdf.AddTextFooter("Page {page} of {total-pages}");
pdf.SaveAs("output.pdf");
}
}
}
Imports IronPdf
Imports IronPdf.Rendering
Namespace IronPdfExample
Class Program
Shared Sub Main(args As String())
Dim renderer As New ChromePdfRenderer()
Dim html As String = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.AddTextHeader("Document Header")
pdf.AddTextFooter("Page {page} of {total-pages}")
pdf.SaveAs("output.pdf")
End Sub
End Class
End Namespace
TextControl requiere crear objetos HeaderFooter con enumeraciones HeaderFooterType específicas, acceder a secciones del documento a través de textControl.Sections[0] y agregar a la colección HeadersAndFooters.IronPDFproporciona métodos directos AddTextHeader y AddTextFooter con una sintaxis de marcador de posición simple.
Para encabezados basados en HTML con control de estilo completo,IronPDFtambién admite HtmlHeaderFooter:
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='width: 100%; text-align: center; font-size: 12pt;'>
Company Report
</div>",
MaxHeight = 30
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='width: 100%; text-align: right; font-size: 10pt;'>
Page {page} of {total-pages}
</div>",
MaxHeight = 25
};
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='width: 100%; text-align: center; font-size: 12pt;'>
Company Report
</div>",
MaxHeight = 30
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='width: 100%; text-align: right; font-size: 10pt;'>
Page {page} of {total-pages}
</div>",
MaxHeight = 25
};
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
.HtmlFragment = "
<div style='width: 100%; text-align: center; font-size: 12pt;'>
Company Report
</div>",
.MaxHeight = 30
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "
<div style='width: 100%; text-align: right; font-size: 10pt;'>
Page {page} of {total-pages}
</div>",
.MaxHeight = 25
}
Más información sobre las opciones de encabezado y pie de página en documentación sobre encabezados y pies de página.
Referencia de mapeo de TextControl API a IronPDF
Este mapeo acelera la migración al mostrar los equivalentes directos de las API:
| Control de texto TX | IronPDF |
|---|---|
ServerTextControl.Create() |
new ChromePdfRenderer() |
tx.Load(html, StreamType.HTMLFormat) |
renderer.RenderHtmlAsPdf(html) |
tx.Load(url, StreamType.HTMLFormat) |
renderer.RenderUrlAsPdf(url) |
tx.Save(path, StreamType.AdobePDF) |
pdf.SaveAs(path) |
SaveSettings.PDFAConformance |
RenderingOptions.PdfAFormat |
DocumentServer.MailMerge |
Plantillas HTML + Razor |
DocumentTarget.HeadersAndFooters |
HtmlHeaderFooter |
LoadSettings |
RenderingOptions |
StreamType.AdobePDF |
Resultados por defecto |
Problemas comunes de migración y soluciones
Edición 1: Contexto de ServerTextControl
TextControl requiere los bloques Create() y using para cada operación.
Solución:IronPDFno tiene gestión de contexto:
// Just create and use
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// Just create and use
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
' Just create and use
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
Número 2: Conversiones StreamType
TextControl carga diferentes formatos y los convierte a PDF a través de enumeraciones StreamType.
Solución:IronPDFrenderiza HTML directamente sin conversión de formatos intermedios:
// No format conversion needed
var pdf = renderer.RenderHtmlAsPdf(html);
// No format conversion needed
var pdf = renderer.RenderHtmlAsPdf(html);
Dim pdf = renderer.RenderHtmlAsPdf(html)
Edición 3: Plantillas DOCX
TextControl utiliza archivos DOCX para plantillas con combinación de correspondencia.
Solución: Convertir a plantillas HTML con interpolación de cadenas de C# o Razor:
var data = new { CustomerName = "John Doe", InvoiceNumber = "12345", Total = "$1,500.00" };
var html = $@"
<html>
<head>
<style>
body {{ font-family: Arial; padding: 40px; }}
h1 {{ color: #333; }}
.total {{ font-size: 24px; color: green; }}
</style>
</head>
<body>
<h1>Invoice #{data.InvoiceNumber}</h1>
<p>Customer: {data.CustomerName}</p>
<p class='total'>Total: {data.Total}</p>
</body>
</html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("invoice.pdf");
var data = new { CustomerName = "John Doe", InvoiceNumber = "12345", Total = "$1,500.00" };
var html = $@"
<html>
<head>
<style>
body {{ font-family: Arial; padding: 40px; }}
h1 {{ color: #333; }}
.total {{ font-size: 24px; color: green; }}
</style>
</head>
<body>
<h1>Invoice #{data.InvoiceNumber}</h1>
<p>Customer: {data.CustomerName}</p>
<p class='total'>Total: {data.Total}</p>
</body>
</html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("invoice.pdf");
Option Strict On
Dim data = New With {Key .CustomerName = "John Doe", Key .InvoiceNumber = "12345", Key .Total = "$1,500.00"}
Dim html = $"
<html>
<head>
<style>
body {{ font-family: Arial; padding: 40px; }}
h1 {{ color: #333; }}
.total {{ font-size: 24px; color: green; }}
</style>
</head>
<body>
<h1>Invoice #{data.InvoiceNumber}</h1>
<p>Customer: {data.CustomerName}</p>
<p class='total'>Total: {data.Total}</p>
</body>
</html>"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("invoice.pdf")
Número 4: Intel Iris Xe Graphics Bug
TextControl ha documentado problemas de renderizado con procesadores Intel de 11ª generación, que requieren soluciones de registro.
Solución:IronPDFutiliza el renderizado Chromium, por lo que no se requieren errores de aceleración de hardware ni modificaciones en el registro.
Cumplimiento VeriFactu, TicketBAI y LOPDGDD: TextControl no puede satisfacer los requisitos legales de facturación en España
Para los desarrolladores en España, TextControl presenta una limitación fundamental: su arquitectura de procesador de textos no está diseñada para las operaciones criptográficas y estructurales que exige la normativa de facturación electrónica española.
VeriFactu (Real Decreto-Ley 15/2025): leyenda VERI*FACTU y NIF español
VeriFactu exige que cada PDF de factura incluya la leyenda VERI\*FACTU y la cadena de huella encadenada que vincula cada documento con el anterior, para que las facturas sean verificables en la sede electrónica de la AEAT. Estas operaciones requieren manipulación programática avanzada del PDF, fuera del alcance de un editor de documentos como TextControl. Los proveedores de software no conformes se exponen a sanciones de hasta 150.000 € anuales.
IronPDF resuelve esto con una plantilla HTML que incorpora datos en formato peninsular (NIF, EUR 1.234,56 €, IVA 21%):
using IronPdf;
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();
// Factura VeriFactu con NIF español y formato peninsular
string html = @"
<html>
<body style='font-family: Arial; margin: 40px;'>
<h1>FACTURA Nº F-2026-0089</h1>
<p>Emisor: Tecnología Empresarial S.L. | NIF: B-87.654.321</p>
<p>Receptor: Distribuidora Ibérica S.A. | CIF: A-11.222.333</p>
<table border='1' cellpadding='6' style='width:100%;'>
<tr><th>Descripción</th><th>Base (€)</th><th>IVA 21%</th><th>Total (€)</th></tr>
<tr><td>Mantenimiento anual software</td>
<td>2.500,00 €</td><td>525,00 €</td><td>3.025,00 €</td></tr>
</table>
<p style='border:2px solid #003366; padding:8px; font-weight:bold; margin-top:20px;'>
VERI*FACTU — Factura verificable en la sede electrónica de la AEAT
</p>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("factura-verifactu-F2026-0089.pdf");
using IronPdf;
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();
// Factura VeriFactu con NIF español y formato peninsular
string html = @"
<html>
<body style='font-family: Arial; margin: 40px;'>
<h1>FACTURA Nº F-2026-0089</h1>
<p>Emisor: Tecnología Empresarial S.L. | NIF: B-87.654.321</p>
<p>Receptor: Distribuidora Ibérica S.A. | CIF: A-11.222.333</p>
<table border='1' cellpadding='6' style='width:100%;'>
<tr><th>Descripción</th><th>Base (€)</th><th>IVA 21%</th><th>Total (€)</th></tr>
<tr><td>Mantenimiento anual software</td>
<td>2.500,00 €</td><td>525,00 €</td><td>3.025,00 €</td></tr>
</table>
<p style='border:2px solid #003366; padding:8px; font-weight:bold; margin-top:20px;'>
VERI*FACTU — Factura verificable en la sede electrónica de la AEAT
</p>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("factura-verifactu-F2026-0089.pdf");
Imports IronPdf
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim renderer As New ChromePdfRenderer()
' Factura VeriFactu con NIF español y formato peninsular
Dim html As String = "
<html>
<body style='font-family: Arial; margin: 40px;'>
<h1>FACTURA Nº F-2026-0089</h1>
<p>Emisor: Tecnología Empresarial S.L. | NIF: B-87.654.321</p>
<p>Receptor: Distribuidora Ibérica S.A. | CIF: A-11.222.333</p>
<table border='1' cellpadding='6' style='width:100%;'>
<tr><th>Descripción</th><th>Base (€)</th><th>IVA 21%</th><th>Total (€)</th></tr>
<tr><td>Mantenimiento anual software</td>
<td>2.500,00 €</td><td>525,00 €</td><td>3.025,00 €</td></tr>
</table>
<p style='border:2px solid #003366; padding:8px; font-weight:bold; margin-top:20px;'>
VERI*FACTU — Factura verificable en la sede electrónica de la AEAT
</p>
</body>
</html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("factura-verifactu-F2026-0089.pdf")
TicketBAI (Bizkaia, Gipuzkoa y Araba)
TicketBAI en el País Vasco obliga a firmar digitalmente cada factura con XAdES y adjuntarla como PDF firmado con PAdES conforme a eIDAS, usando certificados reconocidos (FNMT u otros). TextControl no implementa firma digital, por lo que no puede cumplir este requisito.
Crea y Crece y Facturae XML
La Ley Crea y Crece impone la factura electrónica B2B con Facturae XML bajo el estándar EN 16931 y el perfil CIUS-ES, incrustado en PDF/A-3 para su envío a través de FACe o el SII de la AEAT. IronPDF soporta nativamente la generación de PDF/A con ficheros adjuntos estructurados.
LOPDGDD y procesamiento on-premise
La LOPDGDD y la supervisión de la AEPD exigen que los datos personales de las facturas se procesen con garantías adecuadas. IronPDF opera completamente on-premise, sin enviar contenido a servicios externos, facilitando el cumplimiento normativo en materia de protección de datos.
Lista de migración de TextControl
Tareas previas a la migración
Audite su código base para identificar todos los usos de TextControl:
grep -r "using TXTextControl" --include="*.cs" .
grep -r "ServerTextControl\|Load\|Save" --include="*.cs" .
grep -r "using TXTextControl" --include="*.cs" .
grep -r "ServerTextControl\|Load\|Save" --include="*.cs" .
Plantillas de combinación de correspondencia de documentos para su conversión a HTML. Tenga en cuenta los requisitos de encabezado y pie de página para la implementación con HtmlHeaderFooter. Identifique cualquier funcionalidad de edición de DOCX que pueda requerir soluciones alternativas.
Tareas de actualización de código
- Eliminar paquetes NuGet de TX Text Control
- Instalación del paquete IronPdf NuGet
- Eliminar la gestión de contexto
ServerTextControl(no más llamadasCreate()) - Convertir cargas
StreamType.HTMLFormataRenderHtmlAsPdf - Convertir combinación de correspondencia en plantillas HTML con interpolación de cadenas o Razor
- Actualice los encabezados y pies de página para usar
HtmlHeaderFooteroAddTextFooter - Simplifique la configuración de la página usando
RenderingOptions - Añadir inicialización de licencia al inicio
Pruebas posteriores a la migración
Tras la migración, verifique estos aspectos:
- Prueba de que todas las plantillas de documentos se visualizan correctamente
- Verificar el cumplimiento de PDF/Asi es necesario
- Probar la funcionalidad de la protección por contraseña
- Comprobar que los encabezados/pies de página aparecen en todas las páginas
- Comprobación en hardware Intel de 11ª generación: ya no se necesitan más soluciones de registro con IronPDF
Beneficios clave de migrar a IronPDF
Pasar de TextControl aIronPDFofrece varias ventajas a los equipos centrados en la generación de PDF:
Arquitectura PDF-First:IronPDFestá diseñado específicamente para la generación de PDF y ofrece sólidas capacidades de creación y representación de documentos aprovechando los modernos estándares HTML5 y CSS3.
Rentabilidad: el precio único deIronPDFlo hace significativamente más barato a lo largo del tiempo, especialmente en comparación con el servicio basado en suscripción de TextControl con renovaciones anuales obligatorias del 40%.
Estabilidad comprobada: confiabilidad documentada en varios hardware, evitando problemas como los que enfrenta TextControl con gráficos Intel.
Sin gestión de contexto: elimine la ceremonia de creación de ServerTextControl y los patrones de eliminación de recursos. El renderizado sin estado deIronPDFsimplifica el código y reduce las posibles fugas de memoria.
Motor de renderizado moderno: a medida que aumenta la adopción de .NET 10 y C# 14 hasta 2026, la renderización basada en Chromium deIronPDFgarantiza la compatibilidad con los estándares web actuales y futuros.
Preguntas Frecuentes
¿Por qué TextControl no es apto para cumplir con VeriFactu (RDL 15/2025) en España?
TextControl es un editor de documentos DOCX, no una biblioteca PDF con capacidades criptográficas. VeriFactu exige que cada factura incluya la leyenda VERI*FACTU, la cadena de huella SHA-256 encadenada y el QR verificable ante la AEAT. TextControl no puede realizar estas operaciones. Los ISVs no conformes se exponen a sanciones de hasta 150.000 € al año.
¿Cómo genera IronPDF facturas conforme a VeriFactu con NIF español?
IronPDF renderiza plantillas HTML con datos en formato peninsular (NIF/CIF, 1.234,56 €, IVA 21%) y añade la leyenda obligatoria VERI*FACTU mediante HtmlHeaderFooter o en el propio HTML. El procesamiento es completamente on-premise sin enviar datos a la AEAT — IronPDF actúa como componente dentro del software de facturación certificado.
¿Soporta IronPDF TicketBAI en Bizkaia, Gipuzkoa y Araba?
Sí. TicketBAI requiere firmas XAdES y PAdES conformes a eIDAS con certificados FNMT-RCM. IronPDF genera el PDF de factura con los datos requeridos por cada hacienda foral (Bizkaia, Gipuzkoa, Araba); la firma XAdES de los XMLs se gestiona en la capa del ISV.
¿Qué ventajas ofrece IronPDF para Facturae XML, FACe y Crea y Crece?
IronPDF soporta nativamente la generación de documentos PDF/A-3 con adjuntos Facturae XML para envío a través de FACe, cumpliendo con el estándar europeo EN 16931 y el perfil CIUS-ES. La Ley Crea y Crece exige factura electrónica B2B desde 2027-2028 para todas las empresas.
¿Cómo facilita IronPDF el cumplimiento de la LOPDGDD en contextos de facturación?
IronPDF procesa todos los documentos completamente on-premise, sin enviar contenido a servicios de terceros. Esto facilita el cumplimiento del LOPDGDD bajo la supervisión de la AEPD para el tratamiento de datos personales en facturas y documentos financieros. La generación en servidor también permite aplicar controles de acceso bajo el SII (Suministro Inmediato de Información) de la AEAT.

