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

Cómo migrar de Spire.PDF a IronPDF en C#

La migración de Spire.PDF aIronPDFtransforma su flujo de trabajo de generación de PDF de una biblioteca que renderiza texto como imágenes a una que produce texto verdadero, seleccionable y con capacidad de búsqueda utilizando un moderno motor de renderizado Chromium. Esta guía proporciona una ruta de migración completa, paso a paso, que resuelve las limitaciones críticas de renderizado HTML y los problemas de incrustación de fuentes de Spire.PDF.

Por qué migrar de Spire.PDF a IronPDF

Entendiendo Spire.PDF

Spire.PDF es una robusta biblioteca PDF comercial diseñada para que los desarrolladores .NET manejen documentos PDF de forma eficiente. Spire.PDF se ha hecho un hueco en la comunidad de programadores por sus capacidades específicas, especialmente en aplicaciones heredadas, y sus capacidades de integración se alinean a la perfección con otros componentes del conjunto de herramientas E-iceblue.

Sin embargo, Spire.PDF tiene varios problemas fundamentales que afectan a su uso en el mundo real, en particular en torno a la conversión de HTML a PDF y la compatibilidad con los estándares web modernos.

Cuestiones técnicas críticas

Problema Impacto Solución IronPDF
Texto renderizado como imágenes Los PDF no permiten búsquedas, no son accesibles, no se puede copiar el texto Representación de texto real
Dependencia de Internet Explorer Renderizado obsoleto, riesgos de seguridad Motor Chromium moderno
Fallos de incrustación de fuentes Los documentos se ven mal en otros sistemas Manejo fiable de fuentes
Gran despliegue Uso elevado de memoria, inicio lento Despliegue eficaz
Soporte CSS limitado Los diseños modernos no se muestran correctamente Compatibilidad total con CSS3

El problema principal: los PDF basados en imágenes

Un inconveniente importante de Spire.PDF es que tiende a mostrar el texto de los documentos HTML como imágenes. El resultado son PDF en los que el texto no se puede seleccionar ni buscar, lo que puede suponer una grave limitación para las aplicaciones que necesitan funciones de búsqueda o interacción con el texto del documento.

Cuando se utiliza el método LoadFromHTML() de Spire.PDF, a menudo renderiza el texto como imágenes de mapa de bits en lugar de texto real, creando estos problemas:

  • Texto NO seleccionable
  • El texto NO puede buscarse
  • El texto NO puede copiarse
  • Los lectores de pantalla NO PUEDEN leerlo (violación de la accesibilidad)
  • El tamaño del archivo es MUCHO mayor
  • El zoom provoca pixelación

Comparación entre Spire.PDF e IronPDF

Característica Spire.PDF IronPDF
Traducción de HTML a PDF Texto renderizado como imágenes Representación de texto real (seleccionable y con posibilidad de búsqueda)
Motor de renderizado Internet Explorer depende de algunos sistemas Basado en Chromium, compatible con los estándares web modernos
Manejo de fuentes Problemas conocidos con la incrustación de fuentes Manejo de fuentes fiable y sólido
Soporte CSS3 Limitado Completo
Flexbox/Grid No soportado Soporte completo
JavaScript Limitado ES6+ completo
Accesibilidad de PDF Pobre (basado en imágenes) Excelente
Diseño de API Complejo Sencillo e intuitivo
Huella de despliegue Sitio web de gran tamaño Moderado
Licencias Freemium/Comercial Comercial

Para los equipos que planean la adopción de .NET 10 y C# 14 hasta 2025 y 2026,IronPDFresuelve los problemas críticos de la conversión de HTML a PDF de Spire.PDF al representar el texto como texto seleccionable real en lugar de imágenes, lo que garantiza que los PDF se puedan buscar y sean accesibles.


Antes de empezar

Prerrequisitos

  1. Entorno .NET: .NET Framework 4.6.2+ o .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Acceso a NuGet: Capacidad para instalar paquetes NuGet
  3. Licencia de IronPDF: Obtenga su clave de licencia en ironpdf.com

Cambios en el paquete NuGet

# Remove Spire.PDF
dotnet remove package Spire.PDF
dotnet remove package FreeSpire.PDF  # If using free version

# Install IronPDF
dotnet add package IronPdf
# Remove Spire.PDF
dotnet remove package Spire.PDF
dotnet remove package FreeSpire.PDF  # If using free version

# Install IronPDF
dotnet add package IronPdf
SHELL

Configuración de licencias

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
$vbLabelText   $csharpLabel

Referencia completa de la API

Cambios en el espacio de nombres

// Before: Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.HtmlConverter;

// After: IronPDF
using IronPdf;
using IronPdf.Editing;
// Before: Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.HtmlConverter;

// After: IronPDF
using IronPdf;
using IronPdf.Editing;
$vbLabelText   $csharpLabel

Mapeos de API principales

Spire.PDF IronPDF Notas
nuevo PdfDocument() <código>new ChromePdfRenderer()` Para la renderización HTML
<código>pdf.LoadFromHTML() renderer.RenderHtmlAsPdf() Conversión de HTML
<código>pdf.LoadFromFile()` <código>PdfDocument.FromFile() Cargar PDF existente
<código>pdf.SaveToFile() <código>pdf.SaveAs() Guardar en archivo
<código>pdf.Close() No es necesario Utiliza el patrón dispose
<código>pdf.Pages.Add() renderer.RenderHtmlAsPdf() Crear página a partir de HTML
<código>pdf.InsertPageRange()|PdfDocument.Merge()` Fusionar PDF
<código>page.Canvas.DrawString()|TextStamper+ApplyStamp()` Añadir texto
<código>PdfFont` Estilización CSS en HTML Configuración de fuentes
<código>PdfBrush Estilización CSS en HTML Configuración de color/relleno

Ejemplos de migración de código

Ejemplo 1: Conversión de HTML a PDF

Antes (Spire.PDF):

// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System;

class Program
{
    static void Main()
    {
        PdfDocument pdf = new PdfDocument();
        PdfHtmlLayoutFormat htmlLayoutFormat = new PdfHtmlLayoutFormat();

        string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";

        pdf.LoadFromHTML(htmlString, false, true, true);
        pdf.SaveToFile("output.pdf");
        pdf.Close();
    }
}
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System;

class Program
{
    static void Main()
    {
        PdfDocument pdf = new PdfDocument();
        PdfHtmlLayoutFormat htmlLayoutFormat = new PdfHtmlLayoutFormat();

        string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";

        pdf.LoadFromHTML(htmlString, false, true, true);
        pdf.SaveToFile("output.pdf");
        pdf.Close();
    }
}
$vbLabelText   $csharpLabel

Después (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(htmlString);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(htmlString);
        pdf.SaveAs("output.pdf");
    }
}
$vbLabelText   $csharpLabel

Este ejemplo demuestra la diferencia fundamental en la representación de HTML. Spire.PDF utiliza LoadFromHTML() con un objeto PdfHtmlLayoutFormat, que a menudo representa el texto como imágenes de mapa de bits. El resultado son PDF en los que los usuarios no pueden seleccionar, copiar o buscar texto.

IronPDF utiliza un ChromePdfRenderer con RenderHtmlAsPdf(), produciendo texto verdadero que es totalmente seleccionable, consultable y accesible. No se requiere ninguna llamada a Close():IronPDFutiliza el patrón dispose para la limpieza automática. Consulte la documentación de HTML a PDF para ver ejemplos completos.

Ejemplo 2: Fusión de varios PDF

Antes (Spire.PDF):

// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using System;

class Program
{
    static void Main()
    {
        PdfDocument pdf1 = new PdfDocument();
        pdf1.LoadFromFile("document1.pdf");

        PdfDocument pdf2 = new PdfDocument();
        pdf2.LoadFromFile("document2.pdf");

        pdf1.InsertPageRange(pdf2, 0, pdf2.Pages.Count - 1);

        pdf1.SaveToFile("merged.pdf");
        pdf1.Close();
        pdf2.Close();
    }
}
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using System;

class Program
{
    static void Main()
    {
        PdfDocument pdf1 = new PdfDocument();
        pdf1.LoadFromFile("document1.pdf");

        PdfDocument pdf2 = new PdfDocument();
        pdf2.LoadFromFile("document2.pdf");

        pdf1.InsertPageRange(pdf2, 0, pdf2.Pages.Count - 1);

        pdf1.SaveToFile("merged.pdf");
        pdf1.Close();
        pdf2.Close();
    }
}
$vbLabelText   $csharpLabel

Después (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");

        var merged = PdfDocument.Merge(pdf1, pdf2);

        merged.SaveAs("merged.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");

        var merged = PdfDocument.Merge(pdf1, pdf2);

        merged.SaveAs("merged.pdf");
    }
}
$vbLabelText   $csharpLabel

Spire.PDF requiere cargar manualmente cada documento con nuevo PdfDocument()+ LoadFromFile(), luego usar InsertPageRange() para especificar qué páginas insertar, y finalmente llamar a Close() en cada documento.

IronPDF utiliza el patrón más sencillo <código>PdfDocument.FromFile()y un método estáticoPdfDocument.Merge()que acepta múltiples documentos. No se necesitan llamadas aClose()`. Más información en nuestros tutoriales.

Ejemplo 3: Añadir texto a un PDF

Antes (Spire.PDF):

// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System;

class Program
{
    static void Main()
    {
        PdfDocument pdf = new PdfDocument();
        PdfPageBase page = pdf.Pages.Add();

        PdfFont font = new PdfFont(PdfFontFamily.Helvetica, 20);
        PdfBrush brush = new PdfSolidBrush(Color.Black);

        page.Canvas.DrawString("Hello from Spire.PDF!", font, brush, new PointF(50, 50));

        pdf.SaveToFile("output.pdf");
        pdf.Close();
    }
}
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System;

class Program
{
    static void Main()
    {
        PdfDocument pdf = new PdfDocument();
        PdfPageBase page = pdf.Pages.Add();

        PdfFont font = new PdfFont(PdfFontFamily.Helvetica, 20);
        PdfBrush brush = new PdfSolidBrush(Color.Black);

        page.Canvas.DrawString("Hello from Spire.PDF!", font, brush, new PointF(50, 50));

        pdf.SaveToFile("output.pdf");
        pdf.Close();
    }
}
$vbLabelText   $csharpLabel

Después (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");

        var textStamper = new TextStamper()
        {
            Text = "Hello from IronPDF!",
            FontSize = 20,
            VerticalOffset = 50,
            HorizontalOffset = 50
        };

        pdf.ApplyStamp(textStamper);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");

        var textStamper = new TextStamper()
        {
            Text = "Hello from IronPDF!",
            FontSize = 20,
            VerticalOffset = 50,
            HorizontalOffset = 50
        };

        pdf.ApplyStamp(textStamper);
        pdf.SaveAs("output.pdf");
    }
}
$vbLabelText   $csharpLabel

Spire.PDF utiliza un modelo de dibujo basado en lienzo con PdfFont, PdfBrush, y <código>page.Canvas.DrawString()para posicionar texto en coordenadas específicas utilizandoPointF`.

IronPDF utiliza un objeto TextStamper con propiedades intuitivas como Text, FontSize, VerticalOffset y HorizontalOffset, y luego lo aplica con ApplyStamp(). Este enfoque es más declarativo y fácil de mantener.


El problema del texto como imagen

Por qué es tan importante

Cuando Spire.PDF convierte HTML a PDF utilizando renderización basada en imágenes, sus documentos pierden funcionalidad esencial:

1. Sin búsqueda de texto: los usuarios no pueden usar Ctrl+F para buscar texto. Los sistemas de gestión de documentos no pueden indexar el contenido.

2. No se puede seleccionar ni copiar texto: los usuarios que intentan copiar una cita, una referencia o datos no pueden seleccionar texto: es una imagen.

3. Violaciones de accesibilidad: Los PDF basados en imágenes no cumplen con los estándares WCAG 2.1, la Sección 508 (gobierno de EE. UU.), los requisitos de la ADA y no son compatibles con lectores de pantalla.

4. Tamaños de archivo grandes: la misma comparación de contenido muestra que Spire.PDF (basado en imágenes) produce archivos hasta 16 veces más grandes queIronPDF(basado en texto).

Detección: ¿Su PDF está basado en imágenes?

Abra el documento generado con Spire.PDF y realice estas pruebas:

  1. Selección de texto: haga clic y arrastre sobre el texto. Si no hay nada que destaque → IMAGE-BASED
  2. Ctrl+F Buscar: busca cualquier palabra en la página. Si "No se han encontrado coincidencias" → IMAGE-BASED
  3. Copiar/Pegar: selecciona y copia texto en el bloc de notas. Si no pega nada → BASE DE IMAGEN

El problema de Internet Explorer

Motor de renderizado de Spire.PDF

Spire.PDF depende de Internet Explorer/Edge Legacy para la representación HTML en algunos entornos. IE quedó obsoleto en 2022, el CSS moderno no funciona, la compatibilidad con JavaScript es limitada y la representación es incoherente entre sistemas.

CSS moderno que falla en Spire.PDF


<div style="display: flex; justify-content: space-between; gap: 20px;">
    <div style="flex: 1;">Column 1</div>
    <div style="flex: 1;">Column 2</div>
</div>

<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;">
    <div>Item 1</div>
    <div>Item 2</div>
    <div>Item 3</div>
</div>

<style>
:root { --primary-color: #007bff; }
h1 { color: var(--primary-color); }
</style>

<div style="display: flex; justify-content: space-between; gap: 20px;">
    <div style="flex: 1;">Column 1</div>
    <div style="flex: 1;">Column 2</div>
</div>

<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;">
    <div>Item 1</div>
    <div>Item 2</div>
    <div>Item 3</div>
</div>

<style>
:root { --primary-color: #007bff; }
h1 { color: var(--primary-color); }
</style>
HTML

IronPDF utiliza el moderno renderizado Chromium, por lo que todas estas características CSS funcionan correctamente.


Nuevas capacidades tras la migración

Tras migrar a IronPDF, obtendrá funciones que Spire.PDF no puede ofrecer:

Texto seleccionable y buscable

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Important Contract</h1>");
pdf.SaveAs("contract.pdf");

// Result:
// ✅ Text is fully selectable
// ✅ Text is searchable with Ctrl+F
// ✅ Text can be copied to clipboard
// ✅ Screen readers work perfectly
// ✅ File size is compact
// ✅ Zooming is crystal clear
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Important Contract</h1>");
pdf.SaveAs("contract.pdf");

// Result:
// ✅ Text is fully selectable
// ✅ Text is searchable with Ctrl+F
// ✅ Text can be copied to clipboard
// ✅ Screen readers work perfectly
// ✅ File size is compact
// ✅ Zooming is crystal clear
$vbLabelText   $csharpLabel

Soporte CSS moderno

var renderer = new ChromePdfRenderer();

var html = @"
<style>
    :root { --primary: #007bff; }
    .container { display: flex; gap: 20px; }
    .grid { display: grid; grid-template-columns: repeat(3, 1fr); }
</style>
<div class='container'>
    <div style='flex: 1; color: var(--primary)'>Column 1</div>
    <div style='flex: 1'>Column 2</div>
</div>
<div class='grid'>
    <div>Item 1</div>
    <div>Item 2</div>
    <div>Item 3</div>
</div>";

var pdf = renderer.RenderHtmlAsPdf(html);
// All modern CSS features render correctly!
var renderer = new ChromePdfRenderer();

var html = @"
<style>
    :root { --primary: #007bff; }
    .container { display: flex; gap: 20px; }
    .grid { display: grid; grid-template-columns: repeat(3, 1fr); }
</style>
<div class='container'>
    <div style='flex: 1; color: var(--primary)'>Column 1</div>
    <div style='flex: 1'>Column 2</div>
</div>
<div class='grid'>
    <div>Item 1</div>
    <div>Item 2</div>
    <div>Item 3</div>
</div>";

var pdf = renderer.RenderHtmlAsPdf(html);
// All modern CSS features render correctly!
$vbLabelText   $csharpLabel

Marcas de agua basadas en HTML

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.ApplyWatermark(@"
    <div style='
        font-size: 48px;
        color: rgba(255, 0, 0, 0.5);
        transform: rotate(-45deg);
    '>DRAFT</div>");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.ApplyWatermark(@"
    <div style='
        font-size: 48px;
        color: rgba(255, 0, 0, 0.5);
        transform: rotate(-45deg);
    '>DRAFT</div>");
$vbLabelText   $csharpLabel

Lista de comprobación de la migración

Pre-Migración

  • Inventariar todos los usos de Spire.PDF en el código base
  • Probar archivos PDF existentes para comprobar la selección de texto (detección de problemas críticos)
  • Llamadas LoadFromHTML() del documento (estas son las que tienen prioridad para solucionarse)
  • Obtenga la clave de licencia deIronPDFen ironpdf.com

Actualizaciones de código

  • Eliminar el paquete NuGet Spire.PDF (y FreeSpire.PDF si usa la versión gratuita)
  • Instalar el paquete NuGet IronPdf
  • Actualizar las importaciones de espacios de nombres ( using Spire.Pdf;using IronPdf; )
  • Reemplazar LoadFromHTML() con RenderHtmlAsPdf() (CORRECCIÓN CRÍTICA)
  • Reemplace nuevo PdfDocument()+ LoadFromFile() con PdfDocument.FromFile()
  • Reemplace InsertPageRange() con PdfDocument.Merge()
  • Reemplace Canvas.DrawString() con TextStamper + ApplyStamp()
  • Reemplace SaveToFile() con SaveAs()
  • Eliminar todas las llamadas Close() (no es necesario en IronPDF)
  • Agregar inicialización de licencia al iniciar la aplicación

Pruebas

  • Verificar que el texto sea seleccionable en los PDF generados (PRUEBA CRÍTICA)
  • Verificar mejoras en la representación CSS (Flexbox/Grid ahora funcionan)
  • Verificar que los tamaños de los archivos sean más pequeños
  • Pruebe la accesibilidad con lectores de pantalla
  • Comparación de rendimiento

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