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
- Entorno .NET: .NET Framework 4.6.2+ o .NET Core 3.1+ / .NET 5/6/7/8/9+
- Acceso a NuGet: Capacidad para instalar paquetes NuGet
- 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 IronPdfConfiguración de licencias
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";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;Mapeos de API principales
| Spire.PDF | IronPDF | Notas |
|---|---|---|
nuevo PdfDocument() | <código>new ChromePdfRenderer()</código | Para la renderización HTML |
| <código>pdf.LoadFromHTML()</código | renderer.RenderHtmlAsPdf() | Conversión de HTML |
| <código>pdf.LoadFromFile()</código | <código>PdfDocument.FromFile()</código | Cargar PDF existente |
| <código>pdf.SaveToFile()</código | <código>pdf.SaveAs()</código | Guardar en archivo |
| <código>pdf.Close()</código | No es necesario | Utiliza el patrón dispose |
| <código>pdf.Pages.Add()</código> | renderer.RenderHtmlAsPdf() | Crear página a partir de HTML |
| <código>pdf.InsertPageRange()</código | PdfDocument.Merge() | Fusionar PDF |
| <código>page.Canvas.DrawString()</código> | TextStamper + ApplyStamp() | Añadir texto |
| <código>PdfFont</código | Estilización CSS en HTML | Configuración de fuentes |
| <código>PdfBrush</código | 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();
}
}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");
}
}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();
}
}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");
}
}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()</códigoy un método estático PdfDocument.Merge()que acepta múltiples documentos. No se necesitan llamadas a Close(). 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();
}
}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");
}
}Spire.PDF utiliza un modelo de dibujo basado en lienzo con PdfFont, PdfBrush, y <código>page.Canvas.DrawString()</código>para posicionar texto en coordenadas específicas utilizando PointF.
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:
- Selección de texto: haga clic y arrastre sobre el texto. Si no hay nada que destaque → IMAGE-BASED
- Ctrl+F Buscar: busca cualquier palabra en la página. Si "No se han encontrado coincidencias" → IMAGE-BASED
- 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
<!-- This HTML renders incorrectly in 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>
<!-- CSS Variables don't work -->
<style>
:root { --primary-color: #007bff; }
h1 { color: var(--primary-color); }
</style><!-- This HTML renders incorrectly in 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>
<!-- CSS Variables don't work -->
<style>
:root { --primary-color: #007bff; }
h1 { color: var(--primary-color); }
</style>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 clearvar 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 clearSoporte 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!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>");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(yFreeSpire.PDFsi usa la versión gratuita) - Instalar el paquete NuGet
IronPdf - Actualizar las importaciones de espacios de nombres (
using Spire.Pdf;→using IronPdf;) - Reemplazar
LoadFromHTML()conRenderHtmlAsPdf()(CORRECCIÓN CRÍTICA) - Reemplace
nuevo PdfDocument()+LoadFromFile()conPdfDocument.FromFile() - Reemplace
InsertPageRange()conPdfDocument.Merge() - Reemplace
Canvas.DrawString()conTextStamper+ApplyStamp() - Reemplace
SaveToFile()conSaveAs() - 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






