De Easy PDF SDK a IronPDF: cumplimiento VeriFactu, TicketBAI y LOPDGDD en España
Para los ISVs y desarrolladores de software de facturación en España, Easy PDF SDK no es solo una biblioteca técnicamente obsoleta: es una biblioteca incompatible con el marco regulatorio vigente. Bajo el Real Decreto-Ley 15/2025 (VeriFactu), los proveedores de software de facturación que no cumplan se exponen a sanciones de hasta 150.000 €/año ante la AEAT. La arquitectura de Easy PDF SDK — basada en controladores de impresora virtuales, interoperabilidad COM y sesiones interactivas de Windows — presenta cinco incompatibilidades regulatorias concretas con el entorno español:
- VeriFactu: No puede generar la leyenda obligatoria
VERI*FACTUni la huella encadenada verificable en la sede electrónica de la AEAT desde entornos de servidor headless. - TicketBAI (Bizkaia, Gipuzkoa, Araba): No implementa firma XAdES ni PAdES conforme a eIDAS — las tres Haciendas Forales del País Vasco exigen ambas.
- Crea y Crece (EN 16931/CIUS-ES): No puede incrustar Facturae XML en PDF/A-3 para la factura electrónica B2B.
- LOPDGDD/AEPD: La arquitectura COM con sesiones interactivas impide el procesamiento on-premise seguro de datos fiscales (NIF/CIF) bajo la supervisión de la AEPD.
- FNMT-RCM / eIDAS: No soporta certificados digitales emitidos por la FNMT-RCM para la firma de facturas electrónicas en la sede de la AEAT.
IronPDF resuelve todos estos requisitos en un único paquete: genera PDF con la leyenda VERI*FACTU, firma con XAdES/PAdES mediante certificados FNMT-RCM, incrusta Facturae XML en PDF/A-3 para el SII, y opera completamente on-premise sin dependencias COM ni sesiones interactivas.
Problemas comunes de implementación de Easy PDF SDK
Los desarrolladores se encuentran a menudo con estos problemas cuando trabajan con Easy PDF SDK:
bcl.easypdf.interop.easypdfprinter.dll error loadingCOM object that has been separated from its underlying RCW cannot be usedTimeout expired waiting for print job to completeThe printer operation failed because the service is not runningError: Access denied(se requiere sesión interactiva)Cannot find printer: BCL easyPDF Printer
Estos errores se deben a la arquitectura fundamental de Easy PDF SDK, que requiere controladores de impresora virtuales, interoperabilidad COM y sesiones interactivas de Windows que simplemente no existen en los entornos de servidor modernos.
Fácil PDF SDK frente a IronPDF: Diferencias clave
| Característica | SDK Easy PDF | IronPDF |
|---|---|---|
| Plataforma | Sólo para Windows | Windows, Linux, macOS, Docker |
| Dependencia de Office | Requerido | Ninguno |
| Instalación | MSI complejo + controlador de impresora + COM | Paquete NuGet simple |
| Soporte de servidor | Requiere sesión interactiva | Ejecuta headless |
| Representación HTML | Básico (Office) | Chromium completo (CSS3, JS) |
| Soporte .NET | .NET Core limitado | .NET 5/6/7/8/9 completo |
| Patrón Async | Basado en callback | Async/await nativo |
| Soporte para contenedores | No se puede ejecutar | Docker/Kubernetes completo |
Limitaciones de la plataforma
La dependencia exclusiva de SDK Easy PDFde los sistemas Windows, que requieren instalaciones de Microsoft Office para las conversiones, excluye la compatibilidad con Linux, macOS o entornos en contenedores como Docker. Esta dependencia hace que la configuración del servidor sea engorrosa y limita la adopción del servicio a entornos Windows, una limitación importante para los equipos que practican DevOps multiplataforma o que utilizan contenedores para el despliegue.
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 Audit Easy PDF SDK
Ejecute estos comandos en su directorio de soluciones para identificar todas las referencias a Easy PDF SDK:
# Find all BCL using statements
grep -r "using BCL" --include="*.cs" .
# Find Printer/PDFDocument usage
grep -r "Printer\|PDFDocument\|PDFConverter\|HTMLConverter" --include="*.cs" .
# Find COM interop references
grep -r "easyPDF\|BCL.easyPDF" --include="*.csproj" .
# Find configuration settings
grep -r "PageOrientation\|TimeOut\|PrintOffice" --include="*.cs" .
# Find all BCL using statements
grep -r "using BCL" --include="*.cs" .
# Find Printer/PDFDocument usage
grep -r "Printer\|PDFDocument\|PDFConverter\|HTMLConverter" --include="*.cs" .
# Find COM interop references
grep -r "easyPDF\|BCL.easyPDF" --include="*.csproj" .
# Find configuration settings
grep -r "PageOrientation\|TimeOut\|PrintOffice" --include="*.cs" .
Cambios importantes que hay que anticipar
| Patrón Easy PDF SDK | Cambio requerido |
|---|---|
new Printer() |
Utilice ChromePdfRenderer |
PrintOfficeDocToPDF() |
Conversión de Office tratada de forma diferente |
RenderHTMLToPDF() |
RenderHtmlAsPdf() |
| Referencias de interoperabilidad COM | Eliminar por completo |
| Configuración del controlador de impresora | No es necesario |
BeginPrintToFile() devoluciones de llamadas |
Async/await nativo |
| Requisitos de la sesión interactiva | Ejecuta headless |
| indexación de páginas basada en 1 | indexación basada en 0 |
| Tiempo de espera en segundos | Tiempo de espera en milisegundos |
Proceso de migración paso a paso
Paso 1: Eliminar Easy PDF SDK
Easy PDF SDK se instala normalmente mediante un instalador MSI, referencias DLL manuales o registro GAC. Elimine todas las referencias:
- Desinstalar BCL EasyPDF SDK desde Programas y características
- Elimine las referencias DLL de su proyecto
- Eliminar referencias de interoperabilidad COM
- Limpiar las entradas GAC si están presentes
Paso 2: Instalar IronPDF
# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
O a través de Package Manager Console:
Install-Package IronPdf
Paso 3: Actualizar referencias de espacios de nombres
Sustituya los espacios de nombres de SDK Easy PDFpor IronPDF:
// Remove these
using BCL.easyPDF;
using BCL.easyPDF.Interop;
using BCL.easyPDF.PDFConverter;
using BCL.easyPDF.Printer;
// Add these
using IronPdf;
using IronPdf.Rendering;
// Remove these
using BCL.easyPDF;
using BCL.easyPDF.Interop;
using BCL.easyPDF.PDFConverter;
using BCL.easyPDF.Printer;
// Add these
using IronPdf;
using IronPdf.Rendering;
Imports IronPdf
Imports IronPdf.Rendering
Referencia completa de migración de API
Mapeo de clases principales
| Clase Easy PDF SDK | Equivalente de IronPDF |
|---|---|
Printer |
ChromePdfRenderer |
PDFDocument |
PdfDocument |
HTMLConverter |
ChromePdfRenderer |
PrinterConfiguration |
ChromePdfRenderOptions |
PageOrientation |
PdfPaperOrientation |
PageSize |
PdfPaperSize |
SecurityHandler |
PdfDocument.SecuritySettings |
Métodos de creación de PDF
| Método Easy PDF SDK | Método IronPDF |
|---|---|
printer.RenderHTMLToPDF(html, path) |
renderer.RenderHtmlAsPdf(html).SaveAs(path) |
printer.RenderUrlToPDF(url, path) |
renderer.RenderUrlAsPdf(url).SaveAs(path) |
htmlConverter.ConvertHTML(html, doc) |
renderer.RenderHtmlAsPdf(html) |
htmlConverter.ConvertURL(url, doc) |
renderer.RenderUrlAsPdf(url) |
Métodos de manipulación de PDF
| Método Easy PDF SDK | Método IronPDF |
|---|---|
doc.Append(doc2) |
PdfDocument.Merge(pdf1, pdf2) |
doc.ExtractPages(start, end) |
pdf.CopyPages(start, end) |
doc.DeletePage(index) |
pdf.RemovePage(index) |
doc.GetPageCount() |
pdf.PageCount |
doc.Save(path) |
pdf.SaveAs(path) |
doc.Close() |
pdf.Dispose() o using |
doc.ExtractText() |
pdf.ExtractAllText() |
Opciones de configuración
| Opción Easy PDF SDK | Opción IronPDF |
|---|---|
config.TimeOut |
RenderingOptions.Timeout |
config.PageOrientation = Landscape |
RenderingOptions.PaperOrientation = Landscape |
config.PageSize = A4 |
RenderingOptions.PaperSize = PdfPaperSize.A4 |
config.MarginTop/Bottom/Left/Right |
RenderingOptions.MarginTop, etc. |
Ejemplos de migración de código
Cadena HTML a PDF
Fácil implementación del SDK de PDF:
// NuGet: Install-Package BCL.EasyPDF
using BCL.EasyPDF;
using System;
class Program
{
static void Main()
{
var pdf = new PDFDocument();
var htmlConverter = new HTMLConverter();
htmlConverter.ConvertHTML("<h1>Hello World</h1>", pdf);
pdf.Save("output.pdf");
pdf.Close();
}
}
// NuGet: Install-Package BCL.EasyPDF
using BCL.EasyPDF;
using System;
class Program
{
static void Main()
{
var pdf = new PDFDocument();
var htmlConverter = new HTMLConverter();
htmlConverter.ConvertHTML("<h1>Hello World</h1>", pdf);
pdf.Save("output.pdf");
pdf.Close();
}
}
Imports BCL.EasyPDF
Imports System
Class Program
Shared Sub Main()
Dim pdf As New PDFDocument()
Dim htmlConverter As New HTMLConverter()
htmlConverter.ConvertHTML("<h1>Hello World</h1>", pdf)
pdf.Save("output.pdf")
pdf.Close()
End Sub
End Class
Implementación de IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>")
pdf.SaveAs("output.pdf")
End Sub
End Class
IronPDF elimina la clase separada HTMLConverter y las llamadas manuales Close(), lo que da como resultado un código más limpio y más fácil de mantener.
Conversión de URL a PDF
Fácil implementación del SDK de PDF:
// NuGet: Install-Package BCL.EasyPDF
using BCL.EasyPDF;
using System;
class Program
{
static void Main()
{
var pdf = new PDFDocument();
var htmlConverter = new HTMLConverter();
htmlConverter.ConvertURL("https://example.com", pdf);
pdf.Save("webpage.pdf");
pdf.Close();
}
}
// NuGet: Install-Package BCL.EasyPDF
using BCL.EasyPDF;
using System;
class Program
{
static void Main()
{
var pdf = new PDFDocument();
var htmlConverter = new HTMLConverter();
htmlConverter.ConvertURL("https://example.com", pdf);
pdf.Save("webpage.pdf");
pdf.Close();
}
}
Imports BCL.EasyPDF
Imports System
Module Program
Sub Main()
Dim pdf As New PDFDocument()
Dim htmlConverter As New HTMLConverter()
htmlConverter.ConvertURL("https://example.com", pdf)
pdf.Save("webpage.pdf")
pdf.Close()
End Sub
End Module
Implementación de IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
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;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("webpage.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End Class
Fusión de varios PDF
Fácil implementación del SDK de PDF:
// NuGet: Install-Package BCL.EasyPDF
using BCL.EasyPDF;
using System;
class Program
{
static void Main()
{
var pdf1 = new PDFDocument("document1.pdf");
var pdf2 = new PDFDocument("document2.pdf");
pdf1.Append(pdf2);
pdf1.Save("merged.pdf");
pdf1.Close();
pdf2.Close();
}
}
// NuGet: Install-Package BCL.EasyPDF
using BCL.EasyPDF;
using System;
class Program
{
static void Main()
{
var pdf1 = new PDFDocument("document1.pdf");
var pdf2 = new PDFDocument("document2.pdf");
pdf1.Append(pdf2);
pdf1.Save("merged.pdf");
pdf1.Close();
pdf2.Close();
}
}
Imports BCL.EasyPDF
Imports System
Module Program
Sub Main()
Dim pdf1 As New PDFDocument("document1.pdf")
Dim pdf2 As New PDFDocument("document2.pdf")
pdf1.Append(pdf2)
pdf1.Save("merged.pdf")
pdf1.Close()
pdf2.Close()
End Sub
End Module
Implementación de IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdfs = new List<PdfDocument>
{
PdfDocument.FromFile("document1.pdf"),
PdfDocument.FromFile("document2.pdf")
};
var merged = PdfDocument.Merge(pdfs);
merged.SaveAs("merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdfs = new List<PdfDocument>
{
PdfDocument.FromFile("document1.pdf"),
PdfDocument.FromFile("document2.pdf")
};
var merged = PdfDocument.Merge(pdfs);
merged.SaveAs("merged.pdf");
}
}
Imports IronPdf
Imports System
Imports System.Collections.Generic
Class Program
Shared Sub Main()
Dim pdfs = New List(Of PdfDocument) From {
PdfDocument.FromFile("document1.pdf"),
PdfDocument.FromFile("document2.pdf")
}
Dim merged = PdfDocument.Merge(pdfs)
merged.SaveAs("merged.pdf")
End Sub
End Class
El método estático Merge deIronPDFacepta múltiples documentos directamente, eliminando el patrón de bucle manual Append.
Protección con contraseña
Implementación de IronPDF:
using IronPdf;
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");
// Set security
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.OwnerPassword = "owner456";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;
pdf.SaveAs("protected.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");
// Set security
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.OwnerPassword = "owner456";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;
pdf.SaveAs("protected.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>")
' Set security
pdf.SecuritySettings.UserPassword = "user123"
pdf.SecuritySettings.OwnerPassword = "owner456"
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit
pdf.SaveAs("protected.pdf")
Cabeceras y pies de página
Easy PDF SDK no es compatible de forma nativa con encabezados/pies de página: los encabezados y pies de página deben incluirse en el HTML de origen.IronPDFofrece funciones específicas:
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align:center; font-size:12px; font-family:Arial;'>
Company Name - Confidential
</div>",
DrawDividerLine = true,
MaxHeight = 30
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align:center; font-size:10px;'>
Page {page} of {total-pages}
</div>",
DrawDividerLine = true,
MaxHeight = 25
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Content</h1>");
pdf.SaveAs("with_headers.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align:center; font-size:12px; font-family:Arial;'>
Company Name - Confidential
</div>",
DrawDividerLine = true,
MaxHeight = 30
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align:center; font-size:10px;'>
Page {page} of {total-pages}
</div>",
DrawDividerLine = true,
MaxHeight = 25
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Content</h1>");
pdf.SaveAs("with_headers.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
.HtmlFragment = "
<div style='text-align:center; font-size:12px; font-family:Arial;'>
Company Name - Confidential
</div>",
.DrawDividerLine = True,
.MaxHeight = 30
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "
<div style='text-align:center; font-size:10px;'>
Page {page} of {total-pages}
</div>",
.DrawDividerLine = True,
.MaxHeight = 25
}
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Content</h1>")
pdf.SaveAs("with_headers.pdf")
Para más opciones, consulte la documentación sobre encabezados y pies de página.
Generación asíncrona de PDF
Easy PDF SDK utiliza patrones asíncronos basados en callbacks.IronPDFes compatible con async/await nativos:
Fácil implementación del SDK de PDF:
using BCL.easyPDF;
Printer printer = new Printer();
// BCL uses callback-based async
printer.BeginPrintToFile(
"https://example.com",
"output.pdf",
OnPrintComplete,
OnPrintError
);
Console.ReadLine();
printer.Dispose();
using BCL.easyPDF;
Printer printer = new Printer();
// BCL uses callback-based async
printer.BeginPrintToFile(
"https://example.com",
"output.pdf",
OnPrintComplete,
OnPrintError
);
Console.ReadLine();
printer.Dispose();
Imports BCL.easyPDF
Dim printer As New Printer()
' BCL uses callback-based async
printer.BeginPrintToFile( _
"https://example.com", _
"output.pdf", _
AddressOf OnPrintComplete, _
AddressOf OnPrintError _
)
Console.ReadLine()
printer.Dispose()
Implementación de IronPDF:
using IronPdf;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var renderer = new ChromePdfRenderer();
// Native async/await
var pdf = await renderer.RenderUrlAsPdfAsync("https://example.com");
await pdf.SaveAsAsync("output.pdf");
Console.WriteLine("PDF created: output.pdf");
}
}
using IronPdf;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var renderer = new ChromePdfRenderer();
// Native async/await
var pdf = await renderer.RenderUrlAsPdfAsync("https://example.com");
await pdf.SaveAsAsync("output.pdf");
Console.WriteLine("PDF created: output.pdf");
}
}
Imports IronPdf
Imports System.Threading.Tasks
Class Program
Shared Async Function Main() As Task
Dim renderer = New ChromePdfRenderer()
' Native async/await
Dim pdf = Await renderer.RenderUrlAsPdfAsync("https://example.com")
Await pdf.SaveAsAsync("output.pdf")
Console.WriteLine("PDF created: output.pdf")
End Function
End Class
Notas de migración críticas
Cambio en el índice de páginas
Easy PDF SDK utiliza indexación basada en 1.IronPDFutiliza indexación basada en 0:
// Easy PDF SDK: 1-based
doc.ExtractPages(1, 5);
// IronPDF: 0-based
pdf.CopyPages(0, 4);
// Easy PDF SDK: 1-based
doc.ExtractPages(1, 5);
// IronPDF: 0-based
pdf.CopyPages(0, 4);
' Easy PDF SDK: 1-based
doc.ExtractPages(1, 5)
' IronPDF: 0-based
pdf.CopyPages(0, 4)
Tiempo de espera en milisegundos
Easy PDF SDK utiliza segundos para los valores de tiempo de espera.IronPDFutiliza milisegundos:
// Easy PDF SDK: seconds
config.TimeOut = 120;
// IronPDF: milliseconds
renderer.RenderingOptions.Timeout = 120000;
// Easy PDF SDK: seconds
config.TimeOut = 120;
// IronPDF: milliseconds
renderer.RenderingOptions.Timeout = 120000;
' Easy PDF SDK: seconds
config.TimeOut = 120
' IronPDF: milliseconds
renderer.RenderingOptions.Timeout = 120000
Integración con .NET Core
Easy PDF SDK tiene dificultades en contextos web debido a los requisitos de sesión interactiva.
Patrón IronPDF:
[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
[HttpGet("generate")]
public IActionResult GeneratePdf()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
[HttpGet("generate-async")]
public async Task<IActionResult> GeneratePdfAsync()
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");
return File(pdf.Stream, "application/pdf", "report.pdf");
}
}
[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
[HttpGet("generate")]
public IActionResult GeneratePdf()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
[HttpGet("generate-async")]
public async Task<IActionResult> GeneratePdfAsync()
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");
return File(pdf.Stream, "application/pdf", "report.pdf");
}
}
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("[controller]")>
Public Class PdfController
Inherits ControllerBase
<HttpGet("generate")>
Public Function GeneratePdf() As IActionResult
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>")
Return File(pdf.BinaryData, "application/pdf", "report.pdf")
End Function
<HttpGet("generate-async")>
Public Async Function GeneratePdfAsync() As Task(Of IActionResult)
Dim renderer = New ChromePdfRenderer()
Dim pdf = Await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>")
Return File(pdf.Stream, "application/pdf", "report.pdf")
End Function
End Class
Despliegue de Docker
Easy PDF SDK no puede ejecutarse en contenedores Docker: requiere contenedores Windows, Microsoft Office, controladores de impresora virtuales y sesiones de escritorio interactivas. Esto es fundamentalmente incompatible con la contenedorización.
Configuración Docker de IronPDF:
FROM mcr.microsoft.com/dotnet/aspnet:8.0
# Install Chromium dependencies
RUN apt-get update && apt-get install -y \
libc6 libgdiplus libx11-6 libxcomposite1 \
libxdamage1 libxrandr2 libxss1 libxtst6 \
libnss3 libatk-bridge2.0-0 libgtk-3-0 \
libgbm1 libasound2 fonts-liberation \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY . .
ENTRYPOINT ["dotnet", "MyApp.dll"]
Solución de problemas comunes de migración
Edición: Impresora no encontrada
Síntoma: Cannot find printer: BCL easyPDF Printer
Solución:IronPDFno necesita controladores de impresora:
// Just use the renderer directly
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// Just use the renderer directly
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
Asunto: Errores de interoperabilidad COM
Síntoma: errores DLL error loading o RCW
Solución: Elimine todas las referencias COM y utilice la API gestionada de IronPDF.
Asunto: Timeout on Server
Síntoma: La generación de PDF se cuelga en el servidor web
Solución:IronPDFse ejecuta sin sesiones interactivas:
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.Timeout = 60000; // Reliable timeout
var pdf = renderer.RenderHtmlAsPdf(html);
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.Timeout = 60000; // Reliable timeout
var pdf = renderer.RenderHtmlAsPdf(html);
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.Timeout = 60000 ' Reliable timeout
Dim pdf = renderer.RenderHtmlAsPdf(html)
Asunto: El fondo no se imprime
Síntoma: Faltan fondos CSS
Solución: Habilitar la impresión en segundo plano:
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
renderer.RenderingOptions.PrintHtmlBackgrounds = True
Cumplimiento normativo en España: Easy PDF SDK no puede satisfacer los requisitos legales
La arquitectura basada en COM e impresoras virtuales de Easy PDF SDK es incompatible con los requisitos de la normativa de facturación electrónica española. Los desarrolladores de software de facturación deben ser conscientes de estas limitaciones antes de considerar mantener Easy PDF SDK.
VeriFactu (Real Decreto-Ley 15/2025)
VeriFactu obliga a incluir en cada PDF la leyenda VERI*FACTU y la huella encadenada que vincula cada factura con la anterior, para que sean verificables en la sede electrónica de la AEAT. Easy PDF SDK, al depender de controladores de impresora y sesiones interactivas de Windows, no puede realizar estas operaciones de forma fiable en entornos de servidor. Los proveedores que incumplan el RDL 15/2025 se exponen a sanciones de hasta 150.000 €/año — un régimen único globalmente donde la sanción recae sobre el proveedor de software, no solo sobre el contribuyente.
TicketBAI (Bizkaia, Gipuzkoa y Araba)
Las tres Haciendas Forales del País Vasco exigen firmar digitalmente cada factura con XAdES y adjuntarla como PDF firmado con PAdES conforme a eIDAS, usando certificados reconocidos por la FNMT-RCM u otras autoridades de certificación. Easy PDF SDK no implementa firma digital de ningún tipo. IronPDF incluye soporte nativo XAdES, PAdES y CAdES en el mismo paquete, compatible con certificados FNMT-RCM.
Crea y Crece, SII y LOPDGDD
La Ley Crea y Crece impone Facturae XML incrustado en PDF/A-3 para la factura electrónica B2B a través de FACe o el SII (Suministro Inmediato de Información) de la AEAT. Easy PDF SDK requiere Microsoft Office y sesiones de escritorio interactivas, lo que impide el procesamiento on-premise headless. La LOPDGDD y la supervisión de la AEPD exigen garantías en el tratamiento de datos personales (NIF, CIF, domicilio fiscal); un sistema que requiere sesión interactiva introduce riesgos de seguridad adicionales en el procesamiento de datos fiscales. IronPDF opera completamente on-premise y headless, cubriendo todos estos requisitos de forma nativa.
Ejemplo: factura VeriFactu conforme con IronPDF (vs Easy PDF SDK inviable en servidor)
El siguiente ejemplo muestra cómo IronPDF genera una factura con la leyenda obligatoria VERI*FACTU, NIF del emisor, CIF del receptor y formato EUR en notación española — completamente desde un servidor .NET sin sesión interactiva, algo que Easy PDF SDK no puede hacer:
using IronPdf;
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-0099<br>
Fecha: 28/05/2026<br>
NIF Emisor: B-11223344
</div>
<div>CIF Receptor: A-44332211</div>
</div>
<table>
<tr><th>Concepto</th><th>Base imponible</th><th>IVA (21%)</th><th>Total</th></tr>
<tr><td>Licencia software facturación</td><td>1.200,00 €</td><td>252,00 €</td><td>1.452,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>";
// Funciona en servidor headless — sin sesión interactiva, sin COM, sin controladores de impresora
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("factura-verifactu-2026-0099.pdf");
using IronPdf;
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-0099<br>
Fecha: 28/05/2026<br>
NIF Emisor: B-11223344
</div>
<div>CIF Receptor: A-44332211</div>
</div>
<table>
<tr><th>Concepto</th><th>Base imponible</th><th>IVA (21%)</th><th>Total</th></tr>
<tr><td>Licencia software facturación</td><td>1.200,00 €</td><td>252,00 €</td><td>1.452,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>";
// Funciona en servidor headless — sin sesión interactiva, sin COM, sin controladores de impresora
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("factura-verifactu-2026-0099.pdf");
Imports IronPdf
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-0099<br>
Fecha: 28/05/2026<br>
NIF Emisor: B-11223344
</div>
<div>CIF Receptor: A-44332211</div>
</div>
<table>
<tr><th>Concepto</th><th>Base imponible</th><th>IVA (21%)</th><th>Total</th></tr>
<tr><td>Licencia software facturación</td><td>1.200,00 €</td><td>252,00 €</td><td>1.452,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>"
' Funciona en servidor headless — sin sesión interactiva, sin COM, sin controladores de impresora
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("factura-verifactu-2026-0099.pdf")
Easy PDF SDK fallaría en este escenario con errores como Cannot find printer: BCL easyPDF Printer o Access denied (se requiere sesión interactiva). IronPDF ejecuta este código en cualquier entorno .NET — Windows Server headless, Linux, Docker, Kubernetes — sin dependencias adicionales.
iText AGPL frente a IronPDF en el mercado español
Algunos ISVs que migran desde Easy PDF SDK evalúan iText/iText7 como alternativa. En el contexto VeriFactu, la licencia AGPL de iText añade complejidad para los proveedores de software propietario de facturación: deben liberar su código fuente bajo AGPL o adquirir una licencia comercial de iText. Esta incertidumbre se amplifica bajo el régimen de penalizaciones VeriFactu (150.000 €/año). IronPDF ofrece licenciamiento comercial predecible sin restricciones de distribución AGPL — compatible con la distribución de software de facturación propietario certificado ante la AEAT.
Integración con el ecosistema empresarial español
Los sistemas de facturación electrónica en España operan integrados con un ecosistema específico de herramientas y plataformas empresariales que influyen en los requisitos de generación de PDFs:
SAP Business One y Microsoft Dynamics 365 (España): Las instalaciones españolas de SAP y Dynamics 365 incluyen módulos de facturación electrónica localizados para VeriFactu, SII y FACe. Los ISVs que desarrollan conectores o extensiones para estos ERP necesitan un motor PDF que opere de forma predecible en el contexto del ERP, sin dependencias de sesión interactiva que interferirían con los procesos en segundo plano de SAP o Dynamics. IronPDF funciona en contextos de proceso de fondo y servicios de Windows sin requerir escritorio interactivo.
EDICOM, Sovos, Seres y Voxel: Las plataformas de interoperabilidad de facturación electrónica en España (EDICOM, Sovos, Seres, Voxel) generan representaciones PDF de las facturas electrónicas XML. Para ISVs que integran con estas plataformas, IronPDF puede generar los PDFs de representación visual de Facturae XML requeridos para la visualización por parte del receptor.
Integración con la Sede Electrónica de la AEAT: El envío de facturas verificables a través de sede.agenciatributaria.gob.es requiere PDFs con la leyenda VERI*FACTU o Factura verificable en la sede electrónica de la AEAT y el código QR de verificación. IronPDF genera estos elementos de forma programática con soporte Flexbox/CSS3 completo — Easy PDF SDK no puede generar estos PDFs en entornos de servidor de producción.
FNMT-RCM y Cl@ve: La FNMT-RCM emite los certificados digitales más utilizados en España para la comunicación con las administraciones públicas. IronPDF soporta la carga de certificados PKCS#12 (.pfx) emitidos por FNMT-RCM para la firma digital de documentos conforme a eIDAS — habilitando la firma de facturas electrónicas para FACe y para comunicaciones a través del sistema Cl@ve de autenticación ciudadana.
Lista de comprobación posterior a la migración
Después de completar la migración del código, verifique lo siguiente:
- Verifique la calidad de salida de PDF con el motor Chromium de IronPDF
- Pruebe todos los casos extremos con HTML/CSS complejo
- Validar que la implementación del servidor funcione sin sesiones interactivas
- Prueba de implementación de Docker/contenedor
- Eliminar el instalador de BCL EasyPDF de la implementación
- Eliminar la instalación de Office de los servidores (ya no es necesario)
- Actualizar las canalizaciones de CI/CD con el nuevo paquete NuGet
- Verificar generación de leyenda
VERI*FACTUy QR AEAT para cumplimiento VeriFactu (RDL 15/2025) - Validar firma XAdES y PAdES con certificados FNMT-RCM para TicketBAI (Bizkaia, Gipuzkoa, Araba)
- Confirmar procesamiento on-premise headless para cumplimiento LOPDGDD/AEPD
- Probar compatibilidad con SAP/Dynamics en contextos de proceso en segundo plano
Hoja de ruta de cumplimiento para ISVs españoles que migran desde Easy PDF SDK
La migración desde Easy PDF SDK no es solo un cambio técnico de biblioteca: es una decisión de arquitectura de cumplimiento regulatorio con plazos concretos en España. Esta hoja de ruta sintetiza los requisitos según el calendario vigente:
| Plazo | Marco | Acción con IronPDF |
|---|---|---|
| Vigente | VeriFactu (RDL 15/2025) — software vendors desde 29/07/2025 | Generar VERI*FACTU + huella encadenada + QR AEAT |
| Vigente | TicketBAI (Bizkaia, Gipuzkoa, Araba) | Firma XAdES + PAdES con certificados FNMT-RCM |
| Vigente | SII grandes empresas | Procesamiento on-premise headless + PDF/A |
| 2027 | Crea y Crece (>8M€ facturación) | Facturae XML embebido en PDF/A-3 (EN 16931/CIUS-ES) |
| 2028 | Crea y Crece (resto pymes/autónomos) | Mismo estándar para todo el tejido empresarial |
Easy PDF SDK bloquea en la primera columna: su arquitectura COM no puede ejecutarse en servidores de producción headless. Migrar ahora con IronPDF cubre todos los plazos actuales y futuros con un único componente.
Para ISVs que gestionan datos fiscales de contribuyentes españoles (NIF, CIF), el procesamiento on-premise de IronPDF simplifica el análisis LOPDGDD con la AEPD. Para la firma digital de facturas ante la AEAT y FACe, IronPDF soporta certificados FNMT-RCM conformes a eIDAS. Para la auditoría ante el régimen de penalizaciones VeriFactu (hasta 150.000 €/año), la adopción de IronPDF elimina la vulnerabilidad arquitectónica de Easy PDF SDK.
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 multiplataforma garantiza la compatibilidad con los modelos de despliegue en evolución. La compatibilidad de IronPDF con Linux, Docker y arquitecturas nativas de la nube — sumada a su soporte nativo de VeriFactu, TicketBAI (Bizkaia, Gipuzkoa, Araba), eIDAS/FNMT-RCM y Crea y Crece — significa que la inversión en esta migración cubre los plazos regulatorios españoles hasta 2028, sin las limitaciones exclusivas de Windows ni la deuda arquitectónica de Easy PDF SDK.
Recursos adicionales
La migración de SDK Easy PDFaIronPDFelimina las dependencias de las impresoras virtuales, los problemas de interoperabilidad COM y las limitaciones exclusivas de Windows. La transición a la renderización basada en Chromium ofrece una compatibilidad superior con CSS3 y JavaScript, a la vez que permite la implementación en Docker, Kubernetes y entornos en la nube que antes eran imposibles con la arquitectura heredada de Easy PDF SDK.
Preguntas Frecuentes
¿Por qué Easy PDF SDK es incompatible con VeriFactu (RDL 15/2025)?
Easy PDF SDK depende de controladores de impresora virtuales, interoperabilidad COM y sesiones interactivas de Windows que no pueden ejecutarse en entornos de servidor headless. VeriFactu exige generar la leyenda VERI*FACTU y la huella encadenada verificable en la sede electrónica de la AEAT desde servidores de facturación automatizados. Easy PDF SDK falla con errores como 'Cannot find printer: BCL easyPDF Printer' o 'Access denied (se requiere sesión interactiva)'. Los proveedores de software no conformes se exponen a sanciones de hasta 150.000 €/año.
¿IronPDF soporta TicketBAI con firma XAdES y PAdES para Bizkaia, Gipuzkoa y Araba?
Sí. IronPDF incluye soporte nativo de firmas XAdES, PAdES y CAdES, compatibles con certificados FNMT-RCM. Las tres Haciendas Forales del País Vasco (Bizkaia, Gipuzkoa, Araba) exigen firma XAdES para TicketBAI y firma PAdES conforme a eIDAS. Easy PDF SDK no implementa ningún tipo de firma digital.
¿Cómo facilita IronPDF el cumplimiento LOPDGDD para datos fiscales (NIF/CIF)?
IronPDF opera completamente on-premise y headless, sin enviar datos de facturación (NIF, CIF, datos fiscales) a servicios externos. Easy PDF SDK requiere sesiones de escritorio interactivas que introducen riesgos adicionales en el tratamiento de datos personales supervisado por la AEPD bajo la LOPDGDD. El procesamiento on-premise de IronPDF simplifica el análisis de cumplimiento LOPDGDD.
¿Cuál es la diferencia entre Easy PDF SDK, iText AGPL e IronPDF para ISVs de facturación en España?
Easy PDF SDK es comercial pero arquitectónicamente incompatible con los requisitos regulatorios españoles (no soporta headless, firma digital ni VeriFactu). iText/iText7 técnicamente puede generar PDFs conformes pero su licencia AGPL obliga a los ISVs de software propietario a publicar su código fuente, complejidad amplificada bajo el régimen de penalizaciones VeriFactu. IronPDF ofrece capacidades técnicas completas (VeriFactu, XAdES, PAdES, Facturae, LOPDGDD) con licenciamiento comercial predecible sin restricciones AGPL.
¿IronPDF puede ejecutarse en Docker/Linux para sistemas de facturación VeriFactu?
Sí. IronPDF soporta Windows, Linux, macOS y Docker/Kubernetes. Easy PDF SDK solo puede ejecutarse en Windows con Microsoft Office instalado y sesiones de escritorio. Para sistemas de facturación VeriFactu modernos que requieren contenedorización o despliegue en Linux, IronPDF es la única opción viable de las tres.

