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

Cómo migrar de Syncfusion PDF a IronPDF en C#

Migrar de Syncfusion PDFa IronPDF: Guía completa de migración a C

La migración de Syncfusion PDFFramework aIronPDFtransforma su flujo de trabajo de generación de PDF de una API de gráficos basada en coordenadas incluida en una gran suite a una biblioteca independiente basada en HTML/CSS con renderización moderna en Chromium. Esta guía proporciona una ruta de migración completa, paso a paso, que elimina las licencias exclusivas de suite, los complejos requisitos de despliegue y el posicionamiento basado en coordenadas.

Por qué migrar de Syncfusion PDFa IronPDF

Comprensión de Syncfusion PDFFramework

Syncfusion PDF Framework es una completa biblioteca que ofrece una amplia gama de funciones para crear, editar y proteger documentos PDF utilizando C#. Forma parte de Essential Studio de Syncfusion, que incluye más de mil componentes para múltiples plataformas.

Sin embargo, uno de sus inconvenientes más significativos es que no puede adquirirse como producto independiente; los desarrolladores deben comprar el paquete completo de componentes Syncfusion. Este requisito puede resultar engorroso para los equipos interesados únicamente en las funcionalidades de PDF, sobre todo porque este paquete podría incluir herramientas innecesarias para sus proyectos.

El problema de las licencias de paquetes

El modelo de licencias de Syncfusion plantea importantes retos a los equipos que solo necesitan la funcionalidad PDF:

  1. Compra exclusiva de la suite: No se puede comprar la biblioteca PDF por separado; es necesario adquirir Essential Studio completo
  2. Restricciones de la licencia comunitaria: El nivel gratuito requiere <$1M de ingresos Y <5 desarrolladores
  3. Licencias de despliegue complejo: Diferentes licencias para despliegues web, de escritorio, de servidor
  4. Renovación anual obligatoria: modelo de suscripción con costes anuales
  5. Precios por desarrollador: Los costes escalan linealmente con el tamaño del equipo
  6. Suite Bloat: Incluye más de 1000 componentes que puede que no necesites

Comparación entre Syncfusion PDFe IronPDF

AspectoSyncfusion PDFIronPDF
Modelo de compraSólo paquete SuiteIndependiente
LicenciasNiveles complejosSimple por desarrollador
Límite de la comunidad<$1M Y <5 desarrolladoresPrueba gratuita, luego licencia
DespliegueMúltiples tipos de licenciaUna licencia cubre todos
Estilo APIGráficos basados en coordenadasHTML/CSS primero
Soporte HTMLRequiere BlinkBinariesCromo nativo
Soporte CSSLimitadoCSS3/flexbox/grid completo
DependenciasMúltiples paquetesNuGet único
Requisitos de la suiteSí (conjunto completo)No
Enfoque en PDFAmplio; parte de un paquete más amplioEstrecha; Enfocado a PDF

IronPDF ofrece un enfoque más centrado al ofrecer sus funciones PDF como producto independiente. Esta diferencia afecta significativamente tanto a los costes como a la facilidad de integración.

Para los equipos que planifican la adopción de .NET 10 y C# 14 hasta 2025 y 2026, la licencia independiente y el enfoque HTML/CSS primerodeIronPDFproporcionan flexibilidad sin dependencias de la suite.


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 IronPDF: Obtenga su clave de licencia en ironpdf.com

Cambios en el paquete NuGet

# Remove Syncfusion packages
dotnet remove package Syncfusion.Pdf.Net.Core
dotnet remove package Syncfusion.HtmlToPdfConverter.Net.Windows
dotnet remove package Syncfusion.Licensing

# Install IronPDF
dotnet add package IronPdf
# Remove Syncfusion packages
dotnet remove package Syncfusion.Pdf.Net.Core
dotnet remove package Syncfusion.HtmlToPdfConverter.Net.Windows
dotnet remove package Syncfusion.Licensing

# Install IronPDF
dotnet add package IronPdf
SHELL

Configuración de licencias

Syncfusion:

// Must register before any Syncfusion calls
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-SYNCFUSION-KEY");
// Must register before any Syncfusion calls
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-SYNCFUSION-KEY");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF:

// One-time at startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-KEY";
// One-time at startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-KEY";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Referencia completa de la API

Cambios en el espacio de nombres

// Before: Syncfusion PDF
using Syncfusion.Pdf;
using Syncfusion.Pdf.Graphics;
using Syncfusion.Pdf.Parsing;
using Syncfusion.HtmlConverter;
using Syncfusion.Drawing;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: Syncfusion PDF
using Syncfusion.Pdf;
using Syncfusion.Pdf.Graphics;
using Syncfusion.Pdf.Parsing;
using Syncfusion.HtmlConverter;
using Syncfusion.Drawing;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Core API Mappings

SyncfusionIronPDFNotas
Documento PDF<código>ChromePdfRenderer</códigoCreación de PDF
<código>PdfLoadedDocument</código<código>PdfDocument.FromFile()</códigoCargar PDF
<código>HtmlToPdfConverter</código<código>ChromePdfRenderer</códigoConversión de HTML
<código>graphics.DrawString()</código>Elementos de texto HTML<código>

</código>, <código>

</código>

<código>graphics.DrawImage()</código><código> related to Core API Mappings</código> etiquetaImágenes HTML
<código>PdfGrid</códigoHTML <código></código>Tablas
<código>PdfStandardFont</códigoCSS familyFuentes
<código>PdfBrushes.Black</códigoCSS color: negroColores
documento.Seguridad<código>pdf.SecuritySettings</códigoSeguridad
Extractor de texto pdf<código>pdf.ExtractAllText()</códigoExtracción de texto
<código>ImportPageRange()</códigoPdfDocument.Merge()Fusión
<código>document.Save(stream)</código<código>pdf.SaveAs(ruta)</códigoGuardar
document.Close(true)No es necesarioLimpieza automática

Ejemplos de migración de código

Ejemplo 1: Conversión de HTML/URL a PDF

Antes (Syncfusion PDF):

// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.HtmlConverter;
using Syncfusion.Pdf;
using System.IO;

class Program
{
    static void Main()
    {
        // Initialize HTML to PDF converter
        HtmlToPdfConverter htmlConverter = new HtmlToPdfConverter();

        // Convert URL to PDF
        PdfDocument document = htmlConverter.Convert("https://www.example.com");

        // Save the document
        FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
        document.Save(fileStream);
        document.Close(true);
        fileStream.Close();
    }
}
// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.HtmlConverter;
using Syncfusion.Pdf;
using System.IO;

class Program
{
    static void Main()
    {
        // Initialize HTML to PDF converter
        HtmlToPdfConverter htmlConverter = new HtmlToPdfConverter();

        // Convert URL to PDF
        PdfDocument document = htmlConverter.Convert("https://www.example.com");

        // Save the document
        FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
        document.Save(fileStream);
        document.Close(true);
        fileStream.Close();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Después (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        // Create a PDF from a URL
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");

        // Save the PDF
        pdf.SaveAs("Output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        // Create a PDF from a URL
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");

        // Save the PDF
        pdf.SaveAs("Output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Este ejemplo muestra las diferencias fundamentales entre las API. Syncfusion PDFrequiere una instancia de HtmlToPdfConverter, llamar a Convert() que devuelve un PdfDocument, luego crear manualmente un FileStream, guardar y cerrar tanto el documento como el stream.

IronPDF utiliza un <código>ChromePdfRenderer</códigocon RenderUrlAsPdf() en sólo tres líneas de código. Sin gestión de FileStream, sin llamadas a Close():IronPDFse encarga de la limpieza automáticamente. Consulte la documentación HTML a PDF para ver ejemplos completos.

Ejemplo 2: Creación de PDF a partir de texto

Antes (Syncfusion PDF):

// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.Pdf;
using Syncfusion.Pdf.Graphics;
using Syncfusion.Drawing;
using System.IO;

class Program
{
    static void Main()
    {
        // Create a new PDF document
        PdfDocument document = new PdfDocument();

        // Add a page
        PdfPage page = document.Pages.Add();

        // Create a font
        PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 12);

        // Draw text
        page.Graphics.DrawString("Hello, World!", font, PdfBrushes.Black, new PointF(10, 10));

        // Save the document
        FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
        document.Save(fileStream);
        document.Close(true);
        fileStream.Close();
    }
}
// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.Pdf;
using Syncfusion.Pdf.Graphics;
using Syncfusion.Drawing;
using System.IO;

class Program
{
    static void Main()
    {
        // Create a new PDF document
        PdfDocument document = new PdfDocument();

        // Add a page
        PdfPage page = document.Pages.Add();

        // Create a font
        PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 12);

        // Draw text
        page.Graphics.DrawString("Hello, World!", font, PdfBrushes.Black, new PointF(10, 10));

        // Save the document
        FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
        document.Save(fileStream);
        document.Close(true);
        fileStream.Close();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Después (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main()
    {
        // Create a PDF from HTML string
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello, World!</h1>");

        // Save the document
        pdf.SaveAs("Output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main()
    {
        // Create a PDF from HTML string
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello, World!</h1>");

        // Save the document
        pdf.SaveAs("Output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Syncfusion PDF utiliza un modelo gráfico basado en coordenadas. Se crea un PdfDocument, se añade una PdfPage, se crea una PdfFont con PdfFontFamily.Helvetica y, a continuación, se llama a page.Graphics.DrawString() con coordenadas explícitas (new PointF(10, 10)), fuente y pincel (PdfBrushes.Black). Por último, gestiona la creación y eliminación de FileStream.

IronPDF utiliza un enfoque basado en HTML/CSS. Instead of coordinates, you write <h1>Hello, World!</h1> and let CSS handle positioning, fonts, and colors. Este enfoque es más sencillo, más fácil de mantener y aprovecha los conocimientos que ya tienen los desarrolladores. Más información en nuestros tutoriales.

Ejemplo 3: Fusión de documentos PDF

Antes (Syncfusion PDF):

// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.Pdf;
using Syncfusion.Pdf.Parsing;
using System.IO;

class Program
{
    static void Main()
    {
        // Load the first PDF document
        FileStream stream1 = new FileStream("Document1.pdf", FileMode.Open, FileAccess.Read);
        PdfLoadedDocument loadedDocument1 = new PdfLoadedDocument(stream1);

        // Load the second PDF document
        FileStream stream2 = new FileStream("Document2.pdf", FileMode.Open, FileAccess.Read);
        PdfLoadedDocument loadedDocument2 = new PdfLoadedDocument(stream2);

        // Merge the documents
        PdfDocument finalDocument = new PdfDocument();
        finalDocument.ImportPageRange(loadedDocument1, 0, loadedDocument1.Pages.Count - 1);
        finalDocument.ImportPageRange(loadedDocument2, 0, loadedDocument2.Pages.Count - 1);

        // Save the merged document
        FileStream outputStream = new FileStream("Merged.pdf", FileMode.Create);
        finalDocument.Save(outputStream);

        // Close all documents
        finalDocument.Close(true);
        loadedDocument1.Close(true);
        loadedDocument2.Close(true);
        stream1.Close();
        stream2.Close();
        outputStream.Close();
    }
}
// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.Pdf;
using Syncfusion.Pdf.Parsing;
using System.IO;

class Program
{
    static void Main()
    {
        // Load the first PDF document
        FileStream stream1 = new FileStream("Document1.pdf", FileMode.Open, FileAccess.Read);
        PdfLoadedDocument loadedDocument1 = new PdfLoadedDocument(stream1);

        // Load the second PDF document
        FileStream stream2 = new FileStream("Document2.pdf", FileMode.Open, FileAccess.Read);
        PdfLoadedDocument loadedDocument2 = new PdfLoadedDocument(stream2);

        // Merge the documents
        PdfDocument finalDocument = new PdfDocument();
        finalDocument.ImportPageRange(loadedDocument1, 0, loadedDocument1.Pages.Count - 1);
        finalDocument.ImportPageRange(loadedDocument2, 0, loadedDocument2.Pages.Count - 1);

        // Save the merged document
        FileStream outputStream = new FileStream("Merged.pdf", FileMode.Create);
        finalDocument.Save(outputStream);

        // Close all documents
        finalDocument.Close(true);
        loadedDocument1.Close(true);
        loadedDocument2.Close(true);
        stream1.Close();
        stream2.Close();
        outputStream.Close();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Después (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // Load PDF documents
        var pdf1 = PdfDocument.FromFile("Document1.pdf");
        var pdf2 = PdfDocument.FromFile("Document2.pdf");

        // Merge PDFs
        var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });

        // Save the merged document
        merged.SaveAs("Merged.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // Load PDF documents
        var pdf1 = PdfDocument.FromFile("Document1.pdf");
        var pdf2 = PdfDocument.FromFile("Document2.pdf");

        // Merge PDFs
        var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });

        // Save the merged document
        merged.SaveAs("Merged.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

El contraste en la fusión de PDF es espectacular. Syncfusion PDFrequiere crear objetos FileStream para cada documento de entrada, cargarlos como PdfLoadedDocument, crear un nuevo PdfDocument, llamar a <código>ImportPageRange()</códigocon índices de inicio y fin para cada fuente, creando un FileStream de salida, y luego cerrando seis objetos separados (finalDocument, loadedDocument1, loadedDocument2, stream1, stream2, outputStream).

IronPDF utiliza <código>PdfDocument.FromFile()</códigopara cargar cada PDF y un método estático PdfDocument.Merge()que acepta una lista de documentos. Sin gestión de flujos, sin cálculos manuales de rango de páginas, sin aproximaciones.


Diferencias clave en la filosofía de las API

Basado en coordenadas frente a HTML/CSS primero

Syncfusion PDF utiliza un modelo gráfico basado en coordenadas heredado de las bibliotecas PDF tradicionales:

// Syncfusion: Manualpositioning
page.Graphics.DrawString("Text", font, PdfBrushes.Black, new PointF(100, 200));
page.Graphics.DrawRectangle(brush, new RectangleF(50, 50, 200, 100));
// Syncfusion: Manualpositioning
page.Graphics.DrawString("Text", font, PdfBrushes.Black, new PointF(100, 200));
page.Graphics.DrawRectangle(brush, new RectangleF(50, 50, 200, 100));
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF utiliza HTML/CSS para la maquetación:

// IronPDF: CSS-based positioning
var html = @"
<div style='margin: 50px; padding: 20px; border: 1px solid black;'>
    <p style='color: black;'>Text</p>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
// IronPDF: CSS-based positioning
var html = @"
<div style='margin: 50px; padding: 20px; border: 1px solid black;'>
    <p style='color: black;'>Text</p>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

El enfoque HTML/CSS es más intuitivo para los desarrolladores web, más fácil de mantener y produce resultados coherentes en diferentes tamaños de página.

Gestión de flujos frente a limpieza automática

Syncfusion PDF requiere un flujo explícito y la eliminación de documentos:

// Syncfusion: Manualcleanup
FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
document.Save(fileStream);
document.Close(true);
fileStream.Close();
// Syncfusion: Manualcleanup
FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
document.Save(fileStream);
document.Close(true);
fileStream.Close();
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF se encarga de la limpieza automáticamente:

// IronPDF: Automáticocleanup
pdf.SaveAs("Output.pdf");
// IronPDF: Automáticocleanup
pdf.SaveAs("Output.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Comparación de características

CaracterísticaSyncfusion PDFIronPDF
Compra de StaloneNo (sólo suite)
LicenciasComercial con restricciones comunitariasComercial simplificado
HTML a PDFRequiere BlinkBinariesCromo nativo
Soporte CSS3LimitadoCompleto (flexbox, grid)
Estilo APIGráficos basados en coordenadasHTML/CSS primero
Gestión de flujosManualAutomático
DependenciasMúltiples paquetesNuGet único
Complejidad de ImplementaciónPotencialmente complejoSencillo

Lista de comprobación de la migración

Pre-Migración

  • [ ] Inventario de todos los usos de Syncfusion PDFen codebase
  • [ ] Documentar los costes de licencia y los requisitos de implantación
  • [ ] Identificar los usos de PdfGrid, PdfGraphics y HtmlToPdfConverter
  • [ ] Obtenga la clave de licencia deIronPDFen ironpdf.com

Actualizaciones de código

  • [ ] Eliminar paquetes de Syncfusion (Syncfusion.Pdf.Net.Core, Syncfusion.HtmlToPdfConverter.Net.Windows, Syncfusion.Licensing)
  • [ ] Instalar IronPdf paquete NuGet
  • [ ] Actualizar las importaciones de espacios de nombres (using Syncfusion.Pdf;using IronPDF;)
  • [Reemplace Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense() por IronPDF.License.LicenseKey = "..."
  • [ ] Sustituya HtmlToPdfConverter.Convert() por ChromePdfRenderer.RenderUrlAsPdf() o RenderHtmlAsPdf()
  • [Reemplace Documento PDF+ Pages.Add() + Graphics.DrawString() por ChromePdfRenderer.RenderHtmlAsPdf()
  • [Reemplace <código>PdfLoadedDocument</códigopor PdfDocument.FromFile()
  • [ ] Sustituya <código>ImportPageRange()</códigopor PdfDocument.Merge()
  • [Reemplace <código>document.Save(stream)</códigopor pdf.SaveAs(path)
  • [ ] Elimine todas las llamadas a document.Close(true)y stream.Close()
  • [ ] Sustituir <código>PdfGrid</códigopor elementos HTML <table>
  • [ ] Sustituir <código>PdfStandardFont</códigopor CSS font-family
  • [ ] Sustituir PdfBrushes por propiedades CSS color

Pruebas

  • [ ] Comparación visual de la salida PDF
  • [ ] Verificar las mejoras de renderizado CSS (flexbox, grid ahora funcionan)
  • [ ] Prueba de extracción de texto
  • [ ] Fusión y división de pruebas
  • [Comparación de rendimiento

Conclusión

Elegir entre Syncfusion PDFFramework eIronPDFimplica comprender las necesidades del proyecto específico y el conjunto de herramientas más amplio que aporta cada biblioteca. Syncfusion ofrece una solución robusta y completa como parte de una suite más amplia, ideal para organizaciones que requieren algo más que funcionalidades PDF. Por otro lado,IronPDFofrece una opción centrada y fácil de integrar, perfecta para proyectos que dan prioridad a las integraciones directas de PDF sin necesidad de componentes adicionales.

Los cambios clave en esta migración son:

  1. Licencia: Solo paquete de Suite → Compra independiente
  2. Estilo API: Gráficos basados en coordenadas → HTML/CSS-first
  3. Conversión HTML: HtmlToPdfConverter.Convert()ChromePdfRenderer.RenderUrlAsPdf()
  4. Renderizado de texto: Graphics.DrawString() con fuentes/pinceles → Elementos HTML con CSS
  5. Cargar PDF: <código>PdfLoadedDocument</código+ FileStreamPdfDocument.FromFile()
  6. Fusionar PDF: <código>ImportPageRange()</códigocon índices de página manuales → PdfDocument.Merge()
  7. Guardar: <código>document.Save(stream)</código+ gestión de stream → pdf.SaveAs(path)
  8. Limpieza: Llamadas manuales Close() en documentos y flujos → Automático
  9. Tablas: <código>PdfGrid</códigocon manipulación de celdas → HTML <código></código>con CSS
  10. Fonts: PdfStandardFont(PdfFontFamily.Helvetica, 12) → CSS font-family: Helvetica; tamaño de fuente: 12pt;

En resumen, las empresas deben sopesar los costes, las condiciones de licencia y los requisitos específicos del proyecto para determinar qué biblioteca se ajusta mejor a sus objetivos. Para obtener tutoriales detallados e información útil sobre cómo trabajar con archivos PDF en C#, las empresas pueden aprovechar la orientación en línea de IronPDF.

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

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