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

Cómo migrar de SelectPdf a IronPDF en C#

Migrar de SeleccionePdfa IronPDF: Guía completa de migración a 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

ProblemaImpactoSolución IronPDF
Sólo para WindowsNo se puede implementar en Linux, Docker o Azure FunctionsSoporte multiplataforma completo
Motor de renderizado obsoletoEl CSS moderno falla, los diseños se rompenChromium actualizado
Límite de 5 páginas de la versión gratuitaMarca de agua agresiva después de 5 páginasPrueba generosa
No compatible con .NET 10Problemas de cara al futuroCompatibilidad total con .NET 10
Despliegue en la nube bloqueadoNo se puede utilizar AWS Lambda, Azure FunctionsNube nativa

Comparación entre SeleccionePdfe IronPDF

CaracterísticaSeleccionePdfIronPDF
Soporte de PlataformaSólo WindowsTotalmente multiplataforma, más de 10 distribuciones
Soporte de estándares web modernosLimitado (Blink anticuado)CSS3 completo, Chromium moderno
Límite máximo de páginas de la versión gratuita5 páginasFlexible, sin límite estricto
PreciosA partir de 499Precios transparentes y flexibles
Soporte .NET 10NingunoSoporte completo
Despliegue en entornos de nubeNo compatibleTotalmente compatible
CSS GridLimitadoSoporte completo
FlexboxLimitadoSoporte completo
Variables CSSNo soportadoSoporte completo
DockerNO SE APOYAImágenes oficiales
Funciones AzureNO SE APOYASoporte completo
AWS LambdaNO SE APOYASoporte 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

  1. <Entorno .NET: .NET Framework 4.6.2+ o .NET Core 3.1+ / .NET 5/6/7/8/9/10+
  2. Acceso a NuGet: Capacidad para instalar paquetes NuGet
  3. Licencia 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 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";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Core API Mappings

SeleccionePdfIronPDFNotas
<código>HtmlToPdf</código<código>ChromePdfRenderer</códigoClase 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ódigoConversión de URL
doc.Guardar(ruta)<código>pdf.SaveAs(ruta)</códigoGuardar en archivo
doc.Close()No es necesarioIronPDFse encarga de la limpieza
<código>converter.Options.PdfPageSize</código<código>renderer.RenderingOptions.PaperSize</códigoTamaño del papel
<código>converter.Options.PdfPageOrientation</código<código>renderer.RenderingOptions.PaperOrientation</códigoOrientación
<código>converter.Options.MarginTop</código<código>renderer.RenderingOptions.MarginTop</códigoMargen superior
<código>converter.Options.MarginBottom</código<código>renderer.RenderingOptions.MarginBottom</códigoMargen inferior
<código>converter.Options.MarginLeft</código<código>renderer.RenderingOptions.MarginLeft</códigoMargen izquierdo
<código>converter.Options.MarginRight</código<código>renderer.RenderingOptions.MarginRight</códigoMargen derecho
<código>TamañoPáginaPdf.A4</código<código>TamañoPapelPdf.A4</códigoEnum tamaño A4
<código>PdfPageOrientation.Portrait</código<código>PdfPaperOrientation.Portrait</códigoRetrato enum
<código>PdfPageOrientation.Landscape</código<código>PdfPaperOrientation.Landscape</códigoEntorno
<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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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 cualquier afirmación de marketing, SeleccionePdfno admite explícitamente:

  • 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

PlataformaSeleccionePdfIronPDF
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 CSSSeleccionePdfIronPDF
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");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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!
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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");
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Lista de comprobación de la migración

Pre-Migración

  • [Auditoría de todos los usos de SeleccionePdfen el código base
  • [ ] Documentar las opciones de conversión actuales para la asignación
  • [ ] Identificar implementaciones de encabezado/pie de página
  • [ ] Comprobar la sintaxis del marcador de posición del número de página ({número_de_página}{página})
  • [ ] Tenga en cuenta los patrones de manejo de URL base
  • [ ] Verificar las plataformas de despliegue de destino
  • [ ] Obtenga la clave de licencia deIronPDFen ironpdf.com

Actualizaciones de código

  • [ ] Eliminar el paquete NuGet Select.HtmlToPdf
  • [ ] Instalar IronPdf paquete NuGet
  • [ ] Actualizar las importaciones de espacios de nombres (usando SelectPdf;usando IronPDF;)
  • [ ] Sustituir <código>HtmlToPdf</códigopor ChromePdfRenderer
  • [ ] Sustituya ConvertHtmlString() por RenderHtmlAsPdf()
  • [ ] Sustituya ConvertUrl() por RenderUrlAsPdf()
  • [ ] Actualizar los nombres de las propiedades de las opciones (Options.PdfPageSizeRenderingOptions.PaperSize)
  • [ ] Convertir PdfPageSize a PdfPaperSize
  • [ ] Convertir PdfPageOrientation a PdfPaperOrientation
  • [Reemplace doc.Save() por pdf.SaveAs()
  • [ ] Eliminar todas las llamadas a doc.Close()
  • [ ] Corregir los marcadores de posición de número de página ({page_number}{page}, {total_pages}{total-pages})
  • [ ] Añadir inicialización de licencia al inicio de la aplicación

Posmigración

  • [ ] Ejecutar todas las pruebas unitarias
  • [ ] Verificar el renderizado CSS (especialmente Grid/Flexbox)
  • [ ] Prueba de ejecución de JavaScript
  • [ ] Verificar los números de página del encabezado/pie de página
  • [ ] Prueba en plataformas de destino (Linux, Docker, etc.)
  • [Prueba de rendimiento
  • [ ] Comparar la calidad de salida de PDF
  • [ ] Actualización de procesos CI/CD
  • [ ] Pruebas de implementación en la nube (si procede)

Conclusión

Aunque SeleccionePdfes una potente biblioteca de conversión de HTML a PDF con una API sencilla, sus limitaciones en cuanto a flexibilidad de plataforma y compatibilidad con estándares web obsoletos pueden disuadir a los desarrolladores. La biblioteca se comercializa falsamente como multiplataforma, pero explícitamente no es compatible con Linux, macOS, Docker o Azure Functions, por lo que no es adecuada para las implementaciones modernas en la nube. La versión gratuita está muy limitada a 5 páginas antes de que aparezca la agresiva marca de agua, y su anticuado fork de Chromium tiene problemas con las modernas funciones CSS como Grid y los diseños avanzados de Flexbox.

Los cambios clave en esta migración son:

  1. Soporte de plataformas: Solo Windows → Multiplataforma completa (más de 10 distros Linux, Docker, nube)
  2. Motor de renderizado: Blink/WebKit obsoleto → Chromium estable más reciente
  3. Soporte CSS: Grid/Flexbox limitado → Soporte CSS3 completo
  4. Soporte .NET: Sin .NET 10 → Soporte completo de .NET 10
  5. Clase del conversor: <código>HtmlToPdf</código→ ChromePdfRenderer
  6. ConversiónHTML: ConvertHtmlString()RenderHtmlAsPdf()
  7. Conversión de URL: ConvertUrl()RenderUrlAsPdf()
  8. Método Guardar: doc.Save()pdf.SaveAs()
  9. Limpieza: doc.Close()necesario → No necesario (automático)
  10. Tamaño de página: <código>TamañoPáginaPdf.A4</código→ PdfPaperSize.A4
  11. Orientación: PdfPageOrientationPdfPaperOrientation
  12. Números de página: <código>{número_de_página}</código→ {page}, {total_pages}{total-pages}

Es probable que los desarrolladores que busquen soluciones sólidas, modernas y multiplataforma se inclinen por IronPDF, especialmente dada su amplia compatibilidad con los estándares web y los entornos de implementación actuales.

Explore la documentación completa de IronPDF, tutoriales y referencia de API para acelerar su migración a SelectPdf.

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