Como migrar do DinkToPdf para o IronPDF em C#
O DinkToPdf utiliza o wkhtmltopdf como base, herdando todas as suas vulnerabilidades de segurança e limitações técnicas. Compreender essas questões é fundamental para avaliar a urgência da migração.
Questões críticas de segurança
O DinkToPdf herda vulnerabilidades de segurança críticas e não corrigidas do wkhtmltopdf:
- CVE-2022-35583 (SSRF): Falsificação de solicitação do lado do servidor que permite que invasores acessem recursos de rede internos.
- Projeto abandonado: o wkhtmltopdf não recebe manutenção desde 2020.
- Sem atualizações de segurança: vulnerabilidades conhecidas nunca serão corrigidas.
Problemas técnicos
| Emitir | Impacto |
|---|---|
| Segurança da rosca | O SynchronizedConverter ainda apresenta falhas em produção sob carga simultânea. |
| Binários nativos | Implantação complexa com binários libwkhtmltox específicos da plataforma. |
| Limitações do CSS | Sem suporte para Flexbox, Grid ou CSS moderno. |
| JavaScript | Execução inconsistente, tempos limite excedidos |
| Renderização | Motor WebKit desatualizado (por volta de 2015) |
| Manutenção | Última atualização: 2018 |
Comparação de arquitetura
| Aspecto | DinkToPdf | IronPDF |
|---|---|---|
| Segurança | CVE-2022-35583 (SSRF), sem correção | Nenhuma vulnerabilidade conhecida. |
| Motor de renderização | WebKit desatualizado (2015) | Cromo moderno |
| Segurança da rosca | Falhas em uso simultâneo | Totalmente seguro contra roscas |
| Dependências nativas | binários específicos da plataforma | Pacote NuGet puro |
| Suporte a CSS | Sem Flexbox/Grid | CSS3 completo |
| JavaScript | Limitado, inconsistente | Apoiado |
| Manutenção | Abandonado (2018) | Mantido ativamente |
Comparação de recursos
| Recurso | DinkToPdf | IronPDF |
|---|---|---|
| HTML para PDF | ✅ (motor desatualizado) | ✅ (Cromo) |
| URL para PDF | ✅ | ✅ |
| Margens personalizadas | ✅ | ✅ |
| Cabeçalhos/Rodapés | ✅ (limitado) | ✅ (HTML completo) |
| CSS3 | ❌ Quantidade limitada | ✅ Completo |
| Flexbox/Grid | ❌ | ✅ |
| JavaScript | ⚠️ Quantidade limitada | ✅ Completo |
| Manipulação de PDF | ❌ | ✅ |
| Preenchimento de formulário | ❌ | ✅ |
| Assinaturas digitais | ❌ | ✅ |
| Criptografia | ❌ | ✅ |
| Marcas d'água | ❌ | ✅ |
| Mesclar/Dividir | ❌ | ✅ |
Preparação pré-migratória
Pré-requisitos
Certifique-se de que seu ambiente atenda a estes requisitos:
- .NET Framework 4.6.2 ou superior ou .NET Core 3.1 / .NET 5-9
- Visual Studio 2019 ou superior ou VS Code com extensão C#
- Acesso ao Gerenciador de Pacotes NuGet
- Chave de licença do IronPDF (teste gratuito disponível em IronPDF )
Auditoria de uso do DinkToPdf
Execute estes comandos no diretório da sua solução para identificar todas as referências a DinkToPdf:
# Find all DinkToPdf usages in your codebase
grep -r "using DinkToPdf" --include="*.cs" .
grep -r "SynchronizedConverter\|HtmlToPdfDocument\|ObjectSettings" --include="*.cs" .
# Find NuGet package references
grep -r "DinkToPdf" --include="*.csproj" .
# Find wkhtmltopdf binaries
find . -name "libwkhtmltox*"
# Find all DinkToPdf usages in your codebase
grep -r "using DinkToPdf" --include="*.cs" .
grep -r "SynchronizedConverter\|HtmlToPdfDocument\|ObjectSettings" --include="*.cs" .
# Find NuGet package references
grep -r "DinkToPdf" --include="*.csproj" .
# Find wkhtmltopdf binaries
find . -name "libwkhtmltox*"
Mudanças significativas a serem previstas
| Mudar | DinkToPdf | IronPDF | Impacto |
|---|---|---|---|
| Conversor | SynchronizedConverter(new PdfTools()) |
ChromePdfRenderer |
Instanciação mais simples |
| Documento | HtmlToPdfDocument |
Chamada de método direta | Nenhum objeto de documento |
| Configurações | GlobalSettings + ObjectSettings |
RenderingOptions |
Objeto de opções único |
| Tipo de retorno | byte[] |
PdfDocument |
Objeto mais poderoso |
| Binário | libwkhtmltox.dll/so |
Nenhum (gerenciado) | Remover arquivos nativos |
| Segurança da rosca | SynchronizedConverter obrigatório |
Seguro para threads por padrão | Código mais simples |
| DI | Singleton necessário | Qualquer vida | Flexível |
Processo de migração passo a passo
Passo 1: Atualizar pacotes NuGet
Remova o DinkToPdf e instale o IronPDF:
# Remove DinkToPdf
dotnet remove package DinkToPdf
# Install IronPDF
dotnet add package IronPdf
# Remove DinkToPdf
dotnet remove package DinkToPdf
# Install IronPDF
dotnet add package IronPdf
Etapa 2: Remover binários nativos
Exclua estes arquivos específicos da plataforma do seu projeto:
libwkhtmltox.dll(Windows)libwkhtmltox.so(Linux)libwkhtmltox.dylib(macOS)
O IronPDF não possui dependências nativas — tudo é código gerenciado.
Etapa 3: Atualizar referências de namespace
Substitua os namespaces do DinkToPdf pelo IronPDF:
// Remove these
using DinkToPdf;
using DinkToPdf.Contracts;
// Add this
using IronPdf;
// Remove these
using DinkToPdf;
using DinkToPdf.Contracts;
// Add this
using IronPdf;
Imports IronPdf
Etapa 4: Configurar a licença
// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Referência completa para migração de API
Mapeamento de Classes Principais
| DinkToPdf | IronPDF |
|---|---|
SynchronizedConverter |
ChromePdfRenderer |
BasicConverter |
ChromePdfRenderer |
PdfTools |
Não é necessário |
HtmlToPdfDocument |
Não é necessário |
GlobalSettings |
RenderingOptions |
ObjectSettings |
RenderingOptions |
MarginSettings |
Propriedades de margem individuais |
Mapeamento de configurações globais
| DinkToPdf ConfiguraçõesGlobais | Equivalente ao IronPDF |
|---|---|
ColorMode = ColorMode.Color |
Padrão (sempre colorido) |
Orientation = Orientation.Portrait |
PaperOrientation = PdfPaperOrientation.Portrait |
Orientation = Orientation.Landscape |
PaperOrientation = PdfPaperOrientation.Landscape |
PaperSize = PaperKind.A4 |
PaperSize = PdfPaperSize.A4 |
Margins = new MarginSettings() |
Propriedades de margem individuais |
Mapeamento de configurações de margem
| Margens do DinkToPdf | Equivalente ao IronPDF |
|---|---|
Margins.Top = 10 |
MarginTop = 10 |
Margins.Bottom = 10 |
MarginBottom = 10 |
Margins.Left = 15 |
MarginLeft = 15 |
Margins.Right = 15 |
MarginRight = 15 |
Exemplos de migração de código
HTML básico para PDF
A conversão fundamental demonstra a simplificação drástica da configuração complexa do DinkToPdf para a API simplificada do IronPDF.
Implementação do DinkToPdf:
// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;
class Program
{
static void Main()
{
var converter = new SynchronizedConverter(new PdfTools());
var doc = new HtmlToPdfDocument()
{
GlobalSettings = {
ColorMode = ColorMode.Color,
Orientation = Orientation.Portrait,
PaperSize = PaperKind.A4,
},
Objects = {
new ObjectSettings() {
HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>",
WebSettings = { DefaultEncoding = "utf-8" }
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("output.pdf", pdf);
}
}
// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;
class Program
{
static void Main()
{
var converter = new SynchronizedConverter(new PdfTools());
var doc = new HtmlToPdfDocument()
{
GlobalSettings = {
ColorMode = ColorMode.Color,
Orientation = Orientation.Portrait,
PaperSize = PaperKind.A4,
},
Objects = {
new ObjectSettings() {
HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>",
WebSettings = { DefaultEncoding = "utf-8" }
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("output.pdf", pdf);
}
}
Imports DinkToPdf
Imports DinkToPdf.Contracts
Imports System.IO
Module Program
Sub Main()
Dim converter = New SynchronizedConverter(New PdfTools())
Dim doc = New HtmlToPdfDocument() With {
.GlobalSettings = New GlobalSettings() With {
.ColorMode = ColorMode.Color,
.Orientation = Orientation.Portrait,
.PaperSize = PaperKind.A4
},
.Objects = {
New ObjectSettings() With {
.HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>",
.WebSettings = New WebSettings() With {
.DefaultEncoding = "utf-8"
}
}
}
}
Dim pdf As Byte() = converter.Convert(doc)
File.WriteAllBytes("output.pdf", pdf)
End Sub
End Module
Implementação do IronPDF :
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>");
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>");
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>")
pdf.SaveAs("output.pdf")
End Sub
End Class
O IronPDF reduz uma configuração DinkToPdf de 20 linhas para 4 linhas. Sem SynchronizedConverter, sem PdfTools, sem HtmlToPdfDocument, sem ObjectSettings—apenas renderize e salve. Para mais opções, consulte a documentação de conversão de HTML para PDF .
Conversão de URL para PDF
Implementação do DinkToPdf:
// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;
class Program
{
static void Main()
{
var converter = new SynchronizedConverter(new PdfTools());
var doc = new HtmlToPdfDocument()
{
GlobalSettings = {
ColorMode = ColorMode.Color,
Orientation = Orientation.Portrait,
PaperSize = PaperKind.A4,
},
Objects = {
new ObjectSettings() {
Page = "https://www.example.com",
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("webpage.pdf", pdf);
}
}
// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;
class Program
{
static void Main()
{
var converter = new SynchronizedConverter(new PdfTools());
var doc = new HtmlToPdfDocument()
{
GlobalSettings = {
ColorMode = ColorMode.Color,
Orientation = Orientation.Portrait,
PaperSize = PaperKind.A4,
},
Objects = {
new ObjectSettings() {
Page = "https://www.example.com",
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("webpage.pdf", pdf);
}
}
Imports DinkToPdf
Imports DinkToPdf.Contracts
Imports System.IO
Module Program
Sub Main()
Dim converter = New SynchronizedConverter(New PdfTools())
Dim doc = New HtmlToPdfDocument() With {
.GlobalSettings = New GlobalSettings() With {
.ColorMode = ColorMode.Color,
.Orientation = Orientation.Portrait,
.PaperSize = PaperKind.A4
},
.Objects = New List(Of ObjectSettings) From {
New ObjectSettings() With {
.Page = "https://www.example.com"
}
}
}
Dim pdf As Byte() = converter.Convert(doc)
File.WriteAllBytes("webpage.pdf", pdf)
End Sub
End Module
Implementação do IronPDF :
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End Class
O RenderUrlAsPdf do IronPDF substitui a configuração aninhada ObjectSettings.Page por uma chamada de método direta. Para mais opções, consulte o link para a documentação em PDF .
Configurações personalizadas com orientação paisagem e margens
Implementação do DinkToPdf:
// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;
class Program
{
static void Main()
{
var converter = new SynchronizedConverter(new PdfTools());
var doc = new HtmlToPdfDocument()
{
GlobalSettings = {
ColorMode = ColorMode.Color,
Orientation = Orientation.Landscape,
PaperSize = PaperKind.A4,
Margins = new MarginSettings { Top = 10, Bottom = 10, Left = 15, Right = 15 }
},
Objects = {
new ObjectSettings() {
HtmlContent = "<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>",
WebSettings = { DefaultEncoding = "utf-8" }
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("custom.pdf", pdf);
}
}
// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;
class Program
{
static void Main()
{
var converter = new SynchronizedConverter(new PdfTools());
var doc = new HtmlToPdfDocument()
{
GlobalSettings = {
ColorMode = ColorMode.Color,
Orientation = Orientation.Landscape,
PaperSize = PaperKind.A4,
Margins = new MarginSettings { Top = 10, Bottom = 10, Left = 15, Right = 15 }
},
Objects = {
new ObjectSettings() {
HtmlContent = "<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>",
WebSettings = { DefaultEncoding = "utf-8" }
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("custom.pdf", pdf);
}
}
Imports DinkToPdf
Imports DinkToPdf.Contracts
Imports System.IO
Module Program
Sub Main()
Dim converter = New SynchronizedConverter(New PdfTools())
Dim doc = New HtmlToPdfDocument() With {
.GlobalSettings = New GlobalSettings() With {
.ColorMode = ColorMode.Color,
.Orientation = Orientation.Landscape,
.PaperSize = PaperKind.A4,
.Margins = New MarginSettings() With {
.Top = 10,
.Bottom = 10,
.Left = 15,
.Right = 15
}
},
.Objects = {
New ObjectSettings() With {
.HtmlContent = "<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>",
.WebSettings = New WebSettings() With {
.DefaultEncoding = "utf-8"
}
}
}
}
Dim pdf As Byte() = converter.Convert(doc)
File.WriteAllBytes("custom.pdf", pdf)
End Sub
End Module
Implementação do IronPDF :
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 15;
renderer.RenderingOptions.MarginRight = 15;
var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>");
pdf.SaveAs("custom.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 15;
renderer.RenderingOptions.MarginRight = 15;
var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>");
pdf.SaveAs("custom.pdf");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System
Module Program
Sub Main()
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
renderer.RenderingOptions.MarginTop = 10
renderer.RenderingOptions.MarginBottom = 10
renderer.RenderingOptions.MarginLeft = 15
renderer.RenderingOptions.MarginRight = 15
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>")
pdf.SaveAs("custom.pdf")
End Sub
End Module
O RenderingOptions do IronPDF substitui tanto o GlobalSettings quanto o MarginSettings por uma API unificada e fluente. Para obter mais opções de configuração, consulte a documentação de opções de renderização .
Notas críticas sobre migração
Remover binários nativos
A etapa de limpeza mais importante é a remoção dos binários nativos do wkhtmltopdf. IronPDF não possui dependências nativas:
# Delete native binaries
rm libwkhtmltox.* 2>/dev/null
# Delete native binaries
rm libwkhtmltox.* 2>/dev/null
Não é necessário nenhum singleton.
O SynchronizedConverter do DinkToPdf teve que ser registrado como singleton para evitar travamentos. O ChromePdfRenderer do IronPDF é thread-safe com qualquer tempo de vida de injeção de dependência:
// DinkToPdf - MUST be singleton
services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));
// IronPDF - any lifetime works
services.AddScoped<ChromePdfRenderer>();
// Or just create inline:
var renderer = new ChromePdfRenderer();
// DinkToPdf - MUST be singleton
services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));
// IronPDF - any lifetime works
services.AddScoped<ChromePdfRenderer>();
// Or just create inline:
var renderer = new ChromePdfRenderer();
Tipo de retorno mais rico
DinkToPdf retorna byte[]. IronPDF retorna PdfDocument com capacidades de manipulação:
// DinkToPdf returns byte[]
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("output.pdf", pdf);
return File(pdf, "application/pdf");
// IronPDF returns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
return File(pdf.BinaryData, "application/pdf");
// DinkToPdf returns byte[]
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("output.pdf", pdf);
return File(pdf, "application/pdf");
// IronPDF returns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
return File(pdf.BinaryData, "application/pdf");
Suporte completo a CSS3
Os layouts modernos que não funcionam no DinkToPdf funcionam perfeitamente no IronPDF:
// DinkToPdf - doesn't work (wkhtmltopdf uses 2015 WebKit)
var html = "<div style='display: flex;'>...</div>"; // Broken!
// IronPDF - full support (modern Chromium)
var html = @"
<div style='display: flex; justify-content: space-between;'>
<div>Left</div>
<div>Right</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html); // Works!
// DinkToPdf - doesn't work (wkhtmltopdf uses 2015 WebKit)
var html = "<div style='display: flex;'>...</div>"; // Broken!
// IronPDF - full support (modern Chromium)
var html = @"
<div style='display: flex; justify-content: space-between;'>
<div>Left</div>
<div>Right</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html); // Works!
Lista de verificação pós-migração
Após concluir a migração do código, verifique o seguinte:
- Execute todos os testes unitários para verificar se a geração de PDF funciona corretamente.
- Testar cenários multithread (estes apresentaram falhas com o DinkToPdf)
- Compare a qualidade de saída do PDF (o Chromium do IronPDF oferece melhor renderização)
- Verificar renderização CSS (Flexbox/Grid agora funciona)
- Teste a execução do JavaScript (confiável com o IronPDF)
- Atualizar os pipelines de CI/CD para remover a instalação do wkhtmltopdf
- Verificar se a verificação de segurança foi aprovada (sem mais sinalizadores CVE-2022-35583)
- Remover a implantação de binários nativos dos scripts Docker/deployment
Preparando sua infraestrutura de PDF para o futuro
Com o .NET 10 no horizonte e o C# 14 introduzindo novos recursos de linguagem, escolher uma biblioteca PDF que seja ativamente mantida garante compatibilidade a longo prazo. O moderno mecanismo Chromium do IronPDF recebe atualizações regulares, enquanto o wkhtmltopdf, abandonado pelo DinkToPdf, permanece estagnado nas funcionalidades de 2015 — uma lacuna crescente que só aumentará à medida que os padrões da web evoluírem até 2025 e 2026.
Recursos adicionais
- Documentação do IronPDF
- Tutoriais de HTML para PDF
- Referência da API
- Pacote NuGet
- Opções de licenciamento
A migração do DinkToPdf para o IronPDF elimina vulnerabilidades críticas de segurança (CVE-2022-35583), falhas relacionadas à segurança de threads, complexidade na implantação de binários nativos e renderização CSS desatualizada. A transição para um mecanismo Chromium moderno oferece suporte completo ao CSS3, execução confiável de JavaScript e a tranquilidade de contar com uma biblioteca que recebe manutenção ativa.

