Saltar al pie de página
GUíAS DE MIGRACIóN

Cómo migrar de DinkToPdf a IronPDF en C#

DinkToPdf envuelve wkhtmltopdf, heredando todas sus vulnerabilidades de seguridad y limitaciones técnicas. Comprender estas cuestiones es fundamental para evaluar la urgencia de la migración.

Cuestiones críticas de seguridad

DinkToPdf hereda vulnerabilidades de seguridad críticas sin parchear de wkhtmltopdf:

  1. CVE-2022-35583 (SSRF): Falsificación de solicitud del lado del servidor que permite a los atacantes acceder a recursos de red internos.
  2. Proyecto abandonado: wkhtmltopdf no ha recibido mantenimiento desde 2020.
  3. Sin parches de seguridad: Las vulnerabilidades conocidas nunca se solucionarán.

Problemas técnicos

Problema Impacto
Seguridad de hilos SynchronizedConverter sigue fallando en producción bajo carga concurrente
Binarios nativos Despliegue complejo con binarios libwkhtmltox específicos de la plataforma
Limitaciones de CSS No es compatible con Flexbox, Grid ni CSS moderno
JavaScript Ejecución incoherente, tiempos de espera
Traducción Motor WebKit obsoleto (circa 2015)
Mantenimiento Última actualización: 2018

Comparación de arquitecturas

Aspecto DinkToPdf IronPDF
Seguridad CVE-2022-35583 (SSRF), sin parches No se conocen vulnerabilidades
Motor de renderizado WebKit desactualizado (2015) Chromium moderno
Seguridad de hilos Fallos en el uso concurrente Totalmente a prueba de hilos
Dependencias nativas Binarios específicos de la plataforma Paquete NuGet puro
Soporte CSS Sin Flexbox/Grid CSS3completo
JavaScript Limitada e incoherente Soporte completo
Mantenimiento Abandonado (2018) Mantenimiento activo

Comparación de características

Característica DinkToPdf IronPDF
HTML a PDF ✅(motor obsoleto) ✅(Cromo)
URL a PDF
Márgenes personalizados
Encabezados/pies de página ✅(limitado) ✅(HTML completo)
CSS3 ❌Limitada ✅Completo
Flexbox/Grid
JavaScript ⚠️ Limitada ✅Completo
Manipulación de PDF
Relleno de formularios
Firmas digitales
Cifrado
Marcas de agua
Fusionar/Dividir

Preparación de la migración

Prerrequisitos

Asegúrese de que su entorno cumple estos requisitos:

  • .NET Framework 4.6.2+ o .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ o VS Code con extensión de C#
  • Acceso al gestor de paquetes NuGet
  • Clave de licencia deIronPDF(prueba gratuita disponible en ironpdf.com)

Aprobar el uso de DinkToPdf

Ejecute estos comandos en su directorio de soluciones para identificar todas las referencias a DinkToPdf:

# Find all DinkToPdfusages 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 DinkToPdfusages 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*"
SHELL

Cambios importantes que hay que anticipar

Cambiar DinkToPdf IronPDF Impacto
Convertidor <código>SynchronizedConverter(new PdfTools())` <código>ChromePdfRenderer Instanciación más sencilla
Documento <código>HtmlToPdfDocument Llamada directa a métodos Ningún documento objeto
Configuración ConfiguraciónGlobal + ConfiguraciónObjeto <código>RenderingOptions` Objeto de opciones único
Tipo de devolución byte[] Documento PDF Objeto más potente
Binario <código>libwkhtmltox.dll/so` Ninguno (gestionado) Eliminar archivos nativos
Seguridad de los hilos ConvertidorSincronizadonecesario Thread-safe por defecto Código más sencillo
DI Se requiere Singleton De por vida Flexible

Proceso de migración paso a paso

Paso 1: Actualizar paquetes NuGet

Elimine DinkToPdfe instale 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
SHELL

Paso 2: Eliminar binarios nativos

Elimine estos archivos específicos de la plataforma de su proyecto:

  • libwkhtmltox.dll (Windows)
  • libwkhtmltox.so (Linux)
  • libwkhtmltox.dylib (MacOS)

IronPDF no tiene dependencias nativas: todo es código gestionado.

Paso 3: Actualizar referencias de espacios de nombres

Sustituya los espacios de nombres de DinkToPdfpor IronPDF:

// Remove these
using DinkToPdf;
using DinkToPdf.Contracts;

// Add this
using IronPdf;
// Remove these
using DinkToPdf;
using DinkToPdf.Contracts;

// Add this
using IronPdf;
$vbLabelText   $csharpLabel

Paso 4: Configurar la licencia

// 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";
$vbLabelText   $csharpLabel

Referencia completa de migración de API

Mapeo de clases principales

DinkToPdf IronPDF Notas
ConvertidorSincronizado <código>ChromePdfRenderer` Thread-safe por defecto
ConvertidorBásico <código>ChromePdfRenderer` Misma clase, más sencillo
<código>PdfTools No es necesario Internalizado
<código>HtmlToPdfDocument No es necesario Llamadas directas a métodos
<código>ConfiguraciónGlobal <código>RenderingOptions Parte del renderizador
<código>ObjectSettings <código>RenderingOptions Parte del renderizador
<código>MarginSettings Propiedades de los márgenes individuales MarginTop, MarginBottom, etc.

Mapeo de GlobalSettings

Configuración global de DinkToPdf Equivalente de IronPDF
ColorMode = ColorMode.Color Por defecto (siempre en color)
Orientación = Orientación.Vertical Orientación del papel = PdfPaperOrientation.Portrait
Orientación = Orientación.Horizontal Orientación del papel = PdfPaperOrientation.Landscape
<código>TamañoPapel = TipoPapel.A4` <código>TamañoPapel = PdfPaperSize.A4
<código>Margins = new MarginSettings() Propiedades de los márgenes individuales

Mapeo de MarginSettings

Márgenes de DinkToPdf Equivalente de IronPDF
Margins.Top = 10 MargenTop = 10
Margins.Bottom = 10 MargenInferior = 10
Margins.Left = 15 MargenIzquierdo = 15
Margins.Right = 15 MargenDerecho = 15

Ejemplos de migración de código

HTML básico a PDF

La conversión fundamental demuestra la drástica simplificación de la configuración verbosa de DinkToPdfa la API racionalizada de IronPDF.

Implementación de 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);
    }
}
$vbLabelText   $csharpLabel

Implementación de 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");
    }
}
$vbLabelText   $csharpLabel

IronPDF reduce una configuración de DinkToPdfde 20 líneas a 4 líneas. Nada de SynchronizedConverter, nada de PdfTools, nada de HtmlToPdfDocument, nada de ObjectSettings, sólo renderizar y guardar. Para más opciones, consulte la documentación HTML a PDF.

Conversión de URL a PDF

Implementación de 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);
    }
}
$vbLabelText   $csharpLabel

Implementación de 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");
    }
}
$vbLabelText   $csharpLabel

El RenderUrlAsPdf deIronPDFsustituye la configuración anidada ObjectSettings.Page por una llamada directa a un método. Para obtener más opciones, consulte URL a la documentación en PDF.

Configuración personalizada con apaisado y márgenes

Implementación de 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);
    }
}
$vbLabelText   $csharpLabel

Implementación de 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");
    }
}
$vbLabelText   $csharpLabel

RenderingOptions deIronPDFsustituye a <código>ConfiguraciónGlobal`y <código>MarginSettingscon una API unificada y fluida. Para más opciones de configuración, consulte la documentación sobre opciones de renderización.

Notas de migración críticas

Quitar binarios nativos

El paso de limpieza más importante es eliminar los binarios nativos de wkhtmltopdf.IronPDFno tiene dependencias nativas:

# Delete native binaries
rm libwkhtmltox.* 2>/dev/null
# Delete native binaries
rm libwkhtmltox.* 2>/dev/null
SHELL

No se requiere Singleton

El ConvertidorSincronizadode DinkToPdfdebía registrarse como singleton para evitar fallos. El <código>ChromePdfRenderer`deIronPDFes seguro con cualquier tiempo de vida DI:

// 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();
$vbLabelText   $csharpLabel

Tipo de retorno más rico

DinkToPdf devuelve byte[].IronPDFdevuelve Documento PDFcon capacidades de manipulación:

// DinkToPdfreturns byte[]
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("output.pdf", pdf);
return File(pdf, "application/pdf");

//IronPDFreturns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
return File(pdf.BinaryData, "application/pdf");
// DinkToPdfreturns byte[]
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("output.pdf", pdf);
return File(pdf, "application/pdf");

//IronPDFreturns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
return File(pdf.BinaryData, "application/pdf");
$vbLabelText   $csharpLabel

Compatibilidad total con CSS3

Los diseños modernos que fallan en DinkToPdffuncionan perfectamente en 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!
$vbLabelText   $csharpLabel

Lista de comprobación posterior a la migración

Después de completar la migración del código, verifique lo siguiente:

  • Ejecute todas las pruebas unitarias para verificar que la generación de PDF funcione correctamente
  • Pruebe escenarios multiproceso (estos fallaron con DinkToPdf)
  • Comparar la calidad de salida del PDF (Chromium deIronPDFse reproduce mejor)
  • Verificar la representación CSS (Flexbox/Grid ahora funciona)
  • Pruebe la ejecución de JavaScript(confiable con IronPDF)
  • Actualizar las canalizaciones CI/CD para eliminar la instalación de wkhtmltopdf
  • Verificar los pases de escaneo de seguridad (no más indicadores CVE-2022-35583)
  • Eliminar la implementación binaria nativa de los scripts de implementación/Docker

Proteja su infraestructura PDF

Con .NET 10 en el horizonte y C# 14 introduciendo nuevas características del lenguaje, elegir una biblioteca PDF que se mantenga activamente garantiza la compatibilidad a largo plazo. El moderno motor Chromium deIronPDFrecibe actualizaciones periódicas, mientras que el abandonado wkhtmltopdf de DinkToPdfpermanece congelado en las capacidades de 2015, una brecha cada vez mayor que no hará sino aumentar a medida que los estándares web evolucionen hasta 2025 y 2026.

Recursos adicionales


La migración de DinkToPdfaIronPDFelimina vulnerabilidades críticas de seguridad (CVE-2022-35583), fallos de seguridad de hilos, complejidad de despliegue de binarios nativos y renderizado CSS obsoleto. La transición a un motor Chromium moderno ofrece compatibilidad total con CSS3, ejecución fiable de JavaScripty la tranquilidad de saber que se trata de una biblioteca con un mantenimiento activo.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más