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:
- CVE-2022-35583 (SSRF): Falsificación de petición del lado del servidor que permite a los atacantes acceder a recursos de red internos
- Proyecto abandonado: wkhtmltopdf lleva sin mantenimiento desde 2020
- Sin parches de seguridad: Las vulnerabilidades conocidas nunca se corregirá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*"Cambios importantes que hay que anticipar
| Cambiar | DinkToPdf | IronPDF | Impacto |
|---|---|---|---|
| Convertidor | <código>SynchronizedConverter(new PdfTools())</código | <código>ChromePdfRenderer</código | Instanciación más sencilla |
| Documento | <código>HtmlToPdfDocument</código | Llamada directa a métodos | Ningún documento objeto |
| Configuración | ConfiguraciónGlobal + ConfiguraciónObjeto | <código>RenderingOptions</código | Objeto de opciones único |
| Tipo de devolución | byte[] | Documento PDF | Objeto más potente |
| Binario | <código>libwkhtmltox.dll/so</código | 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 IronPdfPaso 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.comPaso 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.comReferencia completa de migración de API
Mapeo de clases principales
| DinkToPdf | IronPDF | Notas |
|---|---|---|
ConvertidorSincronizado | <código>ChromePdfRenderer</código | Thread-safe por defecto |
ConvertidorBásico | <código>ChromePdfRenderer</código | Misma clase, más sencillo |
| <código>PdfTools</código | No es necesario | Internalizado |
| <código>HtmlToPdfDocument</código | No es necesario | Llamadas directas a métodos |
| <código>ConfiguraciónGlobal</código | <código>RenderingOptions</código | Parte del renderizador |
| <código>ObjectSettings</código | <código>RenderingOptions</código | Parte del renderizador |
| <código>MarginSettings</código> | 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 | <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 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);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comImplementació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.comIronPDF 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.comImplementació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.comEl 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.comImplementació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.comRenderingOptions 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/nullNo 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.comTipo 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.comCompatibilidad 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.comLista 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.






