Ir para o conteúdo do rodapé
GUIAS DE MIGRAçãO

Como migrar do pdforge para o IronPDF em C#

Por que migrar do pdforge para o IronPDF?

Entendendo o pdforge

O pdforge é uma API de geração de PDFs baseada na nuvem, que oferece uma maneira simples de produzir arquivos PDF integrando-se ao seu aplicativo por meio de chamadas de API. Ao delegar a tarefa de criação de PDFs a uma API externa, os desenvolvedores podem simplificar o processo de desenvolvimento. No entanto, o pdforge apresenta desvantagens como dependências externas, opções de personalização limitadas e custos contínuos de assinatura, que os desenvolvedores devem levar em consideração.

O problema de dependência da API na nuvem

O pdforge processa todos os documentos em servidores externos na nuvem. Essa arquitetura gera preocupações significativas para aplicações em produção:

  1. Processamento em servidor externo: Cada PDF gerado requer o envio do seu HTML/dados para os servidores da pdforge — seus documentos saem da sua infraestrutura.

  2. Riscos de privacidade e conformidade: Dados sensíveis trafegam pela internet para servidores de terceiros. Ao usar o pdforge, os desenvolvedores precisam levar em consideração as preocupações de segurança relacionadas aos dados enviados para uma API externa. Se o conteúdo do PDF incluir informações confidenciais, isso pode ser um fator crítico a ser considerado.

  3. Custos contínuos de assinatura: As taxas mensais acumulam-se indefinidamente sem aquisição de ativos. O modelo SaaS da pdforge introduz despesas operacionais contínuas que podem acumular-se ao longo do tempo.

  4. Dependência da Internet: Não há geração de PDF quando a rede não está disponível.

  5. Limites de taxa: os limites de uso da API podem restringir o desempenho de aplicativos de alto volume.

  6. Latência de rede: O tempo de ida e volta adiciona segundos a cada geração de PDF.

Comparação entre pdforge e IronPDF

Recurso pdforge IronPDF
Tipo de implantação API baseada em nuvem Biblioteca local
Dependências Requer internet e autenticação de API. Sem dependências externas
Personalização Controle limitado sobre a geração de PDFs Controle total sobre a personalização.
Estrutura de custos Assinatura contínua Opção de compra única
Segurança Possíveis problemas com dados enviados pela internet Mantém o processamento de dados inteiramente dentro do ambiente local.
Complexidade de configuração Configuração inicial mais fácil devido ao manuseio externo. Requer mais configuração inicial.

O IronPDF se diferencia por fornecer uma biblioteca totalmente local, concedendo aos desenvolvedores controle completo sobre o processo de criação de PDFs. Isso é particularmente vantajoso para aplicações onde o gerenciamento interno de arquivos é preferido, ou onde chamadas de API externas introduzem preocupações de segurança. O IronPDF processa tudo localmente, minimizando esses riscos.

Para equipes que planejam a adoção do .NET 10 e do C# 14 até 2025 e 2026, o IronPDF oferece uma base de processamento local que elimina a dependência da nuvem, ao mesmo tempo que adiciona recursos abrangentes de manipulação de PDFs.


Antes de começar

Pré-requisitos

  1. Ambiente .NET : .NET Framework 4.6.2+ ou .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Acesso ao NuGet : Capacidade de instalar pacotes NuGet.
  3. Licença do IronPDF : Obtenha sua chave de licença em IronPDF

Alterações no pacote NuGet

# Remove pdforge packages
dotnet remove package pdforge
dotnet remove package PdfForge

# Install IronPDF
dotnet add package IronPdf
# Remove pdforge packages
dotnet remove package pdforge
dotnet remove package PdfForge

# Install IronPDF
dotnet add package IronPdf
SHELL

Configuração de licença

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Identificar o uso do pdforge

# Find pdforge usage
grep -r "PdForge\|PdfClient\|HtmlToPdfRequest\|HtmlToPdfConverter" --include="*.cs" .

# Find placeholder patterns to migrate
grep -r "{totalPages}" --include="*.cs" .
# Find pdforge usage
grep -r "PdForge\|PdfClient\|HtmlToPdfRequest\|HtmlToPdfConverter" --include="*.cs" .

# Find placeholder patterns to migrate
grep -r "{totalPages}" --include="*.cs" .
SHELL

Referência completa da API

Alterações de namespace

// Before: pdforge
using PdfForge;
using System.IO;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: pdforge
using PdfForge;
using System.IO;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
' Before: pdforge
Imports PdfForge
Imports System.IO

' After: IronPDF
Imports IronPdf
Imports IronPdf.Rendering
$vbLabelText   $csharpLabel

Mapeamentos de Classes Principais

pdforge IronPDF
HtmlToPdfConverter ChromePdfRenderer
PdfClient ChromePdfRenderer
PageSize.A4 PdfPaperSize.A4
PageOrientation.Landscape PdfPaperOrientation.Landscape
Tipo de retorno: byte[] PdfDocument

Mapeamentos de Métodos

pdforge IronPDF
converter.ConvertHtmlString(html) renderer.RenderHtmlAsPdf(html)
converter.ConvertUrl(url) renderer.RenderUrlAsPdf(url)
File.WriteAllBytes(path, bytes) pdf.SaveAs(path)
Tipo de retorno: byte[] pdf.BinaryData

Mapeamentos de Configuração

pdforge IronPDF (Opções de renderização)
converter.PageSize = PageSize.A4 renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
converter.Orientation = PageOrientation.Landscape renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
Footer = "Page {page} of {totalPages}" TextFooter = new TextHeaderFooter { CenterText = "Page {page} of {total-pages}" }

Novos recursos não disponíveis no pdforge

Recurso IronPDF Descrição
PdfDocument.Merge() Combinar vários PDFs
pdf.ExtractAllText() Extrair texto de PDFs
pdf.ApplyWatermark() Adicionar marcas d'água
pdf.SecuritySettings Proteção por senha
pdf.Form Preenchimento de formulário
pdf.SignWithDigitalSignature() Assinaturas digitais

Exemplos de migração de código

Exemplo 1: Conversão de string HTML para PDF

Antes (pdforge):

// NuGet: Install-Package PdfForge
using PdfForge;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = converter.ConvertHtmlString(html);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
// NuGet: Install-Package PdfForge
using PdfForge;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = converter.ConvertHtmlString(html);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
Imports PdfForge
Imports System.IO

Class Program
    Shared Sub Main()
        Dim converter = New HtmlToPdfConverter()
        Dim html = "<html><body><h1>Hello World</h1></body></html>"
        Dim pdf = converter.ConvertHtmlString(html)
        File.WriteAllBytes("output.pdf", pdf)
    End Sub
End Class
$vbLabelText   $csharpLabel

Após (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim html = "<html><body><h1>Hello World</h1></body></html>"
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

A diferença fundamental aqui reside no modelo de processamento e no tipo de retorno. O pdforge usa HtmlToPdfConverter com ConvertHtmlString() que retorna um array byte[]—você deve então usar File.WriteAllBytes() para salvar o resultado.

IronPDF usa ChromePdfRenderer com RenderHtmlAsPdf() que retorna um objeto PdfDocument. Este objeto pode ser salvo diretamente com SaveAs(), ou você pode acessar pdf.BinaryData se precisar dos bytes brutos. O PdfDocument também permite manipulação (adicionar marcas d'água, mesclar com outros PDFs, adicionar segurança) antes de salvar. Consulte a documentação de conversão de HTML para PDF para obter exemplos completos.

Exemplo 2: Conversão de URL para PDF

Antes (pdforge):

// NuGet: Install-Package PdfForge
using PdfForge;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var pdf = converter.ConvertUrl("https://example.com");
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
// NuGet: Install-Package PdfForge
using PdfForge;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var pdf = converter.ConvertUrl("https://example.com");
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
Imports PdfForge
Imports System.IO

Class Program
    Shared Sub Main()
        Dim converter = New HtmlToPdfConverter()
        Dim pdf = converter.ConvertUrl("https://example.com")
        File.WriteAllBytes("webpage.pdf", pdf)
    End Sub
End Class
$vbLabelText   $csharpLabel

Após (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
        pdf.SaveAs("webpage.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

O pdforge usa ConvertUrl() na classe HtmlToPdfConverter, retornando bytes que você escreve com File.WriteAllBytes(). IronPDF usa RenderUrlAsPdf() em ChromePdfRenderer, retornando um PdfDocument com o método embutido SaveAs().

A principal vantagem do IronPDF é que a URL é obtida e renderizada localmente usando um mecanismo Chromium — nenhum dado é enviado para servidores externos. O IronPDF, por ser uma biblioteca local, pode oferecer melhor desempenho, pois não há tempo de ida e volta envolvido em solicitações da web. Saiba mais sobre a conversão de URL para PDF .

Exemplo 3: Converter arquivo HTML para PDF com configurações personalizadas

Antes (pdforge):

// NuGet: Install-Package PdfForge
using PdfForge;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        converter.PageSize = PageSize.A4;
        converter.Orientation = PageOrientation.Landscape;
        var htmlContent = File.ReadAllText("input.html");
        var pdf = converter.ConvertHtmlString(htmlContent);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
// NuGet: Install-Package PdfForge
using PdfForge;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        converter.PageSize = PageSize.A4;
        converter.Orientation = PageOrientation.Landscape;
        var htmlContent = File.ReadAllText("input.html");
        var pdf = converter.ConvertHtmlString(htmlContent);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
Imports PdfForge
Imports System.IO

Class Program
    Shared Sub Main()
        Dim converter As New HtmlToPdfConverter()
        converter.PageSize = PageSize.A4
        converter.Orientation = PageOrientation.Landscape
        Dim htmlContent As String = File.ReadAllText("input.html")
        Dim pdf As Byte() = converter.ConvertHtmlString(htmlContent)
        File.WriteAllBytes("output.pdf", pdf)
    End Sub
End Class
$vbLabelText   $csharpLabel

Após (IronPDF):

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        var htmlContent = System.IO.File.ReadAllText("input.html");
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        var htmlContent = System.IO.File.ReadAllText("input.html");
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
        Dim htmlContent = System.IO.File.ReadAllText("input.html")
        Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Este exemplo mostra a diferença no padrão de configuração. O pdforge define propriedades diretamente no objeto conversor (converter.PageSize = PageSize.A4, converter.Orientation = PageOrientation.Landscape).

IronPDF usa a propriedade RenderingOptions com enums fortemente tipados: renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 e renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape. Isso proporciona suporte ao IntelliSense e segurança de tipos em tempo de compilação. Observe que o IronPDF requer a importação do namespace IronPdf.Rendering para as enumerações de tamanho e orientação do papel. Consulte os tutoriais para obter mais exemplos de configuração.


Notas críticas sobre migração

Alteração do tipo de retorno

O pdforge retorna byte[]; IronPDF retorna PdfDocument:

// pdforge: Returns byte[]
byte[] pdfBytes = converter.ConvertHtmlString(html);
File.WriteAllBytes("output.pdf", pdfBytes);

// IronPDF: Returns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");           // Direct save
byte[] bytes = pdf.BinaryData;      // Get bytes if needed
// pdforge: Returns byte[]
byte[] pdfBytes = converter.ConvertHtmlString(html);
File.WriteAllBytes("output.pdf", pdfBytes);

// IronPDF: Returns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");           // Direct save
byte[] bytes = pdf.BinaryData;      // Get bytes if needed
' pdforge: Returns byte()
Dim pdfBytes As Byte() = converter.ConvertHtmlString(html)
File.WriteAllBytes("output.pdf", pdfBytes)

' IronPDF: Returns PdfDocument
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")           ' Direct save
Dim bytes As Byte() = pdf.BinaryData ' Get bytes if needed
$vbLabelText   $csharpLabel

Alteração da classe do conversor

// pdforge: HtmlToPdfConverter
var converter = new HtmlToPdfConverter();

// IronPDF: ChromePdfRenderer
var renderer = new ChromePdfRenderer();
// pdforge: HtmlToPdfConverter
var converter = new HtmlToPdfConverter();

// IronPDF: ChromePdfRenderer
var renderer = new ChromePdfRenderer();
' pdforge: HtmlToPdfConverter
Dim converter As New HtmlToPdfConverter()

' IronPDF: ChromePdfRenderer
Dim renderer As New ChromePdfRenderer()
$vbLabelText   $csharpLabel

Alterações no nome do método

// pdforge methods
converter.ConvertHtmlString(html)
converter.ConvertUrl(url)

// IronPDF methods
renderer.RenderHtmlAsPdf(html)
renderer.RenderUrlAsPdf(url)
// pdforge methods
converter.ConvertHtmlString(html)
converter.ConvertUrl(url)

// IronPDF methods
renderer.RenderHtmlAsPdf(html)
renderer.RenderUrlAsPdf(url)
$vbLabelText   $csharpLabel

Salvar alteração de método

// pdforge: Manual file write
File.WriteAllBytes("output.pdf", pdfBytes);

// IronPDF: Built-in save method
pdf.SaveAs("output.pdf");
// pdforge: Manual file write
File.WriteAllBytes("output.pdf", pdfBytes);

// IronPDF: Built-in save method
pdf.SaveAs("output.pdf");
' pdforge: Manual file write
File.WriteAllBytes("output.pdf", pdfBytes)

' IronPDF: Built-in save method
pdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

Alteração do local de configuração

O pdforge utiliza propriedades no conversor; IronPDF usa RenderingOptions:

// pdforge: Properties on converter
converter.PageSize = PageSize.A4;
converter.Orientation = PageOrientation.Landscape;

// IronPDF: Properties on RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
// pdforge: Properties on converter
converter.PageSize = PageSize.A4;
converter.Orientation = PageOrientation.Landscape;

// IronPDF: Properties on RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
' pdforge: Properties on converter
converter.PageSize = PageSize.A4
converter.Orientation = PageOrientation.Landscape

' IronPDF: Properties on RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
$vbLabelText   $csharpLabel

Sintaxe de espaço reservado para cabeçalho/rodapé

Se você usar números de página em cabeçalhos ou rodapés, a sintaxe do marcador de posição será diferente:

// pdforge placeholders
"Page {page} of {totalPages}"

// IronPDF placeholders
"Page {page} of {total-pages}"  // Note: hyphen in total-pages
// pdforge placeholders
"Page {page} of {totalPages}"

// IronPDF placeholders
"Page {page} of {total-pages}"  // Note: hyphen in total-pages
$vbLabelText   $csharpLabel

Novas funcionalidades após a migração

Após migrar para o IronPDF, você obtém recursos que o pdforge não pode oferecer:

Fusão de PDFs

var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
$vbLabelText   $csharpLabel

Extração de texto

var pdf = PdfDocument.FromFile("document.pdf");
string allText = pdf.ExtractAllText();
var pdf = PdfDocument.FromFile("document.pdf");
string allText = pdf.ExtractAllText();
Dim pdf = PdfDocument.FromFile("document.pdf")
Dim allText As String = pdf.ExtractAllText()
$vbLabelText   $csharpLabel

Marcas d'água

pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>")
$vbLabelText   $csharpLabel

Proteção por senha

pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword"
pdf.SecuritySettings.OwnerPassword = "ownerpassword"
$vbLabelText   $csharpLabel

Resumo da comparação de recursos

Recurso pdforge IronPDF
HTML para PDF
URL para PDF
Configurações da página
Compatível com modo offline
Processamento local
Mesclar PDFs
Dividir PDFs
Texto extraído
Marcas d'água
Preenchimento de formulários
Assinaturas digitais
Proteção por senha
Sem limites de taxa
Licença de uso único

Lista de verificação para migração

Pré-migração

  • Inventariar todas as chamadas da API do pdforge no código-fonte.
  • Documentar as opções de configuração atuais utilizadas (tamanho da página, orientação)
  • Identificar os espaços reservados de cabeçalho/rodapé a serem atualizados ({totalPages}{total-pages})
  • Planeje o armazenamento da chave de licença do IronPDF (variáveis ​​de ambiente recomendadas)
  • Teste primeiro com a licença de avaliação do IronPDF

Alterações no pacote

  • Remover o pacote NuGet pdforge
  • Remover o pacote NuGet PdfForge
  • Instale o pacote NuGet IronPdf: dotnet add package IronPdf

Alterações no código

  • Atualizar todas as importações de namespace (using PdfForge;using IronPdf;)
  • Adicione using IronPdf.Rendering; para enumerações de tamanho e orientação do papel
  • Substitua HtmlToPdfConverter por ChromePdfRenderer
  • Substitua ConvertHtmlString() por RenderHtmlAsPdf()
  • Substitua ConvertUrl() por RenderUrlAsPdf()
  • Substitua File.WriteAllBytes() por pdf.SaveAs()
  • Mover a propriedade PageSize para RenderingOptions.PaperSize
  • Mover a propriedade Orientation para RenderingOptions.PaperOrientation
  • Atualizar nomes de enumeração (PageSize.A4PdfPaperSize.A4)
  • Atualizar nomes de enumeração (PageOrientation.LandscapePdfPaperOrientation.Landscape)
  • Atualizar a sintaxe dos espaços reservados em cabeçalhos/rodapés

Pós-migração

  • A qualidade de saída do PDF de teste corresponde às expectativas.
  • Verificar se a operação offline funciona
  • Remover credenciais da API da configuração
  • Adicionar novas funcionalidades (fusão, marcas d'água, segurança) conforme necessário.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Equipe de suporte de ferro

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim