Como migrar do Winnovative para o IronPDF em C#
A Winnovative é um nome reconhecido na área de geração de PDFs em .NET , oferecendo recursos de conversão de HTML para PDF para aplicativos C#. No entanto, a biblioteca clássica de longa data depende de um mecanismo de renderização proprietário mais antigo, e seu suporte para CSS moderno (Grid, Flexbox recente) e JavaScript moderno (ES2017+) é inconsistente comparado a um navegador Chromium atual. A resposta do fornecedor tem sido enviar um produto de classe Chromium separado, Winnovative.Pdf.Next, em vez de atualizar o Classic no local — o que significa que os clientes existentes da Winnovative enfrentam uma migração de código de qualquer maneira.
Este guia fornece um caminho de migração do Winnovative para o IronPDF, com instruções passo a passo, comparações de código e exemplos práticos para desenvolvedores .NET avaliando essa transição.
Por que migrar da Winnovative?
A biblioteca Classic da Winnovative usa um motor proprietário mais antigo que não foi atualizado para os padrões web modernos:
Grid CSS / Flexbox moderno Inconsistente: Layouts que dependem do Grid CSS ou recursos recentes do Flexbox podem renderizar incorretamente comparado a um navegador Chromium atual.
Lacunas de Compatibilidade com JavaScript Moderno: Recursos ES2017+ (funções de flecha, async/await, classes) não são executados de forma confiável, o que afeta React, Vue e outras estruturas modernas.
Ritmo Lento: O motor clássico recebe atualizações de motor de renderização infrequentes; a resposta do fornecedor tem sido enviar o produto separado de classe Chromium Winnovative.Pdf.Next, deixando o Classic com recursos congelados.
Fardo de Migração de Dois Produtos: Mudar para Winnovative.Pdf.Next é em si uma reescrita — a API Next vive em um namespace diferente (Winnovative.Pdf.Next) e é binariamente incompatível com o Classic.
Casos Limite de Renderização de Fontes: Fontes web e tipografia personalizada às vezes são renderizados de forma diferente de um navegador moderno.
Impacto no mundo real
CSS e JavaScript modernos que podem renderizar de forma inconsistente no Winnovative Classic:
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px;">
<div>Column 1</div>
<div>Column 2</div>
<div>Column 3</div>
</div>
<script>
const items = data.map(item => item.name);
const result = await fetchData();
class Report { }
</script>
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px;">
<div>Column 1</div>
<div>Column 2</div>
<div>Column 3</div>
</div>
<script>
const items = data.map(item => item.name);
const result = await fetchData();
class Report { }
</script>
IronPDF vs Winnovative: 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:
| Aspecto | Winnovative Classic | IronPDF |
|---|---|---|
| Motor de renderização | Motor proprietário mais antigo | Cromo (Atual) |
| Grade CSS | Inconsistente | Suporte completo |
| Flexbox | Inconsistente em casos extremos | Suporte completo |
| JavaScript | JS moderno limitado | ES2024 |
| Bootstrap 5 | Problemas de layout | Suporte completo |
| Tailwind CSS | Limitado | Suporte completo |
| React/Vue SSR | Problemático | Funciona |
| Fontes da Web | Não confiável em algumas configurações | Suporte completo |
| Atualizações | Pouco frequente | Mensal |
| Preços (por desenvolvedor) | $450 Implantação / $1,200 Redistribuível | See ironpdf.com/pricing |
Guia rápido: Migração do Winnovative para o IronPDF
A migração pode começar imediatamente com esses passos fundamentais.
Passo 1: Substituir pacotes NuGet
Remover todos os pacotes Winnovative (verifique quais seu projeto realmente usa):
# Remove Winnovative (Classic + related utilities)
dotnet remove package Winnovative.HtmlToPdf
# Also remove any of these your project references:
# dotnet remove package Winnovative.PdfMerge
# dotnet remove package Winnovative.PdfSecurity
# dotnet remove package Winnovative.Pdf.Next.Core
# dotnet remove package Winnovative.Client
# Remove Winnovative (Classic + related utilities)
dotnet remove package Winnovative.HtmlToPdf
# Also remove any of these your project references:
# dotnet remove package Winnovative.PdfMerge
# dotnet remove package Winnovative.PdfSecurity
# dotnet remove package Winnovative.Pdf.Next.Core
# dotnet remove package Winnovative.Client
Instale o IronPDF:
# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
Etapa 2: Atualizar Namespaces
Substitua os namespaces Winnovative pelo namespace IronPDF:
// Before (Winnovative)
using Winnovative;
using Winnovative.WebKit;
// After (IronPDF)
using IronPdf;
// Before (Winnovative)
using Winnovative;
using Winnovative.WebKit;
// 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
O caso de uso mais comum demonstra as diferenças de API entre essas bibliotecas PDF for .NET .
Abordagem inovadora da Winnovative:
// NuGet: Install-Package Winnovative.HtmlToPdf
using Winnovative;
using System;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Convert HTML string to PDF
string htmlString = "<html><body><h1>Hello World</h1></body></html>";
byte[] pdfBytes = htmlToPdfConverter.ConvertHtml(htmlString, "");
// Save to file
System.IO.File.WriteAllBytes("output.pdf", pdfBytes);
Console.WriteLine("PDF created successfully");
}
}
// NuGet: Install-Package Winnovative.HtmlToPdf
using Winnovative;
using System;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Convert HTML string to PDF
string htmlString = "<html><body><h1>Hello World</h1></body></html>";
byte[] pdfBytes = htmlToPdfConverter.ConvertHtml(htmlString, "");
// Save to file
System.IO.File.WriteAllBytes("output.pdf", pdfBytes);
Console.WriteLine("PDF created successfully");
}
}
Imports Winnovative
Imports System
Module Program
Sub Main()
' Create the HTML to PDF converter
Dim htmlToPdfConverter As New HtmlToPdfConverter()
' Set license key
htmlToPdfConverter.LicenseKey = "your-license-key"
' Convert HTML string to PDF
Dim htmlString As String = "<html><body><h1>Hello World</h1></body></html>"
Dim pdfBytes As Byte() = htmlToPdfConverter.ConvertHtml(htmlString, "")
' Save to file
System.IO.File.WriteAllBytes("output.pdf", pdfBytes)
Console.WriteLine("PDF created successfully")
End Sub
End Module
Abordagem IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Convert HTML string to PDF
string htmlString = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
// Save to file
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Convert HTML string to PDF
string htmlString = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
// Save to file
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
' Create a PDF renderer
Dim renderer As New ChromePdfRenderer()
' Convert HTML string to PDF
Dim htmlString As String = "<html><body><h1>Hello World</h1></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlString)
' Save to file
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully")
End Sub
End Class
Winnovative requer criar um HtmlToPdfConverter, definir uma chave de licença na instância, chamar ConvertHtml() com um parâmetro de URL base vazio, receber bytes brutos e gravá-los manualmente em um arquivo.IronPDF simplifica isso: crie um ChromePdfRenderer, chame RenderHtmlAsPdf() e use o método embutido SaveAs().
Para cenários avançados de conversão de HTML para PDF, consulte o guia de conversão de HTML para PDF .
Converter URLs em PDF
A conversão de URL para PDF apresenta padrões semelhantes.
Abordagem inovadora da Winnovative:
// NuGet: Install-Package Winnovative.HtmlToPdf
using Winnovative;
using System;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Convert URL to PDF
string url = "https://www.example.com";
byte[] pdfBytes = htmlToPdfConverter.ConvertUrl(url);
// Save to file
System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes);
Console.WriteLine("PDF from URL created successfully");
}
}
// NuGet: Install-Package Winnovative.HtmlToPdf
using Winnovative;
using System;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Convert URL to PDF
string url = "https://www.example.com";
byte[] pdfBytes = htmlToPdfConverter.ConvertUrl(url);
// Save to file
System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes);
Console.WriteLine("PDF from URL created successfully");
}
}
Imports Winnovative
Imports System
Module Program
Sub Main()
' Create the HTML to PDF converter
Dim htmlToPdfConverter As New HtmlToPdfConverter()
' Set license key
htmlToPdfConverter.LicenseKey = "your-license-key"
' Convert URL to PDF
Dim url As String = "https://www.example.com"
Dim pdfBytes As Byte() = htmlToPdfConverter.ConvertUrl(url)
' Save to file
System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes)
Console.WriteLine("PDF from URL created successfully")
End Sub
End Module
Abordagem IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Convert URL to PDF
string url = "https://www.example.com";
var pdf = renderer.RenderUrlAsPdf(url);
// Save to file
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF from URL created successfully");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Convert URL to PDF
string url = "https://www.example.com";
var pdf = renderer.RenderUrlAsPdf(url);
// Save to file
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF from URL created successfully");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
' Create a PDF renderer
Dim renderer As New ChromePdfRenderer()
' Convert URL to PDF
Dim url As String = "https://www.example.com"
Dim pdf = renderer.RenderUrlAsPdf(url)
' Save to file
pdf.SaveAs("webpage.pdf")
Console.WriteLine("PDF from URL created successfully")
End Sub
End Class
Winnovative usa ConvertUrl() retornando bytes que devem ser salvos manualmente.IronPDF fornece RenderUrlAsPdf() com um objeto PdfDocument que inclui SaveAs() para conveniência.
Consulte a documentação sobre URLs para PDF para obter informações sobre autenticação e opções de cabeçalho personalizadas.
Adicionando cabeçalhos e rodapés
Os cabeçalhos e rodapés revelam diferenças arquitetônicas significativas. Winnovative usa uma abordagem de elementos programáticos baseada em objetos TextElement, enquanto IronPDF usa cabeçalhos baseados em HTML com tokens de espaço reservado.
Abordagem inovadora da Winnovative:
// NuGet: Install-Package Winnovative.HtmlToPdf
using Winnovative;
using System;
using System.Drawing;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Enable header
htmlToPdfConverter.PdfDocumentOptions.ShowHeader = true;
htmlToPdfConverter.PdfHeaderOptions.HeaderHeight = 60;
// Add header text
TextElement headerText = new TextElement(0, 0, "Document Header", new Font("Arial", 12));
htmlToPdfConverter.PdfHeaderOptions.AddElement(headerText);
// Enable footer
htmlToPdfConverter.PdfDocumentOptions.ShowFooter = true;
htmlToPdfConverter.PdfFooterOptions.FooterHeight = 60;
// Add footer with page number
TextElement footerText = new TextElement(0, 0, "Page &p; of &P;", new Font("Arial", 10));
htmlToPdfConverter.PdfFooterOptions.AddElement(footerText);
// Convert HTML to PDF
string htmlString = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>";
byte[] pdfBytes = htmlToPdfConverter.ConvertHtml(htmlString, "");
// Save to file
System.IO.File.WriteAllBytes("document.pdf", pdfBytes);
Console.WriteLine("PDF with header and footer created successfully");
}
}
// NuGet: Install-Package Winnovative.HtmlToPdf
using Winnovative;
using System;
using System.Drawing;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Enable header
htmlToPdfConverter.PdfDocumentOptions.ShowHeader = true;
htmlToPdfConverter.PdfHeaderOptions.HeaderHeight = 60;
// Add header text
TextElement headerText = new TextElement(0, 0, "Document Header", new Font("Arial", 12));
htmlToPdfConverter.PdfHeaderOptions.AddElement(headerText);
// Enable footer
htmlToPdfConverter.PdfDocumentOptions.ShowFooter = true;
htmlToPdfConverter.PdfFooterOptions.FooterHeight = 60;
// Add footer with page number
TextElement footerText = new TextElement(0, 0, "Page &p; of &P;", new Font("Arial", 10));
htmlToPdfConverter.PdfFooterOptions.AddElement(footerText);
// Convert HTML to PDF
string htmlString = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>";
byte[] pdfBytes = htmlToPdfConverter.ConvertHtml(htmlString, "");
// Save to file
System.IO.File.WriteAllBytes("document.pdf", pdfBytes);
Console.WriteLine("PDF with header and footer created successfully");
}
}
Imports Winnovative
Imports System
Imports System.Drawing
Module Program
Sub Main()
' Create the HTML to PDF converter
Dim htmlToPdfConverter As New HtmlToPdfConverter()
' Set license key
htmlToPdfConverter.LicenseKey = "your-license-key"
' Enable header
htmlToPdfConverter.PdfDocumentOptions.ShowHeader = True
htmlToPdfConverter.PdfHeaderOptions.HeaderHeight = 60
' Add header text
Dim headerText As New TextElement(0, 0, "Document Header", New Font("Arial", 12))
htmlToPdfConverter.PdfHeaderOptions.AddElement(headerText)
' Enable footer
htmlToPdfConverter.PdfDocumentOptions.ShowFooter = True
htmlToPdfConverter.PdfFooterOptions.FooterHeight = 60
' Add footer with page number
Dim footerText As New TextElement(0, 0, "Page &p; of &P;", New Font("Arial", 10))
htmlToPdfConverter.PdfFooterOptions.AddElement(footerText)
' Convert HTML to PDF
Dim htmlString As String = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>"
Dim pdfBytes As Byte() = htmlToPdfConverter.ConvertHtml(htmlString, "")
' Save to file
System.IO.File.WriteAllBytes("document.pdf", pdfBytes)
Console.WriteLine("PDF with header and footer created successfully")
End Sub
End Module
Abordagem IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Configure header and footer
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Document Header",
FontSize = 12
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page} of {total-pages}",
FontSize = 10
};
// Convert HTML to PDF
string htmlString = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
// Save to file
pdf.SaveAs("document.pdf");
Console.WriteLine("PDF with header and footer created successfully");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Configure header and footer
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Document Header",
FontSize = 12
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page} of {total-pages}",
FontSize = 10
};
// Convert HTML to PDF
string htmlString = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
// Save to file
pdf.SaveAs("document.pdf");
Console.WriteLine("PDF with header and footer created successfully");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System
Module Program
Sub Main()
' Create a PDF renderer
Dim renderer As New ChromePdfRenderer()
' Configure header and footer
renderer.RenderingOptions.TextHeader = New TextHeaderFooter() With {
.CenterText = "Document Header",
.FontSize = 12
}
renderer.RenderingOptions.TextFooter = New TextHeaderFooter() With {
.CenterText = "Page {page} of {total-pages}",
.FontSize = 10
}
' Convert HTML to PDF
Dim htmlString As String = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlString)
' Save to file
pdf.SaveAs("document.pdf")
Console.WriteLine("PDF with header and footer created successfully")
End Sub
End Module
Winnovative requer a habilitação de cabeçalhos/rodapés através de PdfDocumentOptions.ShowHeader, definição de alturas, criação de objetos TextElement com posições de coordenadas e objetos System.Drawing.Font, e uso de espaços reservados &p; e &P;.IronPDF usa objetos TextHeaderFooter com propriedades simples como CenterText e FontSize e espaços reservados intuitivos como {page} e {total-pages}.
Para cabeçalhos baseados em HTML com estilo CSS completo, consulte a documentação de cabeçalhos e rodapés .
Referência de mapeamento da API Winnovative para o IronPDF
Este mapeamento acelera a migração ao mostrar equivalentes diretos da API:
| Classe inovadora Win | Equivalente ao IronPDF |
|---|---|
HtmlToPdfConverter |
ChromePdfRenderer |
PdfDocument |
PdfDocument |
PdfDocumentOptions |
RenderingOptions |
PdfHeaderOptions |
HtmlHeaderFooter |
PdfFooterOptions |
HtmlHeaderFooter |
TextElement |
HTML em HtmlFragment |
ImageElement |
HTML <img> |
Mapeamento de Métodos
| Método Winnovative | Método IronPDF |
|---|---|
ConvertUrl(url) |
RenderUrlAsPdf(url) |
ConvertUrlToFile(url, path) |
RenderUrlAsPdf(url).SaveAs(path) |
ConvertHtml(html, baseUrl) |
RenderHtmlAsPdf(html) |
ConvertHtmlToFile(html, path) |
RenderHtmlAsPdf(html).SaveAs(path) |
ConvertHtmlFile(path) |
RenderHtmlFileAsPdf(path) |
MergePdf(streams) |
PdfDocument.Merge(pdfs) |
AppendPdf(pdf) |
pdf1.AppendPdf(pdf2) |
Mapeamento de opções
| Opção inovadora Win | Opção IronPDF |
|---|---|
PdfPageSize.A4 |
PaperSize = PdfPaperSize.A4 |
PdfPageSize.Letter |
PaperSize = PdfPaperSize.Letter |
PdfPageOrientation.Portrait |
PaperOrientation = PdfPaperOrientation.Portrait |
PdfPageOrientation.Landscape |
PaperOrientation = PdfPaperOrientation.Landscape |
TopMargin = 20 |
MarginTop = 20 |
BottomMargin = 20 |
MarginBottom = 20 |
LeftMargin = 15 |
MarginLeft = 15 |
RightMargin = 15 |
MarginRight = 15 |
ShowHeader = true |
Definir propriedade HtmlHeader |
ShowFooter = true |
Definir propriedade HtmlFooter |
JavaScriptEnabled = true |
EnableJavaScript = true |
Número de página &p; |
Número de página {page} |
Total de páginas &P; |
Total de páginas {total-pages} |
Problemas e soluções comuns em migrações
Problema 1: Os layouts CSS têm aparência diferente
Sintoma: Layouts que pareciam "normais" no Winnovative agora parecem diferentes no IronPDF.
Causa: O motor proprietário mais antigo doWinnovative Classictem peculiaridades de renderização que os desenvolvedores contornaram. O motor Chromium atual do IronPDF renderiza essas corretamente.
Solução: Remova as alterações de CSS específicas da Winnovative e use CSS padrão:
// Clean up legacy CSS
string cleanedHtml = html
.Replace("-webkit-flex", "flex")
.Replace("display: -webkit-box", "display: flex");
// Clean up legacy CSS
string cleanedHtml = html
.Replace("-webkit-flex", "flex")
.Replace("display: -webkit-box", "display: flex");
Dim cleanedHtml As String = html _
.Replace("-webkit-flex", "flex") _
.Replace("display: -webkit-box", "display: flex")
Problema 2: JavaScript não está sendo executado
Sintoma: Conteúdo dinâmico não aparece no PDF.
Causa: É necessário configurar explicitamente as opções de espera do JavaScript .
Solução:
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.JavaScript(5000);
// Or wait for specific element
renderer.RenderingOptions.WaitFor.HtmlElementById("content-ready", 10000);
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.JavaScript(5000);
// Or wait for specific element
renderer.RenderingOptions.WaitFor.HtmlElementById("content-ready", 10000);
Problema 3: URL base não funciona
Sintoma: URLs relativas para imagens e CSS não estão sendo resolvidas.
Causa: O IronPDF requer configuração explícita da URL base.
Solução:
renderer.RenderingOptions.BaseUrl = new Uri("https://example.com/");
renderer.RenderingOptions.BaseUrl = new Uri("https://example.com/");
renderer.RenderingOptions.BaseUrl = New Uri("https://example.com/")
Edição 4: Quebras de página diferentes
Sintoma: Conteúdo apresentando problemas em pontos diferentes dos da Winnovative.
Causa: Diferentes mecanismos de renderização lidam com quebras de página de maneiras diferentes.
Solução: Utilize controles de quebra de página CSS explícitos:
/* Control page breaks explicitly */
.no-break {
page-break-inside: avoid;
}
.page-break-before {
page-break-before: always;
}
.page-break-after {
page-break-after: always;
}
Problema 5: As fontes parecem diferentes
Sintoma: O texto aparece com fontes diferentes das esperadas.
Causa: O IronPDF utiliza fontes do sistema; As fontes da web precisam ser carregadas explicitamente.
Solução:
<style>
@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
body {
font-family: 'Roboto', Arial, sans-serif;
}
</style>
<style>
@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
body {
font-family: 'Roboto', Arial, sans-serif;
}
</style>
Lista de verificação de migração inovadora da Winnovative
Tarefas pré-migração
Faça uma auditoria em sua base de código para identificar todos os usos do Winnovative:
# Find all Winnovative references
grep -r "Winnovative" --include="*.cs" .
grep -r "HtmlToPdfConverter" --include="*.cs" .
grep -r "PdfDocumentOptions" --include="*.cs" .
grep -r "ConvertUrl\|ConvertHtml" --include="*.cs" .
# Find all Winnovative references
grep -r "Winnovative" --include="*.cs" .
grep -r "HtmlToPdfConverter" --include="*.cs" .
grep -r "PdfDocumentOptions" --include="*.cs" .
grep -r "ConvertUrl\|ConvertHtml" --include="*.cs" .
Documente as configurações atuais, incluindo tamanhos de página, margens e configurações de cabeçalho/rodapé. Identificar soluções alternativas de CSS (prefixos do Webkit, grids baseados em floats) que podem ser removidas. Observe os requisitos de compatibilidade com JavaScript .
Tarefas de atualização de código
- Remova os pacotes NuGet da Winnovative.
- Instale o pacote NuGet do IronPDF
- Atualize todas as importações de namespace de
WinnovativeparaIronPdf - Substitua
HtmlToPdfConverterporChromePdfRenderer - Converta chamadas
ConvertHtml()paraRenderHtmlAsPdf() - Converta chamadas
ConvertUrl()paraRenderUrlAsPdf() - Atualize as configurações de tamanho/orientação da página para
RenderingOptions - Converter configurações de margem
- Migre cabeçalhos/rodapés baseados em
TextElementparaTextHeaderFooterbaseados em HTML - Atualize espaços reservados de número de página de
&P;para{total-pages} - 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:
- Teste básico de conversão de HTML para PDF
- Teste de conversão de URL para PDF
- Verificar que layouts CSS Grid renderizam corretamente
- Verificar que layouts Flexbox renderizam corretamente
- Teste páginas com uso intensivo de JavaScript usando a sintaxe moderna ES6+.
- Verificar compatibilidade com Bootstrap 5
- Testar a renderização do cabeçalho/rodapé
- Verificar quebras de página
- Comparar a qualidade de saída do PDF
Tarefas de limpeza
- Remover soluções alternativas de CSS da Winnovative (prefixos webkit)
- Atualizar o JavaScript ES5 para a sintaxe moderna
- Remover alternativas de grade baseadas em ponto flutuante
- Atualizar documentação
Principais benefícios da migração para o IronPDF
A migração do Winnovative para o IronPDF oferece diversas vantagens cruciais:
Mecanismo de renderização moderno: O IronPDF utiliza o mecanismo Chromium atual, garantindo suporte completo a CSS3, CSS Grid, Flexbox e JavaScript ES2024. Frameworks modernos como Bootstrap 5, Tailwind CSS e React/Vue são renderizados corretamente.
API Simplificada: Cabeçalhos e rodapés baseados em HTML substituem o posicionamento programático TextElement. Espaços reservados intuitivos como {page} substituem a sintaxe obscura &p;. Métodos embutidos SaveAs() eliminam o manuseio manual de bytes.
Desenvolvimento Ativo: As atualizações mensais do IronPDF garantem compatibilidade com as versões atuais e futuras do .NET.
CSS moderno sem gambiarras: CSS Grid, Flexbox e tipografia moderna funcionam sem prefixos do WebKit ou alternativas baseadas em float.
JavaScript moderno: os recursos do ES6+, incluindo funções de seta, async/await, classes e módulos, são executados corretamente.

