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

Cómo migrar de Easy PDF SDK a IronPDF en C#

Easy PDF SDK se basa en varias tecnologías heredadas que plantean importantes retos de implantación y mantenimiento en los entornos de desarrollo modernos.

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
  • El objeto COM que se ha separado de su RCW subyacente no se puede utilizar
  • Tiempo de espera expirado para que se complete el trabajo de impresión
  • La operación de impresión ha fallado porque el servicio no se está ejecutando
  • Error: Acceso denegado (se requiere sesión interactiva)
  • No se encuentra la impresora: 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ísticaSDK Easy PDFIronPDF
PlataformaSólo para WindowsWindows, Linux, macOS, Docker
Dependencia de OfficeRequeridoNinguno
InstalaciónMSI complejo + controlador de impresora + COMPaquete NuGet simple
Soporte de servidorRequiere sesión interactivaEjecuta headless
Representación HTMLBásico (Office)Chromium completo (CSS3, JS)
Soporte .NET.NET Core limitado.NET 5/6/7/8/9 completo
Patrón AsyncBasado en callbackAsync/await nativo
Soporte para contenedoresNo se puede ejecutarDocker/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 SDKCambio requerido
<código>nuevo Printer()</códigoUsar ChromePdfRenderer
<código>PrintOfficeDocToPDF()</códigoConversión de Office tratada de forma diferente
<código>RenderHTMLToPDF()</código<código>RenderHtmlAsPdf()</código
Referencias de interoperabilidad COMEliminar por completo
Configuración del controlador de impresoraNo es necesario
Callbacks de BeginPrintToFile()Async/await nativo
Requisitos de la sesión interactivaEjecuta headless
indexación de páginas basada en 1indexación basada en 0
Tiempo de espera en segundosTiempo 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;
$vbLabelText   $csharpLabel

Referencia completa de migración de API

Mapeo de clases principales

Clase Easy PDF SDKEquivalente de IronPDFNotas
Impresora<código>ChromePdfRenderer</códigoClase principal de conversión
Documento PDFDocumento PDFManipulación de documentos
<código>HTMLConverter</código<código>ChromePdfRenderer</códigoConversión HTML
Configuración de la impresora<código>ChromePdfRenderOptions</códigoOpciones de renderización
Orientación de páginaOrientación del documento pdfOrientación de la página
<código>TamañoDePágina</código<código>TamañoDelPapel</códigoTamaño del papel
<código>SecurityHandler</código<código>PdfDocument.SecuritySettings</códigoOpciones de seguridad

Métodos de creación de PDF

Método Easy PDF SDKMétodo IronPDFNotas
<código>printer.RenderHTMLToPDF(html, ruta)</código<código>renderer.RenderHtmlAsPdf(html).SaveAs(path)</códigoCadena HTML
<código>printer.RenderUrlToPDF(url, path)</código<código>renderer.RenderUrlAsPdf(url).SaveAs(path)</códigoConversión de URL
<código>htmlConverter.ConvertHTML(html, doc)</códigorenderer.RenderHtmlAsPdf(html)HTML a PDF
<código>htmlConverter.ConvertURL(url, doc)</código<código>renderer.RenderUrlAsPdf(url)</códigoURL a PDF

Métodos de manipulación de PDF

Método Easy PDF SDKMétodo IronPDFNotas
<código>doc.Append(doc2)</códigoPdfDocument.Merge(pdf1, pdf2)Fusionar PDF
<código>doc.ExtractPages(start, end)</código<código>pdf.CopyPages(start, end)</códigoExtraer páginas
doc.DeletePage(index)<código>pdf.RemovePage(index)</códigoEliminar página
doc.GetPageCount()<código>pdf.PageCount</códigoNúmero de páginas
doc.Guardar(ruta)<código>pdf.SaveAs(ruta)</códigoGuardar PDF
doc.Close()pdf.Dispose() o usandoLimpieza
doc.ExtractText()<código>pdf.ExtractAllText()</códigoExtracción de texto

Opciones de configuración

Opción Easy PDF SDKOpción IronPDFNotas
config.TimeOut<código>RenderingOptions.Timeout</códigoTiempo de espera (ms)
config.PageOrientation = Landscape<código>RenderingOptions.PaperOrientation = Landscape</códigoOrientación
config.PageSize = A4<código>RenderingOptions.PaperSize = PdfPaperSize.A4</códigoTamaño del papel
config.MarginTop/Bottom/Left/RightRenderingOptions.MarginTop, etc.Márgenes

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

IronPDF elimina la clase separada <código>HTMLConverter</códigoy las llamadas manuales Close(), lo que da como resultado un código más limpio y 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();
    }
}
$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");
    }
}
$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();
    }
}
$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");
    }
}
$vbLabelText   $csharpLabel

El método estático Merge deIronPDFacepta varios 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");
$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");
$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();
$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");
    }
}
$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);
$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;
$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");
    }
}
$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: No se encuentra la impresora: 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);
$vbLabelText   $csharpLabel

Asunto: Errores de interoperabilidad COM

Síntoma: Error al cargar DLL o errores 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);
$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;
$vbLabelText   $csharpLabel

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

Proteja su infraestructura PDF

Con .NET 10 en el horizonte y C# 14 introduciendo nuevas características del lenguaje, la elección de una biblioteca PDF multiplataforma garantiza la compatibilidad con los modelos de implantación en evolución. La compatibilidad deIronPDFcon Linux, Docker y las arquitecturas nativas de la nube significa que su inversión en migración dará sus frutos a medida que los proyectos se extiendan hasta 2025 y 2026, sin las limitaciones exclusivas de Windows 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.

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