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í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
<código>nuevo Printer()| UsarChromePdfRenderer`
<código>PrintOfficeDocToPDF()` Conversión de Office tratada de forma diferente
<código>RenderHTMLToPDF() <código>RenderHtmlAsPdf()
Referencias de interoperabilidad COM Eliminar por completo
Configuración del controlador de impresora No es necesario
Callbacks de BeginPrintToFile() 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;
$vbLabelText   $csharpLabel

Referencia completa de migración de API

Mapeo de clases principales

Clase Easy PDF SDK Equivalente de IronPDF Notas
Impresora <código>ChromePdfRenderer` Clase principal de conversión
Documento PDF Documento PDF Manipulación de documentos
<código>HTMLConverter` <código>ChromePdfRenderer Conversión HTML
Configuración de la impresora <código>ChromePdfRenderOptions` Opciones de renderización
Orientación de página Orientación del documento pdf Orientación de la página
<código>TamañoDePágina` <código>TamañoDelPapel Tamaño del papel
<código>SecurityHandler <código>PdfDocument.SecuritySettings Opciones de seguridad

Métodos de creación de PDF

Método Easy PDF SDK Método IronPDF Notas
<código>printer.RenderHTMLToPDF(html, ruta) <código>renderer.RenderHtmlAsPdf(html).SaveAs(path) Cadena HTML
<código>printer.RenderUrlToPDF(url, path) <código>renderer.RenderUrlAsPdf(url).SaveAs(path) Conversión de URL
<código>htmlConverter.ConvertHTML(html, doc) renderer.RenderHtmlAsPdf(html) HTML a PDF
<código>htmlConverter.ConvertURL(url, doc)` <código>renderer.RenderUrlAsPdf(url) URL a PDF

Métodos de manipulación de PDF

Método Easy PDF SDK Método IronPDF Notas
<código>doc.Append(doc2) PdfDocument.Merge(pdf1, pdf2) Fusionar PDF
<código>doc.ExtractPages(start, end)` <código>pdf.CopyPages(start, end) Extraer páginas
doc.DeletePage(index) <código>pdf.RemovePage(index)` Eliminar página
doc.GetPageCount() <código>pdf.PageCount` Número de páginas
doc.Guardar(ruta) <código>pdf.SaveAs(ruta)` Guardar PDF
doc.Close() pdf.Dispose() o usando Limpieza
doc.ExtractText() <código>pdf.ExtractAllText()` Extracción de texto

Opciones de configuración

Opción Easy PDF SDK Opción IronPDF Notas
config.TimeOut <código>RenderingOptions.Timeout` Tiempo de espera (ms)
config.PageOrientation = Landscape <código>RenderingOptions.PaperOrientation = Landscape` Orientación
config.PageSize = A4 <código>RenderingOptions.PaperSize = PdfPaperSize.A4` Tamaño del papel
config.MarginTop/Bottom/Left/Right RenderingOptions.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>HTMLConvertery las llamadas manualesClose()`, 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