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

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:

  1. VeriFactu: No puede generar la leyenda obligatoria VERI*FACTU ni la huella encadenada verificable en la sede electrónica de la AEAT desde entornos de servidor headless.
  2. TicketBAI (Bizkaia, Gipuzkoa, Araba): No implementa firma XAdES ni PAdES conforme a eIDAS — las tres Haciendas Forales del País Vasco exigen ambas.
  3. Crea y Crece (EN 16931/CIUS-ES): No puede incrustar Facturae XML en PDF/A-3 para la factura electrónica B2B.
  4. 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.
  5. 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 loading
  • COM object that has been separated from its underlying RCW cannot be used
  • Timeout expired waiting for print job to complete
  • The printer operation failed because the service is not running
  • Error: 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" .
SHELL

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:

  1. Desinstalar BCL EasyPDF SDK desde Programas y características
  2. Elimine las referencias DLL de su proyecto
  3. Eliminar referencias de interoperabilidad COM
  4. Limpiar las entradas GAC si están presentes

Paso 2: Instalar IronPDF

# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
SHELL

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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()
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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*FACTU y 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.

Curtis Chau
Escritor Técnico

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

Leer más

Equipo de soporte de Iron

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