Migrar de FastReport a IronPDF: VeriFactu, TicketBAI y LOPDGDD para ISVs españoles
FastReport.NET es una solución de generación de informes visual para .NET con arquitectura basada en bandas. Para los ISVs y desarrolladores españoles que generan facturas electrónicas bajo VeriFactu (RDL 15/2025), TicketBAI (Bizkaia, Gipuzkoa, Araba) o documentos Facturae para FACe, FastReport presenta limitaciones regulatorias críticas: la arquitectura basada en bandas (DataBand, PageHeaderBand) no puede generar la leyenda obligatoria VERI*FACTU con CSS moderno (Flexbox/Grid), la versión open-source carece de firma digital para XAdES/PAdES requerida por TicketBAI y eIDAS, y el modelo de licencias fragmentado (FastReport.OpenSource + Export.PdfSimple + paquetes adicionales) introduce el mismo riesgo de interrupción de servicio que afecta a los ISVs de facturación bajo el régimen de penalizaciones VeriFactu de hasta 150.000 €/año. IronPDF resuelve estos requisitos en un único paquete: genera PDFs con leyenda VERI*FACTU y QR de la AEAT usando CSS3 completo, firma XAdES/PAdES con certificados FNMT-RCM, y opera on-premise sin restricciones AGPL para la distribución de software de facturación propietario.
¿Por qué migrar de FastReport a IronPDF?
La especialización de FastReport.NET en la generación de informes crea fricciones para los equipos de desarrollo que necesitan una generación de PDF versátil — y para los ISVs españoles de facturación electrónica, las limitaciones son de carácter regulatorio, no solo técnico. Comprender estas diferencias es esencial para planificar la migración.
Los retos de FastReport para ISVs españoles de facturación electrónica
-
Sin soporte nativo VeriFactu (RDL 15/2025): FastReport no puede generar la leyenda obligatoria
VERI*FACTUniFactura verificable en la sede electrónica de la AEATcon composición CSS precisa (Flexbox/Grid) en su versión open-source. Los proveedores de software de facturación se exponen a sanciones de hasta 150.000 €/año. -
Sin firma XAdES/PAdES para TicketBAI: Las tres Haciendas Forales del País Vasco (Bizkaia, Gipuzkoa, Araba) exigen firma XAdES y PAdES conforme a eIDAS. FastReport open-source no incluye firma digital; la versión comercial tiene costes adicionales no transparentes.
-
Arquitectura basada en bandas incompatible con CSS moderno: DataBand, PageHeaderBand y el formato propietario
.frxno soportan Flexbox ni Grid CSS — impidiendo la maquetación de representaciones gráficas conformes con la especificación técnica de la AEAT para VeriFactu. -
Paquetes fragmentados → riesgo de interrupción en cumplimiento: FastReport.OpenSource + Export.PdfSimple + paquetes adicionales replican el problema de licencias fragmentadas de DynamicPDF. Una renovación fallida en plena generación de facturas TicketBAI puede interrumpir el flujo de cumplimiento.
-
Sin LOPDGDD on-premise por defecto: La vinculación de datos mediante
RegisterData()y el modelo de informes no garantiza por sí mismo el procesamiento on-premise de datos fiscales (NIF/CIF) bajo la supervisión de la AEPD. - Licencia AGPL de FastReport.OpenSource: La versión open-source usa licencia MIT/LGPL, pero el ecosistema de plugins incluye componentes con restricciones. En contraste, iText7 (alternativa frecuente al migrar) usa AGPL — en el contexto VeriFactu donde los ISVs distribuyen software de facturación propietario, esto plantea las mismas restricciones de copyleft que complican la distribución. IronPDF ofrece licenciamiento comercial predecible sin restricciones AGPL.
Comparación de arquitecturas
| Aspecto | FastReport | IronPDF |
|---|---|---|
| Enfoque de diseño | Diseñador visual + archivos .frx | HTML/CSS (tecnologías web) |
| Curva de aprendizaje | Steep (conceptos basados en bandas) | Suave (conocimientos de HTML/CSS) |
| Vinculación de datos | RegisterData(), DataBand | Interpolación de cadenas, Razor, plantillas |
| Soporte CSS | Limitado | CSS3 completo con Flexbox/Grid |
| Modelo de paquete | Múltiples paquetes | Paquete único (todas las funciones) |
| Motor de renderizado | A medida | Último Chromium |
| Manipulación de PDF | Orientado a la exportación | Completo (fusión, división, seguridad, formularios) |
| Moderno .NET | .NET Standard 2.0 | .NET 6/7/8/9+ nativo |
Beneficios clave de la migración para el mercado español
- Cumplimiento VeriFactu (RDL 15/2025): IronPDF genera la leyenda
VERI*FACTUcon Flexbox/CSS3 completo; FastReport open-source no puede - Firma XAdES/PAdES para TicketBAI (Bizkaia, Gipuzkoa, Araba): soporte nativo con certificados FNMT-RCM, conforme a eIDAS
- Paquete único: un NuGet reemplaza FastReport.OpenSource + Export.PdfSimple + extras — elimina el riesgo de interrupción por renovación parcial
- HTML/CSS familiar: conversión directa de plantillas
.frxa HTML/CSS sin curva de aprendizaje de bandas propietarias - LOPDGDD on-premise: procesamiento headless sin enviar datos fiscales (NIF/CIF) a servicios externos — simplifica análisis AEPD
- Sin restricciones AGPL: licenciamiento comercial predecible para distribución de software de facturación propietario
Contexto regulatorio español: VeriFactu, TicketBAI y las limitaciones de FastReport
Para los ISVs españoles de software de facturación electrónica, migrar a IronPDF no es solo mejorar la arquitectura técnica: es cerrar brechas de cumplimiento regulatorio concretas.
VeriFactu (Real Decreto-Ley 15/2025): Las representaciones gráficas de facturas conforme a VeriFactu deben incluir la leyenda VERI*FACTU o Factura verificable en la sede electrónica de la AEAT y el QR de verificación de la AEAT. FastReport open-source, con su motor de renderizado propio sin soporte Flexbox, dificulta la maquetación precisa de estos elementos. IronPDF, con motor Chromium moderno, soporta toda la especificación CSS3.
TicketBAI en el País Vasco (Bizkaia, Gipuzkoa, Araba): Las Haciendas Forales exigen facturas firmadas con XAdES y PAdES conforme a eIDAS, usando certificados de la FNMT-RCM u otras CAs reconocidas. FastReport open-source no incluye firma digital nativa. IronPDF incluye XAdES, PAdES y CAdES en el mismo paquete.
Facturae XML y FACe (sector público): Los PDFs de acompañamiento de facturas Facturae para el sector público requieren representaciones gráficas fieles. La generación de estos PDFs con IronPDF permite incrustar el XML Facturae en PDF/A-3 para el SII (Suministro Inmediato de Información) de la AEAT.
LOPDGDD y AEPD: Las facturas contienen datos personales (NIF, CIF, domicilio fiscal) sujetos a la LOPDGDD. IronPDF procesa on-premise, sin transferencias de datos a servicios externos. La AEPD supervisa el tratamiento de datos fiscales — el procesamiento headless on-premise de IronPDF simplifica el análisis de cumplimiento.
Generación de factura VeriFactu con IronPDF (sustituyendo FastReport)
El siguiente ejemplo muestra cómo IronPDF genera una factura conforme con VeriFactu — con leyenda obligatoria, QR AEAT, NIF/CIF del emisor/receptor y formato EUR en notación española — usando HTML/CSS que FastReport no puede renderizar correctamente con su motor propio:
using IronPdf;
// Sustitución de FastReport.OpenSource + Export.PdfSimple por IronPDF (paquete único)
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-0055<br>
Fecha: 28/05/2026<br>
NIF Emisor: B-55667788
</div>
<div>CIF Receptor: A-88776655</div>
</div>
<table>
<tr><th>Concepto</th><th>Base imponible</th><th>IVA (21%)</th><th>Total</th></tr>
<tr><td>Módulo de reporting</td><td>2.400,00 €</td><td>504,00 €</td><td>2.904,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>";
// Flexbox + CSS3: imposible con el motor propio de FastReport
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("factura-verifactu-2026-0055.pdf");
using IronPdf;
// Sustitución de FastReport.OpenSource + Export.PdfSimple por IronPDF (paquete único)
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-0055<br>
Fecha: 28/05/2026<br>
NIF Emisor: B-55667788
</div>
<div>CIF Receptor: A-88776655</div>
</div>
<table>
<tr><th>Concepto</th><th>Base imponible</th><th>IVA (21%)</th><th>Total</th></tr>
<tr><td>Módulo de reporting</td><td>2.400,00 €</td><td>504,00 €</td><td>2.904,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>";
// Flexbox + CSS3: imposible con el motor propio de FastReport
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("factura-verifactu-2026-0055.pdf");
Imports IronPdf
' Sustitución de FastReport.OpenSource + Export.PdfSimple por IronPDF (paquete único)
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-0055<br>
Fecha: 28/05/2026<br>
NIF Emisor: B-55667788
</div>
<div>CIF Receptor: A-88776655</div>
</div>
<table>
<tr><th>Concepto</th><th>Base imponible</th><th>IVA (21%)</th><th>Total</th></tr>
<tr><td>Módulo de reporting</td><td>2.400,00 €</td><td>504,00 €</td><td>2.904,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>"
' Flexbox + CSS3: imposible con el motor propio de FastReport
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("factura-verifactu-2026-0055.pdf")
FastReport requeriría Report + HTMLObject con dimensiones fijas + PDFSimpleExport + stream — y aún así no renderizaría el display: flex de la cabecera correctamente. IronPDF genera el mismo PDF en 3 líneas de código.
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 deIronPDF(prueba gratuita disponible en ironpdf.com)
Uso de Auditoría FastReport
Ejecute estos comandos en su directorio de soluciones para identificar todas las referencias a FastReport:
# Find all FastReportreferences
grep -r "FastReport\|\.frx\|PDFExport\|PDFSimpleExport\|DataBand\|RegisterData" --include="*.cs" --include="*.csproj" .
# Check NuGet packages
dotnet list package | grep FastReport
# Find all FastReportreferences
grep -r "FastReport\|\.frx\|PDFExport\|PDFSimpleExport\|DataBand\|RegisterData" --include="*.cs" --include="*.csproj" .
# Check NuGet packages
dotnet list package | grep FastReport
Documente sus plantillas de informes
Antes de la migración, catalogue todos los archivos .frx y sus propósitos:
- Nombre y objetivo del informe
- Fuentes de datos utilizadas
- Configuración de encabezados/pies de página
- Requisitos de numeración de páginas
- Formato o estilo especial
Entendiendo el cambio de paradigma
El cambio más significativo al migrar de FastReportaIronPDFes el enfoque de diseño fundamental. FastReportutiliza un diseño visual basado en bandas con archivos de plantilla .frx y conceptos propietarios como DataBand, PageHeaderBand y RegisterData().IronPDFutiliza tecnologías web HTML/CSS que la mayoría de los desarrolladores ya conocen.
Esto significa convertir las configuraciones de banda de FastReporten plantillas HTML, sustituir RegisterData() por la vinculación directa de datos mediante interpolación de cadenas o plantillas Razor, y transformar PageHeaderBand/PageFooterBand en encabezados y pies de página basados en HTML.
Proceso de migración paso a paso
Paso 1: Actualizar paquetes NuGet
Elimine todos los paquetes de FastReporte instale IronPDF:
# Remove all FastReportpackages
dotnet remove package FastReport.OpenSource
dotnet remove package FastReport.OpenSource.Export.PdfSimple
dotnet remove package FastReport.OpenSource.Web
dotnet remove package FastReport.OpenSource.Data.MsSql
# InstallIronPDF(includes all features)
dotnet add package IronPdf
# Remove all FastReportpackages
dotnet remove package FastReport.OpenSource
dotnet remove package FastReport.OpenSource.Export.PdfSimple
dotnet remove package FastReport.OpenSource.Web
dotnet remove package FastReport.OpenSource.Data.MsSql
# InstallIronPDF(includes all features)
dotnet add package IronPdf
Paso 2: Actualizar referencias de espacios de nombres
Sustituya los espacios de nombres de FastReportpor IronPDF:
// Remove these
using FastReport;
using FastReport.Export.PdfSimple;
using System.IO;
// Add this
using IronPdf;
// Remove these
using FastReport;
using FastReport.Export.PdfSimple;
using System.IO;
// 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 FastReport | Equivalente de IronPDF |
|---|---|
Report |
ChromePdfRenderer |
PDFExport |
ChromePdfRenderer + SecuritySettings |
PDFSimpleExport |
ChromePdfRenderer |
ReportPage |
HTML <body> o <div> |
TextObject |
HTML <p>, <span>, <div> |
HTMLObject |
Representación directa en HTML |
PageHeaderBand |
HtmlHeaderFooter |
PageFooterBand |
HtmlHeaderFooter |
Métodos
| Método FastReport | Equivalente de IronPDF |
|---|---|
report.Load("template.frx") |
Archivo o cadena de plantilla HTML |
report.RegisterData(data, "name") |
Interpolación de cadenas o Razor |
report.Prepare() |
N/A |
report.Export(export, stream) |
pdf.SaveAs(path) |
Conversión de marcadores de posición de números de página
FastReport eIronPDFutilizan una sintaxis diferente para los números de página:
| FastReport | IronPDF |
|---|---|
[Page] |
{page} |
[TotalPages] |
{total-pages} |
Ejemplos de migración de código
Conversión de HTML a PDF
Este ejemplo demuestra la diferencia fundamental entre el enfoque HTMLObject de FastReporty la renderización directa de IronPDF.
Implementación de FastReport:
// NuGet: Install-Package FastReport.OpenSource
using FastReport;
using FastReport.Export.PdfSimple;
using System.IO;
class Program
{
static void Main()
{
using (Report report = new Report())
{
// Create HTML object
FastReport.HTMLObject htmlObject = new FastReport.HTMLObject();
htmlObject.Width = 500;
htmlObject.Height = 300;
htmlObject.Text = "<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>";
// Prepare report
report.Prepare();
// Export to PDF
PDFSimpleExport pdfExport = new PDFSimpleExport();
using (FileStream fs = new FileStream("output.pdf", FileMode.Create))
{
report.Export(pdfExport, fs);
}
}
}
}
// NuGet: Install-Package FastReport.OpenSource
using FastReport;
using FastReport.Export.PdfSimple;
using System.IO;
class Program
{
static void Main()
{
using (Report report = new Report())
{
// Create HTML object
FastReport.HTMLObject htmlObject = new FastReport.HTMLObject();
htmlObject.Width = 500;
htmlObject.Height = 300;
htmlObject.Text = "<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>";
// Prepare report
report.Prepare();
// Export to PDF
PDFSimpleExport pdfExport = new PDFSimpleExport();
using (FileStream fs = new FileStream("output.pdf", FileMode.Create))
{
report.Export(pdfExport, fs);
}
}
}
}
Imports FastReport
Imports FastReport.Export.PdfSimple
Imports System.IO
Class Program
Shared Sub Main()
Using report As New Report()
' Create HTML object
Dim htmlObject As New FastReport.HTMLObject()
htmlObject.Width = 500
htmlObject.Height = 300
htmlObject.Text = "<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>"
' Prepare report
report.Prepare()
' Export to PDF
Dim pdfExport As New PDFSimpleExport()
Using fs As New FileStream("output.pdf", FileMode.Create)
report.Export(pdfExport, fs)
End Using
End Using
End Sub
End Class
Implementación de IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>");
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>");
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>")
pdf.SaveAs("output.pdf")
End Sub
End Class
FastReport requiere la creación de un objeto Report, un HTMLObject con dimensiones fijas, la preparación del informe y la exportación mediante stream: siete líneas de código con sentencias using.IronPDFconsigue el mismo resultado en tres líneas con una representación directa en HTML. Para más opciones, consulte la documentación HTML a PDF.
Conversión de URL a PDF
Este ejemplo muestra cómo FastReportrequiere la descarga manual de HTML, mientras queIronPDFgestiona la renderización de URL de forma nativa.
Implementación de FastReport:
// NuGet: Install-Package FastReport.OpenSource
using FastReport;
using FastReport.Export.PdfSimple;
using System.IO;
using System.Net;
class Program
{
static void Main()
{
// Download HTML content from URL
string htmlContent;
using (WebClient client = new WebClient())
{
htmlContent = client.DownloadString("https://example.com");
}
using (Report report = new Report())
{
FastReport.HTMLObject htmlObject = new FastReport.HTMLObject();
htmlObject.Width = 800;
htmlObject.Height = 600;
htmlObject.Text = htmlContent;
report.Prepare();
PDFSimpleExport pdfExport = new PDFSimpleExport();
using (FileStream fs = new FileStream("webpage.pdf", FileMode.Create))
{
report.Export(pdfExport, fs);
}
}
}
}
// NuGet: Install-Package FastReport.OpenSource
using FastReport;
using FastReport.Export.PdfSimple;
using System.IO;
using System.Net;
class Program
{
static void Main()
{
// Download HTML content from URL
string htmlContent;
using (WebClient client = new WebClient())
{
htmlContent = client.DownloadString("https://example.com");
}
using (Report report = new Report())
{
FastReport.HTMLObject htmlObject = new FastReport.HTMLObject();
htmlObject.Width = 800;
htmlObject.Height = 600;
htmlObject.Text = htmlContent;
report.Prepare();
PDFSimpleExport pdfExport = new PDFSimpleExport();
using (FileStream fs = new FileStream("webpage.pdf", FileMode.Create))
{
report.Export(pdfExport, fs);
}
}
}
}
Imports FastReport
Imports FastReport.Export.PdfSimple
Imports System.IO
Imports System.Net
Class Program
Shared Sub Main()
' Download HTML content from URL
Dim htmlContent As String
Using client As New WebClient()
htmlContent = client.DownloadString("https://example.com")
End Using
Using report As New Report()
Dim htmlObject As New FastReport.HTMLObject()
htmlObject.Width = 800
htmlObject.Height = 600
htmlObject.Text = htmlContent
report.Prepare()
Dim pdfExport As New PDFSimpleExport()
Using fs As New FileStream("webpage.pdf", FileMode.Create)
report.Export(pdfExport, fs)
End Using
End Using
End Sub
End Class
Implementación de IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("webpage.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("webpage.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End Class
FastReport requiere descargar manualmente el contenido HTML con WebClient y, a continuación, incrustarlo en un HTMLObject con dimensiones fijas, una solución que no gestiona correctamente la ejecución de JavaScript ni las URL de recursos relativos. El código RenderUrlAsPdf deIronPDFrenderiza directamente la página web en vivo con ejecución completa de JavaScript mediante el motor Chromium. Para más opciones, consulte la URL de la documentación en PDF .
Cabeceras y pies de página con números de página
Este ejemplo demuestra la diferencia de complejidad entre el sistema basado en bandas de FastReporty el enfoque basado en HTML de IronPDF.
Implementación de FastReport:
// NuGet: Install-Package FastReport.OpenSource
using FastReport;
using FastReport.Export.PdfSimple;
using System.IO;
class Program
{
static void Main()
{
using (Report report = new Report())
{
report.Load("template.frx");
// Set report page properties
FastReport.ReportPage page = report.Pages[0] as FastReport.ReportPage;
// Add page header
FastReport.PageHeaderBand header = new FastReport.PageHeaderBand();
header.Height = 50;
FastReport.TextObject headerText = new FastReport.TextObject();
headerText.Text = "Document Header";
header.Objects.Add(headerText);
page.Bands.Add(header);
// Add page footer
FastReport.PageFooterBand footer = new FastReport.PageFooterBand();
footer.Height = 50;
FastReport.TextObject footerText = new FastReport.TextObject();
footerText.Text = "Page [Page]";
footer.Objects.Add(footerText);
page.Bands.Add(footer);
report.Prepare();
PDFSimpleExport pdfExport = new PDFSimpleExport();
using (FileStream fs = new FileStream("report.pdf", FileMode.Create))
{
report.Export(pdfExport, fs);
}
}
}
}
// NuGet: Install-Package FastReport.OpenSource
using FastReport;
using FastReport.Export.PdfSimple;
using System.IO;
class Program
{
static void Main()
{
using (Report report = new Report())
{
report.Load("template.frx");
// Set report page properties
FastReport.ReportPage page = report.Pages[0] as FastReport.ReportPage;
// Add page header
FastReport.PageHeaderBand header = new FastReport.PageHeaderBand();
header.Height = 50;
FastReport.TextObject headerText = new FastReport.TextObject();
headerText.Text = "Document Header";
header.Objects.Add(headerText);
page.Bands.Add(header);
// Add page footer
FastReport.PageFooterBand footer = new FastReport.PageFooterBand();
footer.Height = 50;
FastReport.TextObject footerText = new FastReport.TextObject();
footerText.Text = "Page [Page]";
footer.Objects.Add(footerText);
page.Bands.Add(footer);
report.Prepare();
PDFSimpleExport pdfExport = new PDFSimpleExport();
using (FileStream fs = new FileStream("report.pdf", FileMode.Create))
{
report.Export(pdfExport, fs);
}
}
}
}
Imports FastReport
Imports FastReport.Export.PdfSimple
Imports System.IO
Class Program
Shared Sub Main()
Using report As New Report()
report.Load("template.frx")
' Set report page properties
Dim page As FastReport.ReportPage = TryCast(report.Pages(0), FastReport.ReportPage)
' Add page header
Dim header As New FastReport.PageHeaderBand()
header.Height = 50
Dim headerText As New FastReport.TextObject()
headerText.Text = "Document Header"
header.Objects.Add(headerText)
page.Bands.Add(header)
' Add page footer
Dim footer As New FastReport.PageFooterBand()
footer.Height = 50
Dim footerText As New FastReport.TextObject()
footerText.Text = "Page [Page]"
footer.Objects.Add(footerText)
page.Bands.Add(footer)
report.Prepare()
Dim pdfExport As New PDFSimpleExport()
Using fs As New FileStream("report.pdf", FileMode.Create)
report.Export(pdfExport, fs)
End Using
End Using
End Sub
End Class
Implementación de IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
// Configure header and footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center'>Document Header</div>"
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center'>Page {page} of {total-pages}</div>"
};
var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Report Content</h1><p>This is the main content.</p></body></html>");
pdf.SaveAs("report.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
// Configure header and footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center'>Document Header</div>"
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center'>Page {page} of {total-pages}</div>"
};
var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Report Content</h1><p>This is the main content.</p></body></html>");
pdf.SaveAs("report.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
' Configure header and footer
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center'>Document Header</div>"
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center'>Page {page} of {total-pages}</div>"
}
Dim pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Report Content</h1><p>This is the main content.</p></body></html>")
pdf.SaveAs("report.pdf")
End Sub
End Class
FastReport requiere cargar un archivo de plantilla, crear objetos de página, crear objetos de banda, establecer alturas, crear objetos de texto, añadir a colecciones de bandas y añadir bandas a páginas.IronPDFutiliza HtmlHeaderFooter con fragmentos HTML simples: puede diseñar encabezados y pies de página con CSS completo. Tenga en cuenta el cambio de sintaxis del número de página: [Page] se convierte en {page}, y [TotalPages] se convierte en {total-pages}. Para más opciones, consulte la documentación sobre encabezados y pies de página.
Notas de migración críticas
Sin archivos de plantilla .frx
Las plantillas FastReport(.frx) no funcionarán con IronPDF. Convierta sus diseños en plantillas HTML/CSS:
// FastReport- loads .frx template
report.Load("report.frx");
//IronPDF- use HTML template
var html = File.ReadAllText("template.html");
var pdf = renderer.RenderHtmlAsPdf(html);
// FastReport- loads .frx template
report.Load("report.frx");
//IronPDF- use HTML template
var html = File.ReadAllText("template.html");
var pdf = renderer.RenderHtmlAsPdf(html);
' FastReport- loads .frx template
report.Load("report.frx")
' IronPDF- use HTML template
Dim html As String = File.ReadAllText("template.html")
Dim pdf = renderer.RenderHtmlAsPdf(html)
Conversión de enlace de datos
Sustituir RegisterData() por la generación directa de HTML:
// FastReport
report.RegisterData(dataSet, "Data");
report.GetDataSource("Data").Enabled = true;
//IronPDF- use string interpolation or StringBuilder
var html = new StringBuilder();
foreach (var item in data)
{
html.Append($"<tr><td>{item.Name}</td><td>{item.Value}</td></tr>");
}
var pdf = renderer.RenderHtmlAsPdf(html.ToString());
// FastReport
report.RegisterData(dataSet, "Data");
report.GetDataSource("Data").Enabled = true;
//IronPDF- use string interpolation or StringBuilder
var html = new StringBuilder();
foreach (var item in data)
{
html.Append($"<tr><td>{item.Name}</td><td>{item.Value}</td></tr>");
}
var pdf = renderer.RenderHtmlAsPdf(html.ToString());
Imports System.Text
' FastReport
report.RegisterData(dataSet, "Data")
report.GetDataSource("Data").Enabled = True
' IronPDF - use string interpolation or StringBuilder
Dim html As New StringBuilder()
For Each item In data
html.Append($"<tr><td>{item.Name}</td><td>{item.Value}</td></tr>")
Next
Dim pdf = renderer.RenderHtmlAsPdf(html.ToString())
Configuración de seguridad
//IronPDFsecurity
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.UserPassword = "password";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
//IronPDFsecurity
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.UserPassword = "password";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
'IronPDFsecurity
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SecuritySettings.UserPassword = "password"
pdf.SecuritySettings.OwnerPassword = "ownerPassword"
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights
Para conocer opciones de seguridad integrales, consulte la documentación de cifrado .
Cumplimiento LOPDGDD, FNMT-RCM y Crea y Crece al migrar desde FastReport
LOPDGDD y datos fiscales: Al migrar el sistema de generación de informes, asegúrese de que el nuevo motor procesa datos personales (NIF/CIF de clientes, datos de facturación) on-premise. IronPDF opera localmente sin transmitir contenido de facturas a servicios externos — simplificando el análisis de cumplimiento LOPDGDD supervisado por la AEPD para datos fiscales de contribuyentes españoles.
eIDAS y FNMT-RCM: Para firma digital de facturas electrónicas conforme a eIDAS (TicketBAI, FACe), IronPDF soporta certificados PKCS#12 emitidos por la FNMT-RCM. FastReport open-source no implementa firma digital — requería una biblioteca externa adicional.
Crea y Crece (EN 16931/CIUS-ES): La Ley Crea y Crece establece facturas electrónicas B2B obligatorias en España (2027-2028). Las representaciones visuales PDF deben adjuntarse a los XML Facturae en formato PDF/A para FACe o el SII de la AEAT. IronPDF soporta PDF/A y procesamiento en un único paquete — sin los paquetes adicionales fragmentados que requería FastReport para este flujo.
iText AGPL vs IronPDF para ISVs de informes/facturación: Al migrar desde FastReport, algunos equipos evalúan iText/iText7 como alternativa por su potencia técnica. En el contexto VeriFactu, la licencia AGPL de iText obliga a los ISVs de software propietario a publicar su código fuente o adquirir licencia comercial de iText — complejidad adicional bajo el régimen de penalizaciones de 150.000 €/año. IronPDF ofrece licenciamiento comercial único sin restricciones AGPL, con mejor encaje para la distribución de software de facturación certificado ante la AEAT.
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 encabezados/pies de página y números de página
- Prueba con volúmenes de datos de producción
- Validar las características de seguridad/cifrado
- Evaluación comparativa del rendimiento
- Eliminar archivos de plantilla .frx no utilizados
- Eliminar el código relacionado con FastReport
- Actualización de la documentación
- Verificar generación de leyenda
VERI*FACTUy QR AEAT (RDL 15/2025) - Validar firma XAdES/PAdES con certificados FNMT-RCM para TicketBAI (Bizkaia, Gipuzkoa, Araba)
- Confirmar procesamiento on-premise headless para cumplimiento LOPDGDD/AEPD
- Probar generación PDF/A para Facturae/FACe si opera en sector público o SII
Proteja su infraestructura PDF frente a los plazos regulatorios españoles
Con .NET 10 en el horizonte y C# 14 introduciendo nuevas características, la elección de una biblioteca PDF que adopte tecnologías web modernas garantiza su mantenimiento a largo plazo. Para los ISVs españoles bajo el régimen de cumplimiento de facturación electrónica (VeriFactu desde 2025, Crea y Crece B2B desde 2027-2028), migrar ahora desde FastReport a IronPDF cierra brechas regulatorias concretas: soporte nativo de VERI*FACTU, firma XAdES/PAdES con certificados FNMT-RCM para TicketBAI (Bizkaia, Gipuzkoa, Araba), generación Facturae XML en PDF/A para FACe y SII, procesamiento on-premise LOPDGDD/AEPD, y licenciamiento comercial sin restricciones AGPL — todo en un único paquete NuGet que reemplaza el stack fragmentado de FastReport.OpenSource + paquetes de exportación.
Recursos adicionales
FastReport vs IronPDF: resumen para el mercado español de facturación electrónica
| Criterio | FastReport.OpenSource | IronPDF |
|---|---|---|
| *Leyenda VERIFACTU (RDL 15/2025)** | Sin CSS3/Flexbox completo | CSS3 Chromium completo ✅ |
| Firma XAdES/PAdES TicketBAI | Sin firma digital nativa | XAdES, PAdES, CAdES nativo ✅ |
| Facturae XML en PDF/A-3 | Requiere plugins adicionales | Soportado en paquete único ✅ |
| LOPDGDD on-premise headless | Procesamiento local | Headless sin sesión interactiva ✅ |
| FNMT-RCM / eIDAS | Sin soporte de certificados | Certificados PKCS#12 FNMT ✅ |
| Licencia | MIT/LGPL (open-source) | Comercial (sin AGPL) ✅ |
| Crea y Crece EN 16931 | Soporte limitado | PDF/A + Facturae XML ✅ |
| SII integración AEAT | No específico | Headless on-premise ✅ |
| Penalización VeriFactu | Riesgo por limitaciones técnicas | Arquitectura conforme ✅ |
La migración de FastReport a IronPDF elimina la dependencia del diseñador visual basado en bandas, la curva de aprendizaje de conceptos .frx/DataBand/RegisterData, y las limitaciones técnicas que bloquean el cumplimiento regulatorio español. Para los ISVs de software de facturación electrónica en España, la transición cierra brechas concretas: leyenda VERI*FACTU con CSS3 Chromium, firma XAdES/PAdES para TicketBAI (Bizkaia, Gipuzkoa, Araba), Facturae XML en PDF/A-3 para FACe y SII, procesamiento on-premise LOPDGDD/AEPD con certificados FNMT-RCM, y licenciamiento comercial predecible sin restricciones AGPL — todo en un único paquete NuGet que prepara el sistema para los plazos de Crea y Crece (EN 16931/CIUS-ES) de 2027-2028.
Preguntas Frecuentes
¿Por qué FastReport.OpenSource es insuficiente para el cumplimiento VeriFactu (RDL 15/2025)?
FastReport.OpenSource no puede generar la leyenda obligatoria VERI*FACTU con composición CSS precisa (Flexbox/Grid) requerida por las especificaciones técnicas de la AEAT. Tampoco incluye firma digital nativa para XAdES/PAdES exigida por TicketBAI en Bizkaia, Gipuzkoa y Araba. Los proveedores de software de facturación no conformes se exponen a sanciones de hasta 150.000 €/año bajo el RDL 15/2025. IronPDF resuelve ambas limitaciones en un único paquete.
¿IronPDF puede reemplazar las plantillas .frx de FastReport para facturas VeriFactu?
Sí. Las plantillas .frx de FastReport (basadas en bandas: DataBand, PageHeaderBand, RegisterData) se convierten a plantillas HTML/CSS en IronPDF. El enfoque HTML/CSS de IronPDF soporta Flexbox y Grid — permitiendo la composición precisa de la leyenda VERI*FACTU, el QR de la AEAT y los datos de la factura según las especificaciones técnicas de la AEAT, algo que FastReport no puede hacer con su motor propio.
¿IronPDF soporta firma XAdES y PAdES con certificados FNMT-RCM para TicketBAI?
Sí. IronPDF incluye soporte nativo XAdES, PAdES y CAdES, compatible con certificados PKCS#12 (.pfx) emitidos por la FNMT-RCM (Fábrica Nacional de Moneda y Timbre). Las tres Haciendas Forales del País Vasco (Bizkaia, Gipuzkoa, Araba) exigen ambas firmas para TicketBAI — IronPDF proporciona esto en el mismo paquete sin bibliotecas externas adicionales.
¿Cuál es la diferencia entre FastReport LGPL, iText AGPL e IronPDF para software de facturación en España?
FastReport.OpenSource usa licencia MIT/LGPL pero carece de capacidades críticas para cumplimiento regulatorio español (sin firma digital, sin CSS3 completo para VERI*FACTU). iText/iText7 técnicamente puede generar PDFs conformes pero su licencia AGPL obliga a ISVs de software propietario a publicar código fuente — complejidad amplificada bajo el régimen de penalizaciones VeriFactu. IronPDF ofrece capacidades técnicas completas con licenciamiento comercial predecible sin restricciones AGPL.
¿IronPDF facilita el cumplimiento LOPDGDD al migrar desde FastReport?
Sí. IronPDF procesa PDFs completamente on-premise, sin transmitir datos de facturas (NIF, CIF, datos fiscales) a servicios externos. FastReport también procesa localmente, pero al migrar es importante verificar que el nuevo flujo mantiene el procesamiento on-premise de los datos personales supervisados por la AEPD bajo la LOPDGDD. IronPDF soporta Docker/Kubernetes on-premise, manteniendo los datos de contribuyentes dentro del perímetro de la organización.

