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 se representa el texto como imágenes de mapa de bits en lugar de texto real, lo que crea 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 | Se admite |
| 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 deIronPDF: Obtenga su clave de licencia en IronPDF
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
Configuración de licencias
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// 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;
Imports IronPdf
Imports IronPdf.Editing
Mapeos de API principales
| Spire.PDF | IronPDF |
|---|---|
new PdfDocument() |
new ChromePdfRenderer() |
pdf.LoadFromHTML() |
renderer.RenderHtmlAsPdf() |
pdf.LoadFromFile() |
PdfDocument.FromFile() |
pdf.SaveToFile() |
pdf.SaveAs() |
pdf.Close() |
No es necesario |
pdf.Pages.Add() |
renderer.RenderHtmlAsPdf() |
pdf.InsertPageRange() |
PdfDocument.Merge() |
page.Canvas.DrawString() |
TextStamper + ApplyStamp() |
PdfFont |
Estilización CSS en HTML |
PdfBrush |
Estilización CSS en HTML |
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();
}
}
Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports System
Class Program
Shared Sub Main()
Dim pdf As New PdfDocument()
Dim htmlLayoutFormat As New PdfHtmlLayoutFormat()
Dim htmlString As String = "<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()
End Sub
End Class
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");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim htmlString As String = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlString)
pdf.SaveAs("output.pdf")
End Sub
End Class
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(), lo que produce un texto real que es totalmente seleccionable, buscable y accesible. No se requiere la llamada Close():IronPDFutiliza el patrón de eliminación 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();
}
}
Imports Spire.Pdf
Imports System
Class Program
Shared Sub Main()
Dim pdf1 As New PdfDocument()
pdf1.LoadFromFile("document1.pdf")
Dim pdf2 As New PdfDocument()
pdf2.LoadFromFile("document2.pdf")
pdf1.InsertPageRange(pdf2, 0, pdf2.Pages.Count - 1)
pdf1.SaveToFile("merged.pdf")
pdf1.Close()
pdf2.Close()
End Sub
End Class
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");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
End Sub
End Class
Spire.PDF requiere cargar manualmente cada documento con new 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 simple PdfDocument.FromFile() y un método estático PdfDocument.Merge() que acepta múltiples documentos. No se necesitan llamadas 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();
}
}
Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports System.Drawing
Imports System
Class Program
Shared Sub Main()
Dim pdf As New PdfDocument()
Dim page As PdfPageBase = pdf.Pages.Add()
Dim font As New PdfFont(PdfFontFamily.Helvetica, 20)
Dim brush As PdfBrush = New PdfSolidBrush(Color.Black)
page.Canvas.DrawString("Hello from Spire.PDF!", font, brush, New PointF(50, 50))
pdf.SaveToFile("output.pdf")
pdf.Close()
End Sub
End Class
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");
}
}
Imports IronPdf
Imports IronPdf.Editing
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>")
Dim textStamper = New TextStamper() With {
.Text = "Hello from IronPDF!",
.FontSize = 20,
.VerticalOffset = 50,
.HorizontalOffset = 50
}
pdf.ApplyStamp(textStamper)
pdf.SaveAs("output.pdf")
End Sub
End Class
Spire.PDF utiliza un modelo de dibujo basado en lienzo con PdfFont, PdfBrush y page.Canvas.DrawString() para posicionar el texto en coordenadas específicas usando PointF.
IronPDF utiliza un objeto TextStamper con propiedades intuitivas como Text, FontSize, VerticalOffset y HorizontalOffset, 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/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
<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>
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
Dim renderer = New ChromePdfRenderer()
Dim 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
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!
Dim renderer = New ChromePdfRenderer()
Dim 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>"
Dim 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>");
Dim 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 al documento
LoadFromHTML()(estas son las prioritarias para arreglar) - Obtenga la clave de licencia deIronPDFen IronPDF
Actualizaciones de código
- Eliminar el paquete NuGet
Spire.PDF(yFreeSpire.PDFsi se usa la versión gratuita) - Instalar el paquete NuGet
IronPdf - Actualizar las importaciones del espacio de nombres (
using Spire.Pdf;→using IronPdf;) - Reemplazar
LoadFromHTML()conRenderHtmlAsPdf()(CORRECCIÓN CRÍTICA) - Reemplace
new 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

