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

Cómo migrar de DinkToPdf a IronPDF en C#

Migrar de DinkToPdfa IronPDF: Guía completa de migración a C

DinkToPdf es un popular envoltorio .NET de código abierto alrededor de wkhtmltopdf que permite la conversión de HTML a PDF. Sin embargo, el proyecto wkhtmltopdf subyacente fue abandonado en 2020, dejando vulnerabilidades de seguridad críticas sin parchear, incluyendo CVE-2022-35583 (Server-Side Request Forgery). DinkToPdfpresenta riesgos significativos para las aplicaciones de producción, combinados con problemas de seguridad de hilos que provocan bloqueos en la producción y un motor de renderizado WebKit obsoleto que no admite CSS moderno. Esta completa guía proporciona una ruta de migración paso a paso de DinkToPdfa IronPDF, una biblioteca PDF .NET segura para subprocesos con renderizado Chromium moderno y sin dependencias binarias nativas.

¿Por qué migrar de DinkToPdfa IronPDF?

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 petición del lado del servidor que permite a los atacantes acceder a recursos de red internos
  2. Proyecto abandonado: wkhtmltopdf lleva sin mantenimiento desde 2020
  3. Sin parches de seguridad: Las vulnerabilidades conocidas nunca se corregirán

Problemas técnicos

ProblemaImpacto
Seguridad de hilosSynchronizedConverter sigue fallando en producción bajo carga concurrente
Binarios nativosDespliegue complejo con binarios libwkhtmltox específicos de la plataforma
Limitaciones de CSSNo es compatible con Flexbox, Grid ni CSS moderno
JavaScriptEjecución incoherente, tiempos de espera
TraducciónMotor WebKit obsoleto (circa 2015)
MantenimientoÚltima actualización: 2018

Comparación de arquitecturas

AspectoDinkToPdfIronPDF
SeguridadCVE-2022-35583 (SSRF), sin parchesNo se conocen vulnerabilidades
Motor de renderizadoWebKit desactualizado (2015)Chromium moderno
Seguridad de hilosFallos en el uso concurrenteTotalmente a prueba de hilos
Dependencias nativasBinarios específicos de la plataformaPaquete NuGet puro
Soporte CSSSin Flexbox/GridCSS3completo
JavaScriptLimitada e incoherenteSoporte completo
MantenimientoAbandonado (2018)Mantenimiento activo

Comparación de características

CaracterísticaDinkToPdfIronPDF
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

CambiarDinkToPdfIronPDFImpacto
Convertidor<código>SynchronizedConverter(new PdfTools())</código<código>ChromePdfRenderer</códigoInstanciación más sencilla
Documento<código>HtmlToPdfDocument</códigoLlamada directa a métodosNingún documento objeto
ConfiguraciónConfiguraciónGlobal + ConfiguraciónObjeto<código>RenderingOptions</códigoObjeto de opciones único
Tipo de devoluciónbyte[]Documento PDFObjeto más potente
Binario<código>libwkhtmltox.dll/so</códigoNinguno (gestionado)Eliminar archivos nativos
Seguridad de los hilosConvertidorSincronizadonecesarioThread-safe por defectoCódigo más sencillo
DISe requiere SingletonDe por vidaFlexible

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;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Referencia completa de migración de API

Mapeo de clases principales

DinkToPdfIronPDFNotas
ConvertidorSincronizado<código>ChromePdfRenderer</códigoThread-safe por defecto
ConvertidorBásico<código>ChromePdfRenderer</códigoMisma clase, más sencillo
<código>PdfTools</códigoNo es necesarioInternalizado
<código>HtmlToPdfDocument</códigoNo es necesarioLlamadas directas a métodos
<código>ConfiguraciónGlobal</código<código>RenderingOptions</códigoParte del renderizador
<código>ObjectSettings</código<código>RenderingOptions</códigoParte del renderizador
<código>MarginSettings</código>Propiedades de los márgenes individualesMarginTop, MarginBottom, etc.

Mapeo de GlobalSettings

Configuración global de DinkToPdfEquivalente de IronPDF
ColorMode = ColorMode.ColorPor defecto (siempre en color)
Orientación = Orientación.VerticalOrientación del papel = PdfPaperOrientation.Portrait
Orientación = Orientación.HorizontalOrientación del papel = PdfPaperOrientation.Landscape
<código>TamañoPapel = TipoPapel.A4</código<código>TamañoPapel = PdfPaperSize.A4</código
<código>Margins = new MarginSettings()</código>Propiedades de los márgenes individuales

Mapeo de MarginSettings

Márgenes de DinkToPdfEquivalente de IronPDF
Margins.Top = 10MargenTop = 10
Margins.Bottom = 10MargenInferior = 10
Margins.Left = 15MargenIzquierdo = 15
Margins.Right = 15MargenDerecho = 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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

RenderingOptions deIronPDFsustituye a <código>ConfiguraciónGlobal</códigoy <código>MarginSettings</código>con 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</códigodeIronPDFes 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();
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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!
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Lista de comprobación posterior a la migración

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

  • [ ] Ejecutar todas las pruebas unitarias para verificar que la generación de PDF funciona correctamente
  • [ ] Probar escenarios multihilo (estos se bloquearon con DinkToPdf)
  • [ ] Comparar la calidad de salida de PDF (Chromium deIronPDFrenderiza mejor)
  • [ ] Verificar el renderizado CSS (Flexbox/Grid ahora funciona)
  • [ ] Prueba de ejecución de JavaScript(fiable con IronPDF)
  • [Actualizar los procesos CI/CD para eliminar la instalación de wkhtmltopdf
  • [ ] Comprobar que el análisis de seguridad ha pasado (no más indicadores CVE-2022-35583)
  • [ ] Eliminar el despliegue binario nativo de los scripts Docker/deployment

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