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

Cómo migrar de Gnostice PDFOne a IronPDF en C#

La migración de Gnostice PDFOneaIronPDFtransforma su flujo de trabajo PDF .NET de un enfoque basado en coordenadas y fragmentado por plataformas a una solución unificada basada en HTML/CSS con compatibilidad total con los estándares web modernos. Esta guía proporciona una ruta de migración completa y paso a paso que elimina las limitaciones documentadas en torno a CSS, JavaScript y la estabilidad de la memoria para desarrolladores profesionales de .NET.

Por qué migrar de Gnostice PDFOnea IronPDF

Desafíos de Gnostice PDFOne

Gnostice PDFOne y Document Studio .NET tienen limitaciones bien documentadas que afectan a las aplicaciones de producción:

  1. Sin compatibilidad con CSS externo: la documentación de Gnostice PDFOneindica explícitamente que no admite hojas de estilo CSS externas, un requisito fundamental para la conversión web a PDF moderna.

  2. No se puede ejecutar JavaScript: el contenido dinámico que requiere JavaScript no se puede representar, lo que hace imposible convertir aplicaciones web modernas con precisión.

  3. No hay conversión directa de HTML a PDF: Gnostice PDFOneno tiene conversión directa de HTML a PDF. Es necesario utilizar Document Studio para la conversión a HTML o analizar y renderizar manualmente los elementos HTML, lo que supone una importante sobrecarga de desarrollo.

  4. Fragmentación de la plataforma: Productos independientes para WinForms, WPF, ASP.NET y Xamarin, cada uno con diferentes conjuntos de características y API. Es posible que necesite varias licencias y bases de código.

  5. Fugas de memoria y estabilidad: los foros de usuarios y Stack Overflow informan fugas de memoria persistentes, error JPEG n.° 53 y excepciones de StackOverflow al procesar imágenes.

  6. No hay Unicode de derecha a izquierda: el árabe, el hebreo y otros idiomas RTL no están soportados explícitamente, lo que supone un factor decisivo para las aplicaciones internacionales.

  7. Soporte limitado para firmas digitales: históricamente, las firmas digitales han estado ausentes o no han sido confiables en Gnostice PDFOne.

  8. API basada en coordenadas: muchas operaciones requieren posicionamiento manual X/Y en lugar de enfoques de diseño modernos, lo que requiere cálculos precisos para la ubicación de cada elemento.

Comparación entre Gnostice PDFOnee IronPDF

AspectoGnostice PDFOneIronPDF
CSS externoNo soportadoSoporte completo
Ejecución de JavaScriptNo soportadoMotor Chromium completo
Idiomas RTLNo soportadoCompatibilidad total con Unicode
Firmas digitalesLimitado/FaltaCompatibilidad total con X509
PlataformaProductos fragmentadosUna sola biblioteca unificada
Estabilidad de la memoriaProblemas comunicadosEstable y bien gestionado
HTML a PDFBásico, requiere solucionesRenderizado de calidad Chrome
Curva de aprendizajeAPI complejasAPI sencilla e intuitiva
CSS moderno (Flexbox, Grid)No soportadoCompatibilidad total con CSS3
Tratamiento de imágenesProblemas conocidosFiable

Para los equipos que planifican la adopción de .NET 10 y C# 14 hasta 2025 y 2026,IronPDFproporciona una base preparada para el futuro con una biblioteca unificada que funciona de forma coherente en todas las plataformas .NET.


Evaluación de la complejidad de la migración

Esfuerzo estimado por función

CaracterísticaComplejidad de la migraciónNotas
Cargar/guardar PDFMuy bajoMapeo directo
Fusionar PDFMuy bajoMapeo directo
Dividir PDFBajoEnfoque similar
Extracción de TextoBajoCambio de nombre del método
Marcas de aguaBajoMás sencillo con IronPDF
Encabezados/pies de páginaBajoEnfoque basado en HTML
HTML a PDFBajoMejor con IronPDF
CifradoMedioDiferentes estructuras de API
Campos de formularioMedioDiferencias en el acceso a las propiedades
Firmas digitalesBajoAhora compatible (no era fiable en Gnostice PDFOne)

Características que se obtienen

Al migrar de Gnostice PDFOnea IronPDF, estas funciones antes imposibles pasan a estar disponibles:

  • Hojas de estilo CSS externas
  • Ejecución de JavaScript
  • Compatibilidad con idiomas RTL (árabe, hebreo)
  • CSS Grid y Flexbox
  • Firmas digitales fiables
  • Mejor gestión de la memoria
  • Compatibilidad multiplataforma con una única base de código

Antes de empezar

Prerrequisitos

  1. Versión .NET:IronPDFes compatible con .NET Framework 4.6.2+ y .NET Core 2.0+ / .NET 5/6/7/8/9+
  2. Clave de licencia: Obtenga su clave de licencia deIronPDFen ironpdf.com
  3. Copia de seguridad: crear una rama para el trabajo de migración

Identifique todo el uso de Gnostice PDFOne

# Find all Gnostice references
grep -r "Gnostice\|PDFOne\|PDFDocument\|PDFPage\|DocExporter" --include="*.cs" .

# Find package references
grep -r "Gnostice\|PDFOne" --include="*.csproj" .
# Find all Gnostice references
grep -r "Gnostice\|PDFOne\|PDFDocument\|PDFPage\|DocExporter" --include="*.cs" .

# Find package references
grep -r "Gnostice\|PDFOne" --include="*.csproj" .
SHELL

Cambios en el paquete NuGet

# Remove Gnostice PDFOnepackages
dotnet remove package PDFOne.NET
dotnet remove package Gnostice.DocumentStudio.NET
dotnet remove package Gnostice.PDFOne.NET
dotnet remove package Gnostice.XtremeDocumentStudio.NET

# Install IronPDF
dotnet add package IronPdf
# Remove Gnostice PDFOnepackages
dotnet remove package PDFOne.NET
dotnet remove package Gnostice.DocumentStudio.NET
dotnet remove package Gnostice.PDFOne.NET
dotnet remove package Gnostice.XtremeDocumentStudio.NET

# Install IronPDF
dotnet add package IronPdf
SHELL

Inicio rápido de la migración

Paso 1: Actualizar la configuración de la licencia

Antes (Gnostice PDFOne):

// Gnostice license often set via config or property
PDFOne.License.LicenseKey = "YOUR-GNOSTICE-LICENSE";
// Gnostice license often set via config or property
PDFOne.License.LicenseKey = "YOUR-GNOSTICE-LICENSE";
$vbLabelText   $csharpLabel

Después (IronPDF):

// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";

// Or in appsettings.json:
// { "IronPdf.License.LicenseKey": "YOUR-LICENSE-KEY" }
// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";

// Or in appsettings.json:
// { "IronPdf.License.LicenseKey": "YOUR-LICENSE-KEY" }
$vbLabelText   $csharpLabel

Paso 2: Actualizar las importaciones de espacios de nombres

// Before (Gnostice PDFOne)
using Gnostice.PDFOne;
using Gnostice.PDFOne.Document;
using Gnostice.PDFOne.Graphics;

// After (IronPDF)
using IronPdf;
using IronPdf.Editing;
// Before (Gnostice PDFOne)
using Gnostice.PDFOne;
using Gnostice.PDFOne.Document;
using Gnostice.PDFOne.Graphics;

// After (IronPDF)
using IronPdf;
using IronPdf.Editing;
$vbLabelText   $csharpLabel

Referencia completa de la API

Mapeo de clases principales

Gnostice PDFOneIronPDFDescripción
Documento PDFDocumento PDFClase de documento PDF principal
Página PDF<código>PdfDocument.Pages[i]</código>Representación de la página
<código>PDFFont</códigoEstilo CSSEspecificación tipográfica
<código>PDFTextElement</códigoContenido HTMLContenido del texto
<código>PDFImageElement</códigoEtiquetas HTML <img>Contenido de la imagen
<código>DocExporter</código<código>ChromePdfRenderer</códigoConversión de HTML/URL a PDF

Operaciones de documentos

Gnostice PDFOneIronPDFNotas
<código>nuevo PDFDocument()</códigonuevo PdfDocument()Crear nuevo documento
doc.Load(ruta)<código>PdfDocument.FromFile(path)</códigoCargar desde archivo
doc.Open()N/A (automático)Abrir documento
doc.Guardar(ruta)<código>pdf.SaveAs(ruta)</códigoGuardar en archivo
doc.Close()<código>pdf.Dispose()</códigoRecursos de publicación
doc.Pages.Count<código>pdf.PageCount</códigoNúmero de páginas
doc.Pages.Add()Renderizar HTML o fusionarAñadir página

Operaciones de fusión

Gnostice PDFOneIronPDFNotas
doc.Append(otroDoc)PdfDocument.Merge(pdf1, pdf2)Fusionar documentos
Múltiples llamadas a Append()<código>PdfDocument.Merge(list)</códigoCombinar muchos

Ejemplos de migración de código

Ejemplo 1: Conversión de HTML a PDF

Antes (Gnostice PDFOne):

// NuGet: Install-Package Gnostice.PDFOne.DLL
using Gnostice.PDFOne;
using Gnostice.PDFOne.Graphics;
using System;

class Program
{
    static void Main()
    {
        PDFDocument doc = new PDFDocument();
        doc.Open();

        PDFPage page = doc.Pages.Add();

        // PDFOne doesn't have direct HTML a PDFconversion
        // You need to use Document Studio for HTML conversion
        // Or manually parse and render HTML elements

        PDFTextElement textElement = new PDFTextElement();
        textElement.Text = "Simple text conversion instead of HTML";
        textElement.Draw(page, 10, 10);

        doc.Save("output.pdf");
        doc.Close();
    }
}
// NuGet: Install-Package Gnostice.PDFOne.DLL
using Gnostice.PDFOne;
using Gnostice.PDFOne.Graphics;
using System;

class Program
{
    static void Main()
    {
        PDFDocument doc = new PDFDocument();
        doc.Open();

        PDFPage page = doc.Pages.Add();

        // PDFOne doesn't have direct HTML a PDFconversion
        // You need to use Document Studio for HTML conversion
        // Or manually parse and render HTML elements

        PDFTextElement textElement = new PDFTextElement();
        textElement.Text = "Simple text conversion instead of HTML";
        textElement.Draw(page, 10, 10);

        doc.Save("output.pdf");
        doc.Close();
    }
}
$vbLabelText   $csharpLabel

Después (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string html = "<h1>Hello World</h1><p>This is HTML content.</p>";

        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string html = "<h1>Hello World</h1><p>This is HTML content.</p>";

        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
$vbLabelText   $csharpLabel

La diferencia es sustancial: Gnostice PDFOneno puede convertir directamente HTML a PDF: hay que crear manualmente elementos de texto y posicionarlos con coordenadas. El <código>ChromePdfRenderer</códigodeIronPDFproporciona renderizado HTML directo con soporte completo de CSS3 y JavaScript. Consulte la documentación HTML a PDF para obtener más opciones de conversión.

Ejemplo 2: Combinar archivos PDF

Antes (Gnostice PDFOne):

// NuGet: Install-Package Gnostice.PDFOne.DLL
using Gnostice.PDFOne;
using Gnostice.PDFOne.Document;
using System;

class Program
{
    static void Main()
    {
        PDFDocument doc1 = new PDFDocument();
        doc1.Load("document1.pdf");

        PDFDocument doc2 = new PDFDocument();
        doc2.Load("document2.pdf");

        PDFDocument mergedDoc = new PDFDocument();
        mergedDoc.Open();

        mergedDoc.Append(doc1);
        mergedDoc.Append(doc2);

        mergedDoc.Save("merged.pdf");

        doc1.Close();
        doc2.Close();
        mergedDoc.Close();
    }
}
// NuGet: Install-Package Gnostice.PDFOne.DLL
using Gnostice.PDFOne;
using Gnostice.PDFOne.Document;
using System;

class Program
{
    static void Main()
    {
        PDFDocument doc1 = new PDFDocument();
        doc1.Load("document1.pdf");

        PDFDocument doc2 = new PDFDocument();
        doc2.Load("document2.pdf");

        PDFDocument mergedDoc = new PDFDocument();
        mergedDoc.Open();

        mergedDoc.Append(doc1);
        mergedDoc.Append(doc2);

        mergedDoc.Save("merged.pdf");

        doc1.Close();
        doc2.Close();
        mergedDoc.Close();
    }
}
$vbLabelText   $csharpLabel

Después (IronPDF):

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

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;
using System.Collections.Generic;

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");
    }
}
$vbLabelText   $csharpLabel

El método PDFOne de Gnostice requiere crear un nuevo documento, abrirlo, cargar los documentos fuente por separado, anexar cada uno de ellos y cerrar manualmente los tres documentos. El método estático Merge deIronPDFse encarga de esto en tres líneas con una gestión adecuada de los recursos. Más información sobre mezclar y dividir archivos PDF.

Ejemplo 3: Añadir una marca de agua a un PDF

Antes (Gnostice PDFOne):

// NuGet: Install-Package Gnostice.PDFOne.DLL
using Gnostice.PDFOne;
using Gnostice.PDFOne.Graphics;
using System;
using System.Drawing;

class Program
{
    static void Main()
    {
        PDFDocument doc = new PDFDocument();
        doc.Load("input.pdf");

        PDFFont font = new PDFFont(PDFStandardFont.Helvetica, 48);

        foreach (PDFPage page in doc.Pages)
        {
            PDFTextElement watermark = new PDFTextElement();
            watermark.Text = "CONFIDENTIAL";
            watermark.Font = font;
            watermark.Color = Color.FromArgb(128, 255, 0, 0);
            watermark.RotationAngle = 45;

            watermark.Draw(page, 200, 400);
        }

        doc.Save("watermarked.pdf");
        doc.Close();
    }
}
// NuGet: Install-Package Gnostice.PDFOne.DLL
using Gnostice.PDFOne;
using Gnostice.PDFOne.Graphics;
using System;
using System.Drawing;

class Program
{
    static void Main()
    {
        PDFDocument doc = new PDFDocument();
        doc.Load("input.pdf");

        PDFFont font = new PDFFont(PDFStandardFont.Helvetica, 48);

        foreach (PDFPage page in doc.Pages)
        {
            PDFTextElement watermark = new PDFTextElement();
            watermark.Text = "CONFIDENTIAL";
            watermark.Font = font;
            watermark.Color = Color.FromArgb(128, 255, 0, 0);
            watermark.RotationAngle = 45;

            watermark.Draw(page, 200, 400);
        }

        doc.Save("watermarked.pdf");
        doc.Close();
    }
}
$vbLabelText   $csharpLabel

Después (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");

        var watermark = new TextStamper()
        {
            Text = "CONFIDENTIAL",
            FontSize = 48,
            Opacity = 50,
            Rotation = 45,
            VerticalAlignment = VerticalAlignment.Middle,
            HorizontalAlignment = HorizontalAlignment.Center
        };

        pdf.ApplyStamp(watermark);
        pdf.SaveAs("watermarked.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");

        var watermark = new TextStamper()
        {
            Text = "CONFIDENTIAL",
            FontSize = 48,
            Opacity = 50,
            Rotation = 45,
            VerticalAlignment = VerticalAlignment.Middle,
            HorizontalAlignment = HorizontalAlignment.Center
        };

        pdf.ApplyStamp(watermark);
        pdf.SaveAs("watermarked.pdf");
    }
}
$vbLabelText   $csharpLabel

El enfoque de Gnostice PDFOnerequiere crear objetos PDFFont, recorrer manualmente las páginas, calcular las coordenadas (200, 400) y establecer propiedades en objetos PDFTextElement. El TextStamper deIronPDFproporciona una configuración declarativa con centrado automático y aplicación de páginas, sin necesidad de cálculos de coordenadas. Consulte la documentación de marca de agua para obtener opciones adicionales.


Notas de migración críticas

Diseño basado en coordenadas a HTML/CSS

El cambio de paradigma más significativo en esta migración de Gnostice PDFOnees pasar del posicionamiento basado en coordenadas al diseño HTML/CSS:

// Gnostice PDFOne: Manual coordinate positioning
watermark.Draw(page, 200, 400);  // X=200, Y=400

// IronPDF: Declarative alignment
watermark.VerticalAlignment = VerticalAlignment.Middle;
watermark.HorizontalAlignment = HorizontalAlignment.Center;
// Gnostice PDFOne: Manual coordinate positioning
watermark.Draw(page, 200, 400);  // X=200, Y=400

// IronPDF: Declarative alignment
watermark.VerticalAlignment = VerticalAlignment.Middle;
watermark.HorizontalAlignment = HorizontalAlignment.Center;
$vbLabelText   $csharpLabel

Objetos de fuente a estilos CSS

// Gnostice PDFOne
PDFFont font = new PDFFont(PDFStandardFont.Helvetica, 48);
watermark.Font = font;

//IronPDF- use CSS in HTML content
var html = "<span style='font-family: Helvetica, Arial, sans-serif; font-size: 48pt;'>Text</span>";
// Gnostice PDFOne
PDFFont font = new PDFFont(PDFStandardFont.Helvetica, 48);
watermark.Font = font;

//IronPDF- use CSS in HTML content
var html = "<span style='font-family: Helvetica, Arial, sans-serif; font-size: 48pt;'>Text</span>";
$vbLabelText   $csharpLabel

Indexación de páginas

Gnostice PDFOne suele utilizar páginas con 1 índice, mientras queIronPDFutiliza páginas con 0 índices (convención estándar de .NET):

// Gnostice PDFOne: May use 1-indexed
var page = doc.Pages[1];  // First page

// IronPDF: 0-indexed
var page = pdf.Pages[0];  // First page
// Gnostice PDFOne: May use 1-indexed
var page = doc.Pages[1];  // First page

// IronPDF: 0-indexed
var page = pdf.Pages[0];  // First page
$vbLabelText   $csharpLabel

Características que ahora funcionan

Tras migrar de Gnostice PDFOnea IronPDF, estas funciones antes problemáticas o imposibles estarán disponibles:

  • CSS externo: Las hojas de estilo que no funcionaban en Gnostice PDFOneahora se representan correctamente
  • Contenido de JavaScript: ahora aparece el contenido dinámico que faltaba
  • Idiomas RTL: el árabe, el hebreo y otros idiomas de derecha a izquierda funcionan correctamente
  • CSS Grid y Flexbox: Las técnicas de diseño modernas son totalmente compatibles
  • Firmas digitales: Firma confiable de certificados X509

Solución de problemas

Asunto 1: PDFTextElement no encontrado

Problema: <código>PDFTextElement</códigono existe en IronPDF.

Solución: utilice contenido HTML o TextStamper:

// For new documents - render HTML
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<p>Your text here</p>");

// For existing documents - use stampers
var stamper = new TextStamper() { Text = "Added Text" };
pdf.ApplyStamp(stamper);
// For new documents - render HTML
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<p>Your text here</p>");

// For existing documents - use stampers
var stamper = new TextStamper() { Text = "Added Text" };
pdf.ApplyStamp(stamper);
$vbLabelText   $csharpLabel

Número 2: Objetos PDFFont

Problema: Gnostice PDFOneutiliza objetos <código>PDFFont</código;IronPDFutiliza CSS.

Solución:

// Gnostice PDFOne
PDFFont font = new PDFFont(PDFStandardFont.Helvetica, 12);

//IronPDF- use CSS
var html = "<span style='font-family: Helvetica, Arial, sans-serif; font-size: 12pt;'>Text</span>";
// Gnostice PDFOne
PDFFont font = new PDFFont(PDFStandardFont.Helvetica, 12);

//IronPDF- use CSS
var html = "<span style='font-family: Helvetica, Arial, sans-serif; font-size: 12pt;'>Text</span>";
$vbLabelText   $csharpLabel

Edición 3: DocExporter no encontrado

Problema: la clase <código>DocExporter</códigono existe en IronPDF.

Solución: utilice <código>ChromePdfRenderer</código:

// Gnostice PDFOne
DocExporter exporter = new DocExporter();
exporter.Export(doc, "output.pdf", DocumentFormat.PDF);

// IronPDF
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlFileAsPdf("input.html");
pdf.SaveAs("output.pdf");
// Gnostice PDFOne
DocExporter exporter = new DocExporter();
exporter.Export(doc, "output.pdf", DocumentFormat.PDF);

// IronPDF
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlFileAsPdf("input.html");
pdf.SaveAs("output.pdf");
$vbLabelText   $csharpLabel

Número 4: Mejoras de memoria

Problema: Gnostice PDFOnehabía informado fugas de memoria.

Solución:IronPDFproporciona una gestión de memoria estable. Utilice patrones de eliminación adecuados:

using (var pdf = PdfDocument.FromFile("large.pdf"))
{
    // Process PDF
    pdf.SaveAs("output.pdf");
}  // Automatically disposed
using (var pdf = PdfDocument.FromFile("large.pdf"))
{
    // Process PDF
    pdf.SaveAs("output.pdf");
}  // Automatically disposed
$vbLabelText   $csharpLabel

Lista de comprobación de la migración

Pre-Migración

  • Inventario de todos los usos de Gnostice PDFOneen el código base
  • Tenga en cuenta las características que no funcionaban (CSS, JS, RTL): ¡ahora funcionarán!
  • Documentar problemas de memoria para realizar pruebas de comparación
  • Obtener la clave de licencia de IronPDF
  • Crear rama de migración en el control de versiones

Migración de código

  • Eliminar paquetes NuGet de Gnostice PDFOne
  • Instalar el paquete NuGet IronPdf: dotnet add package IronPdf
  • Actualizar las importaciones de espacios de nombres
  • Reemplazar la configuración de la clave de licencia
  • Convertir Documento PDFa PdfDocument
  • Convertir <código>DocExporter</códigoa ChromePdfRenderer
  • Reemplazar el dibujo basado en coordenadas con estampado HTML
  • Actualizar <código>PDFFont</códigoal estilo CSS
  • Convertir doc.Append() a PdfDocument.Merge()

Pruebas

  • Prueba de conversión de HTML a PDF
  • Verificar que el CSS externo ahora funciona
  • Probar contenido dependiente de JavaScript
  • Probar idiomas RTL (si es necesario)
  • Prueba firmas digitales (¡ahora disponibles!)
  • Prueba de fusión de PDF
  • Prueba de marca de agua
  • Comparar el uso de la memoria

Posmigración

  • Eliminar la licencia de Gnostic PDFOne
  • Actualización de la documentación
  • Eliminar soluciones alternativas para las limitaciones de Gnostice PDFOne
  • Capacitar al equipo sobre la API de IronPDF

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