Como migrar do Spire.PDF para o IronPDF em C#
Migrar do Spire.PDF para o IronPDF move sua geração de PDFs de um caminho HTML legado que frequentemente produz texto baseado em imagem para um pipeline Chromium que produz texto verdadeiro, selecionável e pesquisável. Este guia fornece um caminho de migração completo, passo a passo, abordando os trade-offs de renderização HTML do Spire.PDF e problemas relatados de incorporação de fontes.
Por que migrar do Spire.PDF para o IronPDF?
Entendendo o Spire.PDF
Spire.PDF é uma biblioteca PDF comercial robusta, projetada para desenvolvedores .NET lidarem com documentos PDF de forma eficiente. O Spire.PDF se destacou na comunidade de programação por suas funcionalidades específicas, especialmente em aplicações legadas, e suas capacidades de integração se alinham perfeitamente com outros componentes do conjunto de ferramentas E-iceblue.
No entanto, o Spire.PDF apresenta diversos problemas fundamentais que afetam seu uso no mundo real, principalmente em relação à conversão de HTML para PDF e ao suporte aos padrões web modernos.
Problemas técnicos críticos
| Emitir | Impacto | Solução IronPDF |
|---|---|---|
| Texto frequentemente renderizado como imagens no caminho HTML legado | Os PDFs não são pesquisáveis, não são acessíveis e não é possível copiar o texto. | Renderização de texto real |
| Dependência IE/Edge Legacy ou QtWebKit no caminho legado | Renderização desatualizada, problemas de CSS moderno | Chromium moderno incluído |
| Problemas de incorporação de fontes relatados | Os documentos parecem estar incorretos em outros sistemas. | Manipulação confiável de fontes |
| Grande área de implantação | Maior uso de memória | Chromium incluído em runtime |
| CSS limitado no caminho legado | Os layouts modernos não são renderizados corretamente. | Suporte completo a CSS3 |
O problema central: PDFs baseados em imagens
Um inconveniente relatado do caminho legado HTML do Spire.PDF é sua inclinação em renderizar texto dentro de documentos HTML como imagens. Isso produz PDFs onde o texto não é selecionável ou pesquisável — uma limitação para aplicativos que precisam de busca ou interação de texto.
Quando você usa o método LoadFromHTML() do Spire.PDF no mecanismo legado, ele frequentemente renderiza texto como imagens bitmap em vez de texto real, criando esses problemas:
- Não é possível selecionar texto
- O texto NÃO pode ser pesquisado
- O texto NÃO pode ser copiado
- Os leitores de tela NÃO conseguem ler (violação de acessibilidade)
- O tamanho do arquivo é MUITO maior
- O zoom causa pixelização
Comparação entre Spire.PDF e IronPDF
| Recurso | Spire.PDF | IronPDF |
|---|---|---|
| Renderização de HTML para PDF | IE/QtWebKit por padrão; opt-in ChromeHtmlConverter (requer Chrome do sistema) desde a v10.7.21 |
Chromium incluído (moderno, sem instalação extra) |
| Saída de Texto (caminho HTML) | Frequentemente renderizado como imagens no caminho legado | Texto real (selecionável e pesquisável) |
| Manipulação de fontes | Problemas relatados no caminho legado | Manipulação confiável de fontes |
| Suporte a CSS3 | Limitado no caminho legado | Completo |
| Flexbox/Grade | Não suportado no caminho legado | Apoiado |
| JavaScript | Limitado no caminho legado | ES6+ completo |
| Acessibilidade do PDF | Ruim no caminho legado (saída baseada em imagem) | Saída de texto marcado |
| Design de API | Muitos overloads, configurações de página manual | Renderizador único e fluente |
| Licenciamento | Gratuito/Comercial | Comercial |
No .NET moderno,IronPDF soluciona os trade-offs HTML para PDF do Spire.PDF ao renderizar texto como texto selecionável real em vez de imagens, assim os PDFs resultantes são pesquisáveis e acessíveis.
Antes de começar
Pré-requisitos
- Ambiente .NET : .NET Framework 4.6.2+ ou .NET Core 3.1+ / .NET 5/6/7/8/9+
- Acesso ao NuGet : Capacidade de instalar pacotes NuGet.
- Licença do IronPDF: Obtenha sua chave de licença em IronPDF
Alterações no pacote NuGet
# Remove Spire.PDF
dotnet remove package Spire.PDF
dotnet remove package FreeSpire.PDF # If using free version
# Install IronPDF
dotnet add package IronPdf
# Remove Spire.PDF
dotnet remove package Spire.PDF
dotnet remove package FreeSpire.PDF # If using free version
# Install IronPDF
dotnet add package IronPdf
Configuração de licença
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Referência completa da API
Alterações de namespace
// Before: Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.HtmlConverter;
// After: IronPDF
using IronPdf;
using IronPdf.Editing;
// Before: Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.HtmlConverter;
// After: IronPDF
using IronPdf;
using IronPdf.Editing;
Imports IronPdf
Imports IronPdf.Editing
Mapeamentos da API principal
| Spire.PDF | IronPDF |
|---|---|
new PdfDocument() |
new ChromePdfRenderer() |
pdf.LoadFromHTML() |
renderer.RenderHtmlAsPdf() |
pdf.LoadFromFile() |
PdfDocument.FromFile() |
pdf.SaveToFile() |
pdf.SaveAs() |
pdf.Close() |
Não é necessário |
pdf.Pages.Add() |
renderer.RenderHtmlAsPdf() |
pdf.InsertPageRange() |
PdfDocument.Merge() |
page.Canvas.DrawString() |
TextStamper + ApplyStamp() |
PdfFont |
Estilização CSS em HTML |
PdfBrush |
Estilização CSS em HTML |
Exemplos de migração de código
Exemplo 1: Conversão de HTML para PDF
Antes (Spire.PDF):
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System;
class Program
{
static void Main()
{
PdfDocument pdf = new PdfDocument();
PdfHtmlLayoutFormat htmlLayoutFormat = new PdfHtmlLayoutFormat();
string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
pdf.LoadFromHTML(htmlString, false, true, true);
pdf.SaveToFile("output.pdf");
pdf.Close();
}
}
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System;
class Program
{
static void Main()
{
PdfDocument pdf = new PdfDocument();
PdfHtmlLayoutFormat htmlLayoutFormat = new PdfHtmlLayoutFormat();
string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
pdf.LoadFromHTML(htmlString, false, true, true);
pdf.SaveToFile("output.pdf");
pdf.Close();
}
}
Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports System
Class Program
Shared Sub Main()
Dim pdf As New PdfDocument()
Dim htmlLayoutFormat As New PdfHtmlLayoutFormat()
Dim htmlString As String = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>"
pdf.LoadFromHTML(htmlString, False, True, True)
pdf.SaveToFile("output.pdf")
pdf.Close()
End Sub
End Class
Após (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim htmlString As String = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlString)
pdf.SaveAs("output.pdf")
End Sub
End Class
Este exemplo demonstra a diferença fundamental na renderização de HTML. Spire.PDF usa LoadFromHTML() com um objeto PdfHtmlLayoutFormat, que frequentemente renderiza texto como imagens bitmap. O resultado são PDFs onde os usuários não podem selecionar, copiar ou pesquisar texto.
IronPDF usa um ChromePdfRenderer com RenderHtmlAsPdf(), produzindo texto verdadeiro que é totalmente selecionável, pesquisável e acessível. Nenhuma chamada Close() é necessária—IronPDF usa o padrão de descarte para limpeza automática. Veja a documentação de HTML para PDF para exemplos abrangentes.
Exemplo 2: Mesclar vários PDFs
Antes (Spire.PDF):
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using System;
class Program
{
static void Main()
{
PdfDocument pdf1 = new PdfDocument();
pdf1.LoadFromFile("document1.pdf");
PdfDocument pdf2 = new PdfDocument();
pdf2.LoadFromFile("document2.pdf");
pdf1.InsertPageRange(pdf2, 0, pdf2.Pages.Count - 1);
pdf1.SaveToFile("merged.pdf");
pdf1.Close();
pdf2.Close();
}
}
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using System;
class Program
{
static void Main()
{
PdfDocument pdf1 = new PdfDocument();
pdf1.LoadFromFile("document1.pdf");
PdfDocument pdf2 = new PdfDocument();
pdf2.LoadFromFile("document2.pdf");
pdf1.InsertPageRange(pdf2, 0, pdf2.Pages.Count - 1);
pdf1.SaveToFile("merged.pdf");
pdf1.Close();
pdf2.Close();
}
}
Imports Spire.Pdf
Imports System
Class Program
Shared Sub Main()
Dim pdf1 As New PdfDocument()
pdf1.LoadFromFile("document1.pdf")
Dim pdf2 As New PdfDocument()
pdf2.LoadFromFile("document2.pdf")
pdf1.InsertPageRange(pdf2, 0, pdf2.Pages.Count - 1)
pdf1.SaveToFile("merged.pdf")
pdf1.Close()
pdf2.Close()
End Sub
End Class
Após (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
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;
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
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
Spire.PDF requer carregar manualmente cada documento com new PdfDocument() + LoadFromFile(), depois usar InsertPageRange() para especificar quais páginas inserir, e finalmente chamar Close() em cada documento.
IronPDF usa o padrão mais simples PdfDocument.FromFile() e um método estático PdfDocument.Merge() que aceita múltiplos documentos. Nenhuma chamada Close() necessária. Saiba mais em nossos tutoriais .
Exemplo 3: Adicionando texto a um PDF
Antes (Spire.PDF):
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System;
class Program
{
static void Main()
{
PdfDocument pdf = new PdfDocument();
PdfPageBase page = pdf.Pages.Add();
PdfFont font = new PdfFont(PdfFontFamily.Helvetica, 20);
PdfBrush brush = new PdfSolidBrush(Color.Black);
page.Canvas.DrawString("Hello from Spire.PDF!", font, brush, new PointF(50, 50));
pdf.SaveToFile("output.pdf");
pdf.Close();
}
}
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System;
class Program
{
static void Main()
{
PdfDocument pdf = new PdfDocument();
PdfPageBase page = pdf.Pages.Add();
PdfFont font = new PdfFont(PdfFontFamily.Helvetica, 20);
PdfBrush brush = new PdfSolidBrush(Color.Black);
page.Canvas.DrawString("Hello from Spire.PDF!", font, brush, new PointF(50, 50));
pdf.SaveToFile("output.pdf");
pdf.Close();
}
}
Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports System.Drawing
Imports System
Class Program
Shared Sub Main()
Dim pdf As New PdfDocument()
Dim page As PdfPageBase = pdf.Pages.Add()
Dim font As New PdfFont(PdfFontFamily.Helvetica, 20)
Dim brush As PdfBrush = New PdfSolidBrush(Color.Black)
page.Canvas.DrawString("Hello from Spire.PDF!", font, brush, New PointF(50, 50))
pdf.SaveToFile("output.pdf")
pdf.Close()
End Sub
End Class
Após (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
var textStamper = new TextStamper()
{
Text = "Hello from IronPDF!",
FontSize = 20,
VerticalOffset = 50,
HorizontalOffset = 50
};
pdf.ApplyStamp(textStamper);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
var textStamper = new TextStamper()
{
Text = "Hello from IronPDF!",
FontSize = 20,
VerticalOffset = 50,
HorizontalOffset = 50
};
pdf.ApplyStamp(textStamper);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports IronPdf.Editing
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>")
Dim textStamper = New TextStamper() With {
.Text = "Hello from IronPDF!",
.FontSize = 20,
.VerticalOffset = 50,
.HorizontalOffset = 50
}
pdf.ApplyStamp(textStamper)
pdf.SaveAs("output.pdf")
End Sub
End Class
Spire.PDF usa um modelo de desenho baseado em tela com PdfFont, PdfBrush e page.Canvas.DrawString() para posicionar texto em coordenadas específicas usando PointF.
IronPDF usa um objeto TextStamper com propriedades intuitivas como Text, FontSize, VerticalOffset e HorizontalOffset, depois aplica com ApplyStamp(). Essa abordagem é mais declarativa e mais fácil de manter.
O problema do texto como imagem
Por que isso é crucial
Quando o Spire.PDF converte HTML para PDF usando renderização baseada em imagens, seus documentos perdem funcionalidades essenciais:
1. Sem busca de texto: os usuários não podem usar Ctrl+F para encontrar texto. Os sistemas de gestão documental não conseguem indexar conteúdo.
2. Sem seleção/cópia de texto: Os usuários que tentam copiar uma citação, referência ou dados não podem selecionar o texto — trata-se de uma imagem.
3. Violações de acessibilidade: PDFs baseados em imagens não estão em conformidade com as diretrizes WCAG 2.1, com a Seção 508 (Governo dos EUA), com os requisitos da ADA e com a compatibilidade com leitores de tela.
4. Tamanhos Grandes de Arquivo: A saída baseada em imagens do caminho legado HTML pode produzir arquivos de ordem de magnitude maiores do que a saída baseada em texto que o IronPDF produz para o mesmo conteúdo.
Detecção: Seu PDF é baseado em imagens?
Abra o documento gerado pelo Spire.PDF e tente os seguintes testes:
- Seleção de texto: Clique e arraste sobre o texto. Se nada estiver destacado → BASEADO EM IMAGEM
- Pesquisa Ctrl+F: Busca qualquer palavra na página. Se "Nenhum resultado encontrado" → BASEADO EM IMAGEM
- Copiar/Colar: Selecione e copie o texto para o bloco de notas. Se nada for colado → BASEADO EM IMAGEM
O Problema do Mecanismo HTML Legado
Mecanismos de Renderização do Spire.PDF
O LoadFromHTML(...) do Spire.PDF historicamente ofereceu dois caminhos: um caminho não-plugin apoiado pelo controle WebBrowser do Windows Internet Explorer / Edge Legacy, e um caminho de plugin QT/WebKit baixado separadamente. Spire.PDF 10.7.21 (meados de 2024) adicionou uma terceira opção, ChromeHtmlConverter, que utiliza um Google Chrome instalado localmente — mas é opt-in e o API original LoadFromHTML ainda é padrão para os mecanismos legados. IE/Edge Legacy foi descontinuado pela Microsoft em 2022, o CSS moderno é confiável no caminho legado, o suporte a JavaScript é parcial, e a renderização pode variar entre sistemas.
CSS moderno que falha no Spire.PDF
<div style="display: flex; justify-content: space-between; gap: 20px;">
<div style="flex: 1;">Column 1</div>
<div style="flex: 1;">Column 2</div>
</div>
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
<style>
:root { --primary-color: #007bff; }
h1 { color: var(--primary-color); }
</style>
<div style="display: flex; justify-content: space-between; gap: 20px;">
<div style="flex: 1;">Column 1</div>
<div style="flex: 1;">Column 2</div>
</div>
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
<style>
:root { --primary-color: #007bff; }
h1 { color: var(--primary-color); }
</style>
O IronPDF utiliza a renderização moderna do Chromium, portanto todos esses recursos de CSS funcionam corretamente.
Novas funcionalidades após a migração
Após migrar para o IronPDF, você obtém recursos que o Spire.PDF não oferece:
Texto selecionável e pesquisável
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Important Contract</h1>");
pdf.SaveAs("contract.pdf");
// Result:
// ✅ Text is fully selectable
// ✅ Text is searchable with Ctrl+F
// ✅ Text can be copied to clipboard
// ✅ Screen readers work perfectly
// ✅ File size is compact
// ✅ Zooming is crystal clear
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Important Contract</h1>");
pdf.SaveAs("contract.pdf");
// Result:
// ✅ Text is fully selectable
// ✅ Text is searchable with Ctrl+F
// ✅ Text can be copied to clipboard
// ✅ Screen readers work perfectly
// ✅ File size is compact
// ✅ Zooming is crystal clear
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Important Contract</h1>")
pdf.SaveAs("contract.pdf")
' Result:
' ✅ Text is fully selectable
' ✅ Text is searchable with Ctrl+F
' ✅ Text can be copied to clipboard
' ✅ Screen readers work perfectly
' ✅ File size is compact
' ✅ Zooming is crystal clear
Suporte a CSS moderno
var renderer = new ChromePdfRenderer();
var html = @"
<style>
:root { --primary: #007bff; }
.container { display: flex; gap: 20px; }
.grid { display: grid; grid-template-columns: repeat(3, 1fr); }
</style>
<div class='container'>
<div style='flex: 1; color: var(--primary)'>Column 1</div>
<div style='flex: 1'>Column 2</div>
</div>
<div class='grid'>
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
// All modern CSS features render correctly!
var renderer = new ChromePdfRenderer();
var html = @"
<style>
:root { --primary: #007bff; }
.container { display: flex; gap: 20px; }
.grid { display: grid; grid-template-columns: repeat(3, 1fr); }
</style>
<div class='container'>
<div style='flex: 1; color: var(--primary)'>Column 1</div>
<div style='flex: 1'>Column 2</div>
</div>
<div class='grid'>
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
// All modern CSS features render correctly!
Dim renderer = New ChromePdfRenderer()
Dim html = "
<style>
:root { --primary: #007bff; }
.container { display: flex; gap: 20px; }
.grid { display: grid; grid-template-columns: repeat(3, 1fr); }
</style>
<div class='container'>
<div style='flex: 1; color: var(--primary)'>Column 1</div>
<div style='flex: 1'>Column 2</div>
</div>
<div class='grid'>
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
' All modern CSS features render correctly!
Marcas d'água baseadas em HTML
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.ApplyWatermark(@"
<div style='
font-size: 48px;
color: rgba(255, 0, 0, 0.5);
transform: rotate(-45deg);
'>DRAFT</div>");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.ApplyWatermark(@"
<div style='
font-size: 48px;
color: rgba(255, 0, 0, 0.5);
transform: rotate(-45deg);
'>DRAFT</div>");
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.ApplyWatermark("
<div style='
font-size: 48px;
color: rgba(255, 0, 0, 0.5);
transform: rotate(-45deg);
'>DRAFT</div>")
Lista de verificação para migração
Pré-migração
- Inventariar todas as utilizações de Spire.PDF na base de código.
- Testar PDFs existentes quanto à possibilidade de seleção de texto (detecção de problemas críticos)
- Chamadas de
LoadFromHTML()de documento (estas são a prioridade para corrigir) - Obtenha a chave de licença do IronPDF em IronPDF
Atualizações de código
- Remover pacote NuGet
Spire.PDF(eFreeSpire.PDFse estiver usando a versão gratuita) - Instalar pacote NuGet
IronPdf - Atualizar importações de namespace (
using Spire.Pdf;→using IronPdf;) - Substituir
LoadFromHTML()porRenderHtmlAsPdf()(CORREÇÃO CRÍTICA) - Substituir
new PdfDocument()+LoadFromFile()porPdfDocument.FromFile() - Substituir
InsertPageRange()porPdfDocument.Merge() - Substituir
Canvas.DrawString()porTextStamper+ApplyStamp() - Substituir
SaveToFile()porSaveAs() - Remover todas as chamadas
Close()(não necessárias no IronPDF) - Adicionar inicialização de licença na inicialização do aplicativo
Testando
- Verificar se o texto é selecionável nos PDFs gerados (TESTE CRÍTICO)
- Verificar melhorias na renderização de CSS (Flexbox/Grid agora funcionam)
- Verifique se os tamanhos dos arquivos são menores.
- Testar a acessibilidade com leitores de tela
- Comparação de desempenho

