Cómo migrar de SelectPdf a IronPDF en C#
La migración de SeleccionePdfaIronPDFtransforma su flujo de trabajo de generación de PDF de una solución exclusiva para Windows con un motor de renderizado obsoleto a una biblioteca moderna y multiplataforma con compatibilidad total con CSS3 y JavaScript. Esta guía proporciona una ruta de migración completa paso a paso que permite la implementación en Linux, Docker, Funciones Azurey otras plataformas en la nube que SeleccionePdfno puede admitir.
Por qué migrar de SeleccionePdfa IronPDF
Entender SelectPdf
SelectPdf es una biblioteca comercial diseñada para convertir contenido HTML en PDF utilizando C#. La biblioteca está pensada para desarrolladores que requieren una integración perfecta de la funcionalidad de generación de PDF en sus aplicaciones. El punto fuerte de SeleccionePdfreside en su sencilla API, que lo convierte en una opción atractiva para quienes se inician en la generación de PDF.
Sin embargo, los usuarios potenciales deben ser conscientes de sus limitaciones críticas. A pesar de anunciar su capacidad multiplataforma, SeleccionePdfsolo funciona en entornos Windows. Esto supone una barrera importante a la hora de considerar soluciones de implementación basadas en la nube, como Funciones Azureo contenedores como Docker. Además, su versión gratuita está significativamente limitada, ya que solo permite hasta cinco páginas antes de aplicar una agresiva marca de agua. SeleccionePdfaprovecha una bifurcación obsoleta de Blink y una arquitectura basada en WebKit, lo que provoca problemas de compatibilidad con tecnologías web modernas como Rejilla CSSy flexbox avanzado.
Limitaciones críticas de SelectPdf
| Problema | Impacto | Solución IronPDF |
|---|---|---|
| Sólo para Windows | No se puede implementar en Linux, Docker o Azure Functions | Soporte multiplataforma completo |
| Motor de renderizado obsoleto | El CSS moderno falla, los diseños se rompen | Chromium actualizado |
| Límite de 5 páginas de la versión gratuita | Marca de agua agresiva después de 5 páginas | Prueba generosa |
| No compatible con .NET 10 | Problemas de cara al futuro | Compatibilidad total con .NET 10 |
| Despliegue en la nube bloqueado | No se puede utilizar AWS Lambda, Azure Functions | Nube nativa |
Comparación entre SeleccionePdfe IronPDF
| Característica | SeleccionePdf | IronPDF |
|---|---|---|
| Soporte de Plataforma | Sólo Windows | Totalmente multiplataforma, más de 10 distribuciones |
| Soporte de estándares web modernos | Limitado (Blink anticuado) | CSS3 completo, Chromium moderno |
| Límite máximo de páginas de la versión gratuita | 5 páginas | Flexible, sin límite estricto |
| Precios | A partir de 499 | Precios transparentes y flexibles |
| Soporte .NET 10 | Ninguno | Soporte completo |
| Despliegue en entornos de nube | No compatible | Totalmente compatible |
| CSS Grid | Limitado | Soporte completo |
| Flexbox | Limitado | Soporte completo |
| Variables CSS | No soportado | Soporte completo |
| Docker | NO SE APOYA | Imágenes oficiales |
| Funciones Azure | NO SE APOYA | Soporte completo |
| AWS Lambda | NO SE APOYA | Soporte completo |
Para los equipos que planean la adopción de .NET 10 y C# 14 hasta 2025 y 2026, SeleccionePdfno es compatible explícitamente con .NET 10, lo que crea problemas de preparación para el futuro.IronPDFes totalmente compatible con todas las versiones modernas de .NET.
Antes de empezar
Prerrequisitos
- Entorno .NET: .NET Framework 4.6.2+ o .NET Core 3.1+ / .NET 5/6/7/8/9/10+
- 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 SelectPdf
dotnet remove package Select.HtmlToPdf
# Install IronPDF
dotnet add package IronPdf# Remove SelectPdf
dotnet remove package Select.HtmlToPdf
# 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: SelectPdf
using SelectPdf;
// After: IronPDF
using IronPdf;
using IronPdf.Engines.Chrome;// Before: SelectPdf
using SelectPdf;
// After: IronPDF
using IronPdf;
using IronPdf.Engines.Chrome;Mapeos de API principales
| SeleccionePdf | IronPDF | Notas |
|---|---|---|
| <código>HtmlToPdf</código | <código>ChromePdfRenderer</código | Clase de convertidor principal |
converter.ConvertHtmlString(html) | renderer.RenderHtmlAsPdf(html) | Conversión de cadenas HTML |
| <código>converter.ConvertUrl(url)</código | <código>renderer.RenderUrlAsPdf(url)</código | Conversión de URL |
doc.Guardar(ruta) | <código>pdf.SaveAs(ruta)</código | Guardar en archivo |
doc.Close() | No es necesario | IronPDFse encarga de la limpieza |
| <código>converter.Options.PdfPageSize</código | <código>renderer.RenderingOptions.PaperSize</código | Tamaño del papel |
| <código>converter.Options.PdfPageOrientation</código | <código>renderer.RenderingOptions.PaperOrientation</código | Orientación |
| <código>converter.Options.MarginTop</código | <código>renderer.RenderingOptions.MarginTop</código | Margen superior |
| <código>converter.Options.MarginBottom</código | <código>renderer.RenderingOptions.MarginBottom</código | Margen inferior |
| <código>converter.Options.MarginLeft</código | <código>renderer.RenderingOptions.MarginLeft</código | Margen izquierdo |
| <código>converter.Options.MarginRight</código | <código>renderer.RenderingOptions.MarginRight</código | Margen derecho |
| <código>TamañoPáginaPdf.A4</código | <código>TamañoPapelPdf.A4</código | Enum tamaño A4 |
| <código>PdfPageOrientation.Portrait</código | <código>PdfPaperOrientation.Portrait</código | Retrato enum |
| <código>PdfPageOrientation.Landscape</código | <código>PdfPaperOrientation.Landscape</código | Entorno |
| <código>{número_de_página}</código | {page} | Marcador de posición del número de página |
{total_pages} | {total de páginas} | Total de páginas |
Ejemplos de migración de código
Ejemplo 1: Conversión de cadenas HTML a PDF
Antes (SelectPdf):
// NuGet: Install-Package Select.HtmlToPdf
using SelectPdf;
using System;
class Program
{
static void Main()
{
string htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
HtmlToPdf converter = new HtmlToPdf();
PdfDocument doc = converter.ConvertHtmlString(htmlContent);
doc.Save("document.pdf");
doc.Close();
Console.WriteLine("PDF generated from HTML string");
}
}// NuGet: Install-Package Select.HtmlToPdf
using SelectPdf;
using System;
class Program
{
static void Main()
{
string htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
HtmlToPdf converter = new HtmlToPdf();
PdfDocument doc = converter.ConvertHtmlString(htmlContent);
doc.Save("document.pdf");
doc.Close();
Console.WriteLine("PDF generated from HTML string");
}
}Después (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("document.pdf");
Console.WriteLine("PDF generated from HTML string");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("document.pdf");
Console.WriteLine("PDF generated from HTML string");
}
}Este ejemplo muestra las principales diferencias entre las API. SeleccionePdfutiliza <código>HtmlToPdf</códigocomo clase conversora, llamando a ConvertHtmlString() para crear un PdfDocument, luego Save() y Close() para persistir y limpiar.
IronPDF utiliza <código>ChromePdfRenderer</códigocon RenderHtmlAsPdf(), devolviendo un PdfDocument que se guarda con SaveAs(). Se elimina la llamada Close():IronPDFgestiona los recursos automáticamente. Consulte la documentación HTML a PDF para ver ejemplos completos.
Ejemplo 2: Conversión de URL a PDF
Antes (SelectPdf):
// NuGet: Install-Package Select.HtmlToPdf
using SelectPdf;
using System;
class Program
{
static void Main()
{
HtmlToPdf converter = new HtmlToPdf();
PdfDocument doc = converter.ConvertUrl("https://www.example.com");
doc.Save("output.pdf");
doc.Close();
Console.WriteLine("PDF created successfully");
}
}// NuGet: Install-Package Select.HtmlToPdf
using SelectPdf;
using System;
class Program
{
static void Main()
{
HtmlToPdf converter = new HtmlToPdf();
PdfDocument doc = converter.ConvertUrl("https://www.example.com");
doc.Save("output.pdf");
doc.Close();
Console.WriteLine("PDF created successfully");
}
}Después (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}El método ConvertUrl() de SeleccionePdfse asigna directamente a RenderUrlAsPdf() de IronPDF. La diferencia crítica está en el motor de renderizado: SeleccionePdfutiliza un fork anticuado de Blink/WebKit que tiene problemas con CSS moderno, mientras queIronPDFutiliza el último Chromium estable para soporte completo de CSS3 y JavaScript. Más información en nuestros tutoriales.
Ejemplo 3: Configuración de página personalizada y márgenes
Antes (SelectPdf):
// NuGet: Install-Package Select.HtmlToPdf
using SelectPdf;
using System;
class Program
{
static void Main()
{
HtmlToPdf converter = new HtmlToPdf();
converter.Options.PdfPageSize = PdfPageSize.A4;
converter.Options.PdfPageOrientation = PdfPageOrientation.Portrait;
converter.Options.MarginTop = 20;
converter.Options.MarginBottom = 20;
converter.Options.MarginLeft = 20;
converter.Options.MarginRight = 20;
string html = "<html><body><h1>Custom Page Settings</h1></body></html>";
PdfDocument doc = converter.ConvertHtmlString(html);
doc.Save("custom-settings.pdf");
doc.Close();
Console.WriteLine("PDF with custom settings created");
}
}// NuGet: Install-Package Select.HtmlToPdf
using SelectPdf;
using System;
class Program
{
static void Main()
{
HtmlToPdf converter = new HtmlToPdf();
converter.Options.PdfPageSize = PdfPageSize.A4;
converter.Options.PdfPageOrientation = PdfPageOrientation.Portrait;
converter.Options.MarginTop = 20;
converter.Options.MarginBottom = 20;
converter.Options.MarginLeft = 20;
converter.Options.MarginRight = 20;
string html = "<html><body><h1>Custom Page Settings</h1></body></html>";
PdfDocument doc = converter.ConvertHtmlString(html);
doc.Save("custom-settings.pdf");
doc.Close();
Console.WriteLine("PDF with custom settings created");
}
}Después (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Engines.Chrome;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
string html = "<html><body><h1>Custom Page Settings</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("custom-settings.pdf");
Console.WriteLine("PDF with custom settings created");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Engines.Chrome;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
string html = "<html><body><h1>Custom Page Settings</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("custom-settings.pdf");
Console.WriteLine("PDF with custom settings created");
}
}El patrón de configuración de la página es casi idéntico, con cambios sencillos en los nombres de las propiedades:
- <código>converter.Options.PdfPageSize</código→
renderer.RenderingOptions.PaperSize - <código>converter.Options.PdfPageOrientation</código→
renderer.RenderingOptions.PaperOrientation - <código>TamañoPáginaPdf.A4</código→
PdfPaperSize.A4 - <código>PdfPageOrientation.Portrait</código→
PdfPaperOrientation.Portrait
Las propiedades de los márgenes mantienen los mismos nombres y unidades.
El problema de Windows
Limitación de la plataforma SelectPdf
A pesar de las afirmaciones de marketing, SeleccionePdfexplícitamente no admite:
- Linux (cualquier distribución)
- macOS
- Contenedores Docker
- Funciones Azure -AWS Lambda
- Funciones de Google Cloud
- Cualquier sistema basado en ARM
Se trata de una limitación arquitectónica fundamental: SeleccionePdfdepende de bibliotecas específicas de Windows y no se puede portar.
Comparación de plataformas
| Plataforma | SeleccionePdf | IronPDF |
|---|---|---|
| Windows Server 2019+ | ✅ | ✅ |
| Windows 10/11 | ✅ | ✅ |
| Ubuntu 20.04+ | ❌ | ✅ |
| Debian 10+ | ❌ | ✅ |
| CentOS 7+ | ❌ | ✅ |
| Alpine Linux | ❌ | ✅ |
| Amazon Linux 2 | ❌ | ✅ |
| macOS 10.15+ | ❌ | ✅ |
| Azure App Service (Linux) | ❌ | ✅ |
| Funciones Azure | ❌ | ✅ |
| AWS Lambda | ❌ | ✅ |
| Docker (Linux) | ❌ | ✅ |
| Kubernetes | ❌ | ✅ |
El motor de renderizado anticuado
Comparación de funciones de CSS
SelectPdf utiliza una bifurcación obsoleta de Blink/WebKit que no ha seguido el ritmo de los estándares web modernos:
| Característica CSS | SeleccionePdf | IronPDF |
|---|---|---|
| Rejilla CSS | ⚠️ Parcial/roto | ✅Completo |
| Flexbox (básico) | ✅ | ✅ |
| Flexbox (propiedad gap) | ❌ | ✅ |
| Variables CSS | ❌ | ✅ |
| CSS calc() | ⚠️ Limitada | ✅ |
| @media imprimir | ⚠️ Limitada | ✅ |
| @font-face | ⚠️ Limitada | ✅ |
| Fuentes web | ⚠️ Limitada | ✅ |
| SVG | ⚠️ Básico | ✅Completo |
| Transformaciones CSS | ⚠️ Limitada | ✅ |
| Animaciones CSS | ❌ | ✅ |
Nuevas capacidades tras la migración
Tras migrar a IronPDF, obtendrá funciones que SeleccionePdfno puede ofrecer:
Despliegue multiplataforma
// ✅IronPDF- Works everywhere
using IronPdf;
// Azure App Service (Linux)- WORKS
// Docker container - WORKS
// AWS Lambda- WORKS
// GitHub Actions on ubuntu-latest - WORKS
// macOS development - WORKS
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello</h1>");
pdf.SaveAs("output.pdf");// ✅IronPDF- Works everywhere
using IronPdf;
// Azure App Service (Linux)- WORKS
// Docker container - WORKS
// AWS Lambda- WORKS
// GitHub Actions on ubuntu-latest - WORKS
// macOS development - WORKS
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello</h1>");
pdf.SaveAs("output.pdf");Soporte CSS moderno
// ✅IronPDF- Uses latest stable Chromium
var renderer = new ChromePdfRenderer();
var html = @"
<style>
:root { --primary: #007bff; --gap: 20px; }
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--gap); }
</style>
<div class='grid'>
<div style='background: var(--primary); color: white; padding: 1rem;'>Item 1</div>
<div style='background: var(--primary); color: white; padding: 1rem;'>Item 2</div>
<div style='background: var(--primary); color: white; padding: 1rem;'>Item 3</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
// All modern CSS features render correctly!// ✅IronPDF- Uses latest stable Chromium
var renderer = new ChromePdfRenderer();
var html = @"
<style>
:root { --primary: #007bff; --gap: 20px; }
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--gap); }
</style>
<div class='grid'>
<div style='background: var(--primary); color: white; padding: 1rem;'>Item 1</div>
<div style='background: var(--primary); color: white; padding: 1rem;'>Item 2</div>
<div style='background: var(--primary); color: white; padding: 1rem;'>Item 3</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
// All modern CSS features render correctly!No es necesario Close()
IronPDF gestiona los recursos automáticamente:
// Option 1: Let garbage collection handle it
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// No Close() needed
// Option 2: Explicit disposal
using (var pdf = renderer.RenderHtmlAsPdf(html))
{
pdf.SaveAs("output.pdf");
}// Option 1: Let garbage collection handle it
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// No Close() needed
// Option 2: Explicit disposal
using (var pdf = renderer.RenderHtmlAsPdf(html))
{
pdf.SaveAs("output.pdf");
}Lista de comprobación de la migración
Pre-Migración
- Auditar todos los usos de SeleccionePdfen el código base
- Documentar las opciones actuales del convertidor para el mapeo
- Identificar implementaciones de encabezado/pie de página
- Verificar la sintaxis del marcador de posición del número de página ( <código>{número_de_página}</código→
{page}) - Tenga en cuenta los patrones de manejo de URL base
- Verificar las plataformas de implementación de destino
- Obtenga la clave de licencia deIronPDFen ironpdf.com
Actualizaciones de código
- Eliminar el paquete NuGet
Select.HtmlToPdf - Instalar el paquete NuGet
IronPdf - Actualizar las importaciones de espacios de nombres (
using SelectPdf;→using IronPdf;) - Reemplazar <código>HtmlToPdf</códigocon
ChromePdfRenderer - Reemplace
ConvertHtmlString()conRenderHtmlAsPdf() - Reemplace
ConvertUrl()conRenderUrlAsPdf() - Actualizar los nombres de las propiedades de las opciones (
Options.PdfPageSize→RenderingOptions.PaperSize) - Convertir
PdfPageSizeaPdfPaperSize - Convertir
PdfPageOrientationaPdfPaperOrientation - Reemplace
doc.Save()conpdf.SaveAs() - Eliminar todas las llamadas
doc.Close() - Corregir los marcadores de posición de número de página ( <código>{número_de_página}</código→
{page},{total_pages}→{total de páginas}) - Agregar inicialización de licencia al iniciar la aplicación
Posmigración
- Ejecutar todas las pruebas unitarias
- Verificar la representación CSS (especialmente Grid/Flexbox)
- Probar la ejecución de JavaScript
- Verificar los números de página de encabezado/pie de página
- Prueba en plataformas de destino (Linux, Docker, etc.)
- Prueba de rendimiento
- Comparar la calidad de salida de PDF
- Actualizar los pipelines de CI/CD
- Probar implementaciones en la nube (si corresponde)






