Como migrar do XFINIUM.PDF para o IronPDF em C#
XFINIUM.PDF é uma biblioteca PDF multiplataforma que oferece ferramentas abrangentes para criar e editar PDFs programaticamente em C#. Embora ofereça duas edições — Generator e Viewer — a dependência da biblioteca em programação gráfica baseada em coordenadas cria desafios significativos para equipes de desenvolvimento que criam aplicativos com grande volume de documentos. Cada elemento precisa ser posicionado manualmente usando coordenadas de pixel, transformando o que deveriam ser documentos simples em exercícios complexos de desenho.
Este guia fornece um caminho completo de migração do XFINIUM.PDF para o IronPDF, com instruções passo a passo, comparações de código e exemplos práticos para desenvolvedores .NET profissionais que estejam avaliando essa transição.
Por que migrar do XFINIUM.PDF
XFINIUM.PDF é uma biblioteca PDF de baixo nível que depende de programação gráfica baseada em coordenadas, obrigando os desenvolvedores a posicionar manualmente cada elemento na página. Essa abordagem se torna um pesadelo de manutenção à medida que os requisitos mudam. Os principais motivos pelos quais as equipes de desenvolvimento consideram a migração incluem:
Sem suporte a HTML: XFINIUM.PDF não consegue converter HTML/CSS diretamente para PDF. O foco é a criação programática de PDFs usando primitivas de desenho de baixo nível, o que pode não ser suficiente para projetos que exigem amplas funcionalidades de conversão de HTML para PDF.
API baseada em coordenadas: O posicionamento manual com coordenadas de pixel, como DrawString("text", font, brush, 50, 100), é necessário para cada elemento na página.
Gerenciamento manual de fontes: os objetos de fonte devem ser criados e gerenciados explicitamente usando classes como PdfStandardFont e PdfBrush.
Sem suporte para estilos CSS: Não há compatibilidade com estilos modernos da web. Cores, fontes e layouts devem ser tratados manualmente por meio de chamadas de métodos programáticos.
Sem renderização de JavaScript : somente conteúdo estático. O XFINIUM.PDF não consegue renderizar conteúdo web dinâmico nem executar JavaScript.
Formatação de texto complexa: Para textos que vão além de uma única linha, são necessários cálculos manuais de medição e quebra de texto.
Recursos limitados da comunidade: Há uma carência de recursos fornecidos pela comunidade, como exemplos e tutoriais, em comparação com as soluções mais populares, o que pode dificultar o início para novos usuários.
O problema central: API gráfica versus HTML
O XFINIUM.PDF força você a pensar como um programador gráfico, não como um designer de documentos:
// XFINIUM.PDF: Position every element manually
page.Graphics.DrawString("Invoice", titleFont, titleBrush, 50, 50);
page.Graphics.DrawString("Customer:", labelFont, brush, 50, 80);
page.Graphics.DrawString(customer.Name, valueFont, brush, 120, 80);
// ... hundreds of lines for a simple document
// XFINIUM.PDF: Position every element manually
page.Graphics.DrawString("Invoice", titleFont, titleBrush, 50, 50);
page.Graphics.DrawString("Customer:", labelFont, brush, 50, 80);
page.Graphics.DrawString(customer.Name, valueFont, brush, 120, 80);
// ... hundreds of lines for a simple document
' XFINIUM.PDF: Position every element manually
page.Graphics.DrawString("Invoice", titleFont, titleBrush, 50, 50)
page.Graphics.DrawString("Customer:", labelFont, brush, 50, 80)
page.Graphics.DrawString(customer.Name, valueFont, brush, 120, 80)
' ... hundreds of lines for a simple document
O IronPDF utiliza HTML/CSS familiar:
// IronPDF: Declarative HTML
var html = @"<h1>Invoice</h1><p><b>Customer:</b> " + customer.Name + "</p>";
var pdf = renderer.RenderHtmlAsPdf(html);
// IronPDF: Declarative HTML
var html = @"<h1>Invoice</h1><p><b>Customer:</b> " + customer.Name + "</p>";
var pdf = renderer.RenderHtmlAsPdf(html);
' IronPDF: Declarative HTML
Dim html As String = "<h1>Invoice</h1><p><b>Customer:</b> " & customer.Name & "</p>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
IronPDF vs XFINIUM.PDF: Comparação de Recursos
Compreender as diferenças arquitetônicas ajuda os responsáveis pelas decisões técnicas a avaliar o investimento em migração:
| Recurso | XFINIUM.PDF | IronPDF |
|---|---|---|
| HTML para PDF | Suporte limitado a HTML, com foco na criação programática de PDFs. | Conversão completa de HTML para PDF com suporte abrangente. |
| Comunidade e Apoio | Comunidade menor, menos recursos online disponíveis. | Comunidade ampla com extensa documentação e tutoriais. |
| Licença | Comercial com licenciamento baseado no desenvolvedor | Comercial |
| Suporte multiplataforma | Fortes capacidades multiplataforma | Também suporta operações multiplataforma |
| Suporte a CSS | Não | CSS3 completo |
| JavaScript | Não | ES2024 completo |
| Flexbox/Grade | Não | Sim |
| Layout automático | Não | Sim |
| Quebras de página automáticas | Não | Sim |
| Posicionamento manual | Obrigatório | Opcional (posicionamento CSS) |
| Curva de Aprendizagem | Alto (sistema de coordenadas) | Baixo (HTML/CSS) |
| Verbosidade do código | Muito alto | Baixo |
Guia rápido: Migração de XFINIUM.PDF para IronPDF
A migração pode começar imediatamente com esses passos fundamentais.
Passo 1: Substitua o pacote NuGet
Remover XFINIUM.PDF:
# Remove XFINIUM.PDF
dotnet remove package Xfinium.Pdf
# Remove XFINIUM.PDF
dotnet remove package Xfinium.Pdf
Instale o IronPDF:
# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
Etapa 2: Atualizar Namespaces
Substitua os namespaces XFINIUM.PDF pelo namespace IronPDF :
// Before (XFINIUM.PDF)
using Xfinium.Pdf;
using Xfinium.Pdf.Graphics;
using Xfinium.Pdf.Content;
using Xfinium.Pdf.FlowDocument;
// After (IronPDF)
using IronPdf;
// Before (XFINIUM.PDF)
using Xfinium.Pdf;
using Xfinium.Pdf.Graphics;
using Xfinium.Pdf.Content;
using Xfinium.Pdf.FlowDocument;
// After (IronPDF)
using IronPdf;
Imports IronPdf
Etapa 3: Inicializar a licença
Adicionar inicialização de licença na inicialização do aplicativo:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Exemplos de migração de código
Converter HTML para PDF
A operação mais fundamental revela a diferença de complexidade entre essas bibliotecas PDF do .NET .
Abordagem XFINIUM.PDF:
// NuGet: Install-Package Xfinium.Pdf
using Xfinium.Pdf;
using Xfinium.Pdf.Actions;
using Xfinium.Pdf.FlowDocument;
using System.IO;
class Program
{
static void Main()
{
PdfFixedDocument document = new PdfFixedDocument();
PdfFlowDocument flowDocument = new PdfFlowDocument();
string html = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
PdfFlowContent content = new PdfFlowContent();
content.AppendHtml(html);
flowDocument.AddContent(content);
flowDocument.RenderDocument(document);
document.Save("output.pdf");
}
}
// NuGet: Install-Package Xfinium.Pdf
using Xfinium.Pdf;
using Xfinium.Pdf.Actions;
using Xfinium.Pdf.FlowDocument;
using System.IO;
class Program
{
static void Main()
{
PdfFixedDocument document = new PdfFixedDocument();
PdfFlowDocument flowDocument = new PdfFlowDocument();
string html = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
PdfFlowContent content = new PdfFlowContent();
content.AppendHtml(html);
flowDocument.AddContent(content);
flowDocument.RenderDocument(document);
document.Save("output.pdf");
}
}
Imports Xfinium.Pdf
Imports Xfinium.Pdf.Actions
Imports Xfinium.Pdf.FlowDocument
Imports System.IO
Module Program
Sub Main()
Dim document As New PdfFixedDocument()
Dim flowDocument As New PdfFlowDocument()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>"
Dim content As New PdfFlowContent()
content.AppendHtml(html)
flowDocument.AddContent(content)
flowDocument.RenderDocument(document)
document.Save("output.pdf")
End Sub
End Module
Abordagem IronPDF :
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></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();
string html = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Class
XFINIUM.PDF requer a criação de um objeto PdfFixedDocument, um objeto PdfFlowDocument, a chamada de AppendHtml(), a adição de conteúdo ao documento de fluxo, a renderização no documento fixo e, finalmente, o salvamento. O IronPDF simplifica isso para três linhas: criar um renderizador, renderizar o HTML e salvar.
Para cenários avançados de conversão de HTML para PDF, consulte o guia de conversão de HTML para PDF .
Unir vários PDFs
A fusão de PDFs demonstra claramente as diferenças na complexidade da API.
Abordagem XFINIUM.PDF:
// NuGet: Install-Package Xfinium.Pdf
using Xfinium.Pdf;
using System.IO;
class Program
{
static void Main()
{
PdfFixedDocument output = new PdfFixedDocument();
FileStream file1 = File.OpenRead("document1.pdf");
PdfFixedDocument pdf1 = new PdfFixedDocument(file1);
FileStream file2 = File.OpenRead("document2.pdf");
PdfFixedDocument pdf2 = new PdfFixedDocument(file2);
for (int i = 0; i < pdf1.Pages.Count; i++)
{
output.Pages.Add(pdf1.Pages[i]);
}
for (int i = 0; i < pdf2.Pages.Count; i++)
{
output.Pages.Add(pdf2.Pages[i]);
}
output.Save("merged.pdf");
file1.Close();
file2.Close();
}
}
// NuGet: Install-Package Xfinium.Pdf
using Xfinium.Pdf;
using System.IO;
class Program
{
static void Main()
{
PdfFixedDocument output = new PdfFixedDocument();
FileStream file1 = File.OpenRead("document1.pdf");
PdfFixedDocument pdf1 = new PdfFixedDocument(file1);
FileStream file2 = File.OpenRead("document2.pdf");
PdfFixedDocument pdf2 = new PdfFixedDocument(file2);
for (int i = 0; i < pdf1.Pages.Count; i++)
{
output.Pages.Add(pdf1.Pages[i]);
}
for (int i = 0; i < pdf2.Pages.Count; i++)
{
output.Pages.Add(pdf2.Pages[i]);
}
output.Save("merged.pdf");
file1.Close();
file2.Close();
}
}
Imports Xfinium.Pdf
Imports System.IO
Module Program
Sub Main()
Dim output As New PdfFixedDocument()
Dim file1 As FileStream = File.OpenRead("document1.pdf")
Dim pdf1 As New PdfFixedDocument(file1)
Dim file2 As FileStream = File.OpenRead("document2.pdf")
Dim pdf2 As New PdfFixedDocument(file2)
For i As Integer = 0 To pdf1.Pages.Count - 1
output.Pages.Add(pdf1.Pages(i))
Next
For i As Integer = 0 To pdf2.Pages.Count - 1
output.Pages.Add(pdf2.Pages(i))
Next
output.Save("merged.pdf")
file1.Close()
file2.Close()
End Sub
End Module
Abordagem IronPDF :
// NuGet: Install-Package IronPdf
using IronPdf;
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.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");
}
}
Imports IronPdf
Imports System.Collections.Generic
Class Program
Shared Sub Main()
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
End Sub
End Class
O XFINIUM.PDF exige a criação de um documento de saída, a abertura de fluxos de arquivos, o carregamento de cada documento, a iteração manual pelas páginas e a adição delas uma a uma, o salvamento e, em seguida, o fechamento dos fluxos. O IronPDF fornece um único método PdfDocument.Merge() que lida com toda a complexidade internamente.
Consulte a documentação sobre mesclagem de PDFs para obter opções adicionais de mesclagem.
Criando PDFs com texto e imagens
Documentos com conteúdo misto demonstram a diferença paradigmática fundamental.
Abordagem XFINIUM.PDF:
// NuGet: Install-Package Xfinium.Pdf
using Xfinium.Pdf;
using Xfinium.Pdf.Graphics;
using Xfinium.Pdf.Core;
using System.IO;
class Program
{
static void Main()
{
PdfFixedDocument document = new PdfFixedDocument();
PdfPage page = document.Pages.Add();
PdfStandardFont font = new PdfStandardFont(PdfStandardFontFace.Helvetica, 24);
PdfBrush brush = new PdfBrush(PdfRgbColor.Black);
page.Graphics.DrawString("Sample PDF Document", font, brush, 50, 50);
FileStream imageStream = File.OpenRead("image.jpg");
PdfJpegImage image = new PdfJpegImage(imageStream);
page.Graphics.DrawImage(image, 50, 100, 200, 150);
imageStream.Close();
document.Save("output.pdf");
}
}
// NuGet: Install-Package Xfinium.Pdf
using Xfinium.Pdf;
using Xfinium.Pdf.Graphics;
using Xfinium.Pdf.Core;
using System.IO;
class Program
{
static void Main()
{
PdfFixedDocument document = new PdfFixedDocument();
PdfPage page = document.Pages.Add();
PdfStandardFont font = new PdfStandardFont(PdfStandardFontFace.Helvetica, 24);
PdfBrush brush = new PdfBrush(PdfRgbColor.Black);
page.Graphics.DrawString("Sample PDF Document", font, brush, 50, 50);
FileStream imageStream = File.OpenRead("image.jpg");
PdfJpegImage image = new PdfJpegImage(imageStream);
page.Graphics.DrawImage(image, 50, 100, 200, 150);
imageStream.Close();
document.Save("output.pdf");
}
}
Imports Xfinium.Pdf
Imports Xfinium.Pdf.Graphics
Imports Xfinium.Pdf.Core
Imports System.IO
Class Program
Shared Sub Main()
Dim document As New PdfFixedDocument()
Dim page As PdfPage = document.Pages.Add()
Dim font As New PdfStandardFont(PdfStandardFontFace.Helvetica, 24)
Dim brush As New PdfBrush(PdfRgbColor.Black)
page.Graphics.DrawString("Sample PDF Document", font, brush, 50, 50)
Dim imageStream As FileStream = File.OpenRead("image.jpg")
Dim image As New PdfJpegImage(imageStream)
page.Graphics.DrawImage(image, 50, 100, 200, 150)
imageStream.Close()
document.Save("output.pdf")
End Sub
End Class
Abordagem IronPDF :
// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string imageBase64 = Convert.ToBase64String(File.ReadAllBytes("image.jpg"));
string html = $@"
<html>
<body>
<h1>Sample PDF Document</h1>
<img src='data:image/jpeg;base64,{imageBase64}' width='200' height='150' />
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string imageBase64 = Convert.ToBase64String(File.ReadAllBytes("image.jpg"));
string html = $@"
<html>
<body>
<h1>Sample PDF Document</h1>
<img src='data:image/jpeg;base64,{imageBase64}' width='200' height='150' />
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports System.IO
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim imageBase64 As String = Convert.ToBase64String(File.ReadAllBytes("image.jpg"))
Dim html As String = $"
<html>
<body>
<h1>Sample PDF Document</h1>
<img src='data:image/jpeg;base64,{imageBase64}' width='200' height='150' />
</body>
</html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Class
O XFINIUM.PDF requer a criação de um documento, a adição de uma página, a criação de objetos de fonte e pincel, o desenho de texto em coordenadas específicas, a abertura de um fluxo de imagem, a criação de um PdfJpegImage, o desenho da imagem em coordenadas com dimensões, o fechamento do fluxo e o salvamento. O IronPDF utiliza HTML padrão com imagens em base64 incorporadas — a mesma abordagem que os desenvolvedores web usam diariamente.
Referência de mapeamento da API XFINIUM.PDF para o IronPDF
Este mapeamento acelera a migração ao mostrar equivalentes diretos da API:
| XFINIUM.PDF | IronPDF |
|---|---|
PdfFixedDocument |
ChromePdfRenderer |
PdfPage |
Automático |
page.Graphics.DrawString() |
Elementos de texto HTML |
page.Graphics.DrawImage() |
<img> tag |
page.Graphics.DrawLine() |
CSS border ou <hr> |
page.Graphics.DrawRectangle() |
CSS border em <div> |
PdfStandardFont |
CSS font-family |
PdfRgbColor |
CSS color |
PdfBrush |
Propriedades CSS |
PdfJpegImage |
<img> tag com base64 |
document.Save(stream) |
pdf.SaveAs() ou pdf.BinaryData |
PdfFlowDocument |
RenderHtmlAsPdf() |
PdfFlowContent.AppendHtml() |
RenderHtmlAsPdf() |
Problemas e soluções comuns em migrações
Problema 1: Layout baseado em coordenadas
XFINIUM.PDF: Tudo requer coordenadas X,Y exatas com posicionamento manual.
Solução: Utilize um layout de fluxo HTML/CSS. Para posicionamento absoluto quando necessário, use CSS:
.positioned-element {
position: absolute;
top: 100px;
left: 50px;
}
Problema 2: Gerenciamento de Objetos de Fonte
XFINIUM.PDF: Crie objetos PdfStandardFont ou PdfUnicodeTrueTypeFont para cada fonte.
Solução: Use CSS font-family — as fontes são gerenciadas automaticamente:
<style>
body { font-family: Arial, sans-serif; }
h1 { font-family: 'Times New Roman', serif; font-size: 24px; }
</style>
<style>
body { font-family: Arial, sans-serif; }
h1 { font-family: 'Times New Roman', serif; font-size: 24px; }
</style>
Edição 3: Manipulação de Cores
XFINIUM.PDF: Crie objetos PdfRgbColor e PdfBrush para cores.
Solução: Utilize cores CSS padrão:
.header { color: navy; background-color: #f5f5f5; }
.warning { color: rgb(255, 0, 0); }
.info { color: rgba(0, 0, 255, 0.8); }
Edição 4: Quebras de página manuais
XFINIUM.PDF: Monitore a posição Y e crie novas páginas manualmente quando o conteúdo exceder os limites.
Solução: O IronPDF lida com quebras de página automáticas. Para controle explícito, use CSS:
.section { page-break-after: always; }
.keep-together { page-break-inside: avoid; }
Problema 5: Carregamento de imagens
XFINIUM.PDF: Abrir fluxos de arquivos, criar objetos PdfJpegImage, desenhar em coordenadas, fechar fluxos.
Solução: Utilize tags HTML <img> com caminhos de arquivos ou dados em base64:
<img src="image.jpg" width="200" height="150" />
<img src="data:image/jpeg;base64,..." />
<img src="image.jpg" width="200" height="150" />
<img src="data:image/jpeg;base64,..." />
Lista de verificação de migração XFINIUM.PDF
Tarefas pré-migração
Faça uma auditoria no seu código-fonte para identificar todos os usos de XFINIUM.PDF:
grep -r "using Xfinium.Pdf" --include="*.cs" .
grep -r "Graphics.DrawString\|Graphics.DrawImage\|Graphics.DrawLine" --include="*.cs" .
grep -r "using Xfinium.Pdf" --include="*.cs" .
grep -r "Graphics.DrawString\|Graphics.DrawImage\|Graphics.DrawLine" --include="*.cs" .
Documente os layouts baseados em coordenadas e anote todos os valores de posicionamento X,Y. Identificar objetos de fonte e cor (PdfStandardFont, PdfRgbColor, PdfBrush). Fluxos de trabalho de PDF mesclados em mapas usando PdfFixedDocument.Pages.Add().
Tarefas de atualização de código
- Remova o pacote NuGet Xfinium.Pdf.
- Instale o pacote NuGet IronPDF
- Atualizar as importações de namespace de
Xfinium.PdfparaIronPdf - Converter chamadas
DrawString()em elementos de texto HTML - Converter chamadas
DrawImage()em tags HTML<img> - Converter
DrawRectangle()eDrawLine()em bordas CSS - Substitua
PdfStandardFontpor CSSfont-family - Substitua
PdfRgbColorePdfBrushpor cores CSS. - Substituir a mesclagem de loops de página por
PdfDocument.Merge() - Adicionar inicialização da licença do IronPDF na inicialização do sistema.
Testes pós-migração
Após a migração, verifique os seguintes aspectos:
- Compare a saída visual para garantir que a aparência corresponda às expectativas.
- Verificar a renderização do texto com a nova abordagem HTML/CSS
- Verificar o posicionamento da imagem usando CSS
- As quebras de página de teste ocorrem conforme o esperado.
- Verifique se as configurações de segurança do PDF estão aplicadas corretamente.
- Testar em todas as plataformas alvo
Principais benefícios da migração para o IronPDF
A migração do XFINIUM.PDF para o IronPDF oferece diversas vantagens importantes:
Criação de conteúdo baseado em HTML: os desenvolvedores web podem aproveitar suas habilidades existentes em HTML e CSS. Não é necessário aprender APIs de desenho baseadas em coordenadas nem gerenciar objetos de fonte e pincel.
Layout automático: a quebra de texto, a paginação e o layout de fluxo acontecem automaticamente. Não é necessário calcular manualmente as posições dos elementos ou as quebras de página.
Suporte a CSS moderno: CSS3 completo, incluindo layouts Flexbox e Grid. Os designs responsivos são convertidos diretamente para PDF.
Operações simplificadas em PDF: Chamadas de método único para operações comuns como PdfDocument.Merge() substituem loops complexos de iteração de página.
Desenvolvimento ativo: À medida que a adoção do .NET 10 e do C# 14 aumenta até 2026, as atualizações regulares do IronPDF garantem a compatibilidade com as versões atuais e futuras do .NET .
Documentação extensa: Grande comunidade com documentação abrangente, tutoriais e recursos de suporte, em comparação com o ecossistema menor do XFINIUM.PDF.

