Migración de Haukcode.DinkToPdf a IronPDF
Haukcode.DinkToPdf es una continuación de la otrora popular biblioteca DinkToPdf, que utiliza el binario wkhtmltopdf para convertir HTML a PDF para aplicaciones .NET. Aunque Haukcode.DinkToPdf se mantuvo al día con .NET Core después de que el proyecto original se estancó, conlleva importantes problemas de seguridad debido a su dependencia ascendente. El proyecto wkhtmltopdf se archivó en enero de 2023, por lo que estos problemas nunca se resolverán.
Esta guía ofrece una ruta de migración completa de Haukcode.DinkToPdf a IronPDF, que incluye instrucciones paso a paso, comparaciones de código y ejemplos prácticos para desarrolladores profesionales de .NET que buscan eliminar los riesgos de seguridad de sus flujos de trabajo de generación de PDF.
Alerta de seguridad crítica: CVE-2022-35583
Haukcode.DinkToPdf hereda una importante vulnerabilidad de seguridad de wkhtmltopdf que no se puede solucionar:
CVE-2022-35583 - Vulnerabilidad SSRF crítica (CVSS 9.8)
La biblioteca wkhtmltopdf (y todos sus envoltorios, incluido Haukcode.DinkToPdf) es vulnerable a la falsificación de peticiones del lado del servidor (SSRF):
- Vector de ataque: El contenido HTML malicioso puede hacer que el servidor obtenga recursos internos
- Ataque de metadatos de AWS: puede acceder
http://169.254.169.254para robar credenciales de AWS - Acceso a la red interna: Puede escanear y acceder a servicios internos
- Inclusión de archivos locales: puede leer archivos locales a través del protocolo
file:// - Impacto: Posible adquisición completa de la infraestructura
NO hay solución para esta vulnerabilidad porque wkhtmltopdf fue abandonado y archivado en 2023. La última versión fue la 0.12.6 en 2020.
IronPDFfrente a Haukcode.DinkToPdf: Comparación de características
Comprender las diferencias arquitectónicas ayuda a los responsables técnicos a evaluar la inversión en migración:
| Aspecto | Haukcode.DinkToPdf | IronPDF |
|---|---|---|
| Motor subyacente | wkhtmltopdf (Qt WebKit ~2015) | Chromium (actualizado regularmente) |
| Estado de seguridad | CVE-2022-35583 (CRÍTICO, no corregible) | Parcheado activamente |
| Estado del proyecto | Bifurcación de proyecto abandonado | Desarrollado activamente |
| HTML5/CSS3 | Limitado | Soporte completo |
| JavaScript | Limitado, inseguro | Motor V8 completo |
| Binarios nativos | Requisitos (específicos de la plataforma) | Autocontenido |
| Seguridad de hilos | Requiere el patrón singleton | Thread-safe por diseño |
| Soporte | Sólo para la comunidad | Asistencia profesional |
| Actualizaciones | No se espera ninguno | Publicaciones periódicas |
| Licencia | MIT (gratuito) | Comercial con prueba gratuita |
Inicio rápido: Migración de Haukcode.DinkToPdf a IronPDF
La migración puede comenzar inmediatamente con estos pasos básicos.
Paso 1: Eliminar DinkToPdf y los binarios nativos
Elimine los paquetes NuGet de Haukcode.DinkToPdf:
# Remove NuGet packages
dotnet remove package DinkToPdf
dotnet remove package Haukcode.DinkToPdf
dotnet remove package Haukcode.WkHtmlToPdf-DotNet# Remove NuGet packages
dotnet remove package DinkToPdf
dotnet remove package Haukcode.DinkToPdf
dotnet remove package Haukcode.WkHtmlToPdf-DotNetEliminar binarios nativos de su proyecto:
libwkhtmltox.dll(Windows)libwkhtmltox.so(Linux)libwkhtmltox.dylib(MacOS)
Paso 2: Instalar IronPDF
# Install IronPDF
dotnet add package IronPdf# Install IronPDF
dotnet add package IronPdfPaso 3: Actualizar los espacios de nombres
Sustituya los espacios de nombres de DinkToPdf por IronPdf:
// Before (Haukcode.DinkToPdf)
using DinkToPdf;
using DinkToPdf.Contracts;
// After (IronPDF)
using IronPdf;
using IronPdf.Rendering; // For RenderingOptions// Before (Haukcode.DinkToPdf)
using DinkToPdf;
using DinkToPdf.Contracts;
// After (IronPDF)
using IronPdf;
using IronPdf.Rendering; // For RenderingOptionsPaso 4: Inicializar licencia
Añadir inicialización de licencia al inicio de la aplicación:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";Ejemplos de migración de código
Conversión básica de HTML a PDF
La operación más fundamental revela la diferencia de complejidad entre estas bibliotecas PDF .NET.
Enfoque de Haukcode.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 = "<html><body><h1>Hello World</h1></body></html>",
}
}
};
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 = "<html><body><h1>Hello World</h1></body></html>",
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("output.pdf", pdf);
}
}Enfoque IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>");
pdf.SaveAs("output.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>");
pdf.SaveAs("output.pdf");
}
}Haukcode.DinkToPdf requiere crear un ConvertidorSincronizadocon PdfTools, construir un <código>HtmlToPdfDocument</códigocon <código>ConfiguraciónGlobal</códigoy Objects anidados, añadir un <código>ObjectSettings</códigocon HtmlContent, llamar a converter.Convert() para obtener bytes sin procesar, y escribiendo manualmente en un archivo con File.WriteAllBytes().
IronPDF simplifica esto a tres líneas: crear un ChromePdfRenderer, llamar a RenderHtmlAsPdf(), y utilizar el método incorporado SaveAs().
Para situaciones avanzadas de conversión de HTML a PDF, consulte la Guía de conversión de HTML a PDF.
Convertir URL en PDF
La conversión de URL a PDF muestra diferencias de patrón similares.
Enfoque de Haukcode.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);
}
}Enfoque 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");
}
}Haukcode.DinkToPdf utiliza el mismo patrón de construcción de documentos con ObjectSettings.Page para las URL.IronPDFproporciona un método RenderUrlAsPdf() dedicado que expresa claramente la intención.
Explore la URL a la documentación PDF para conocer las opciones de autenticación y encabezado personalizado.
Configuración de páginas personalizadas
La configuración de la orientación, el tamaño del papel y los márgenes requiere distintos enfoques.
Enfoque de Haukcode.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.Letter,
Margins = new MarginSettings() { Top = 10, Bottom = 10, Left = 10, Right = 10 }
},
Objects = {
new ObjectSettings() {
HtmlContent = "<html><body><h1>Landscape Document</h1><p>Custom page settings</p></body></html>",
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("landscape.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.Letter,
Margins = new MarginSettings() { Top = 10, Bottom = 10, Left = 10, Right = 10 }
},
Objects = {
new ObjectSettings() {
HtmlContent = "<html><body><h1>Landscape Document</h1><p>Custom page settings</p></body></html>",
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("landscape.pdf", pdf);
}
}Enfoque IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Landscape Document</h1><p>Custom page settings</p></body></html>");
pdf.SaveAs("landscape.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Landscape Document</h1><p>Custom page settings</p></body></html>");
pdf.SaveAs("landscape.pdf");
}
}Haukcode.DinkToPdf anida ajustes dentro de <código>ConfiguraciónGlobal</códigocon un objeto MarginSettings separado.IronPDFproporciona propiedades <código>RenderingOptions</códigodirectas con nombres claros como PaperSize, PaperOrientation y propiedades de márgenes individuales.
Referencia de la API de Haukcode.DinkToPdf a IronPDF
Este mapeo acelera la migración al mostrar los equivalentes directos de las API:
Mapeo de clases conversoras
| Haukcode.DinkToPdf | IronPDF | Notas |
|---|---|---|
ConvertidorSincronizado | <código>ChromePdfRenderer</código | Thread-safe, no requiere singleton |
ConvertidorBásico | <código>ChromePdfRenderer</código | La misma clase se encarga de |
| <código>PdfTools</código | N/A | No es necesario |
IConvertidor | N/A | Utilizar directamente el renderizador |
Mapeo de configuración de documentos
| Haukcode.DinkToPdf | IronPDF | Notas |
|---|---|---|
| <código>HtmlToPdfDocument</código | Llamada al método | Utilice RenderHtmlAsPdf() directamente |
| <código>ConfiguraciónGlobal</código | <código>RenderingOptions</código | Ajustar antes de renderizar |
| <código>ObjectSettings</código | <código>RenderingOptions</código | Todo en uno |
converter.Convert(doc) | renderer.RenderHtmlAsPdf(html) | Devuelve PdfDocument |
Mapeo de propiedades de GlobalSettings
| Propiedad GlobalSettings | Propiedad de IronPDF | Notas |
|---|---|---|
| <código>ColorMode</código | <código>RenderingOptions.GrayScale</código | Booleano, establecer true para escala de grises |
Orientación | <código>RenderingOptions.PaperOrientation</código | <código>Retrato</código> o <código>Paisaje</código> |
| <código>TamañoDePapel</código | <código>RenderingOptions.PaperSize</código | Utilizar el enum PdfPaperSize |
Margenes.Top | <código>RenderingOptions.MarginTop</código | En milímetros |
Margenes.Inferior | <código>RenderingOptions.MarginBottom</código | En milímetros |
Margenes.Izquierda | <código>RenderingOptions.MarginLeft</código | En milímetros |
Margenes.Derecha | <código>RenderingOptions.MarginRight</código | En milímetros |
Mapeo de propiedades de ObjectSettings
| Propiedad ObjectSettings | Equivalente de IronPDF | Notas |
|---|---|---|
| <código>ContenidoHtml</código | Primer parámetro de RenderHtmlAsPdf() | Parámetro directo |
Página (URL) | <código>renderer.RenderUrlAsPdf(url)</código | Método separado |
HeaderSettings.Right = "[página]" | TextHeader.RightText = "{page}" | Diferentes sintaxis de marcadores de posición |
Migración de la sintaxis de los marcadores
| Haukcode.DinkToPdf | IronPDF | Notas |
|---|---|---|
| <código>[página]</código> | {page} | Número de página actual |
[toPage] | {total de páginas} | Número total de páginas |
| <código>[fecha]</código> | {fecha} | Fecha actual |
Problemas comunes de migración y soluciones
Número 1: Requisito Singleton
Haukcode.DinkToPdf: Requiere ConvertidorSincronizadocomo singleton debido a problemas de seguridad de hilos con el binario nativo wkhtmltopdf.
Solución: El <código>ChromePdfRenderer</códigodeIronPDFes seguro para subprocesos por diseño, no requiere singleton:
// Before (DinkToPdf) - MUST be singleton
services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));
// After (IronPDF) - Can be singleton or transient (both work)
services.AddSingleton<IPdfService, IronPdfService>();
// Or services.AddTransient<IPdfService, IronPdfService>() - both are safe!// Before (DinkToPdf) - MUST be singleton
services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));
// After (IronPDF) - Can be singleton or transient (both work)
services.AddSingleton<IPdfService, IronPdfService>();
// Or services.AddTransient<IPdfService, IronPdfService>() - both are safe!Número 2: Dependencias binarias nativas
Haukcode.DinkToPdf: Requiere bibliotecas nativas específicas de la plataforma (libwkhtmltox.dll/so/dylib).
Solución:IronPDFes autónomo y no tiene dependencias binarias nativas. Elimine estos archivos después de la migración:
libwkhtmltox.dll(Windows)libwkhtmltox.so(Linux)libwkhtmltox.dylib(MacOS)
Tema 3: Diferencias en los tipos de retorno
Haukcode.DinkToPdf: converter.Convert() devuelve byte[] directamente.
Solución:IronPDFdevuelve un objeto PdfDocument con múltiples opciones de salida:
var pdf = renderer.RenderHtmlAsPdf(html);
byte[] bytes = pdf.BinaryData; // Get bytes
pdf.SaveAs("output.pdf"); // Or save directlyvar pdf = renderer.RenderHtmlAsPdf(html);
byte[] bytes = pdf.BinaryData; // Get bytes
pdf.SaveAs("output.pdf"); // Or save directlyEdición 4: Sintaxis de marcador de posición de encabezado/pie
Haukcode.DinkToPdf: Utiliza sintaxis de corchetes como <código>[página]</código>y [toPage].
Solución: Actualización de los marcadores de posición de llaves de IronPDF:
// Before (DinkToPdf)
HeaderSettings = { Right = "Page [page] of [toPage]" }
// After (IronPDF)
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
RightText = "Page {page} of {total-pages}"
};// Before (DinkToPdf)
HeaderSettings = { Right = "Page [page] of [toPage]" }
// After (IronPDF)
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
RightText = "Page {page} of {total-pages}"
};Lista de migración de Haukcode.DinkToPdf
Tareas previas a la migración
Audite su código base para identificar todos los usos de DinkToPdf:
# Find DinkToPdf namespace usage
grep -r "using DinkToPdf\|using Haukcode" --include="*.cs" .
# Find converter usage
grep -r "SynchronizedConverter\|BasicConverter\|HtmlToPdfDocument" --include="*.cs" .
# Find native library loading
grep -r "wkhtmltopdf\|libwkhtmltox" --include="*.cs" --include="*.csproj" .
# Find GlobalSettings/ObjectSettings usage
grep -r "GlobalSettings\|ObjectSettings\|MarginSettings" --include="*.cs" .# Find DinkToPdf namespace usage
grep -r "using DinkToPdf\|using Haukcode" --include="*.cs" .
# Find converter usage
grep -r "SynchronizedConverter\|BasicConverter\|HtmlToPdfDocument" --include="*.cs" .
# Find native library loading
grep -r "wkhtmltopdf\|libwkhtmltox" --include="*.cs" --include="*.csproj" .
# Find GlobalSettings/ObjectSettings usage
grep -r "GlobalSettings\|ObjectSettings\|MarginSettings" --include="*.cs" .Documentar las configuraciones actuales de <código>ConfiguraciónGlobal</códigoy ObjectSettings. Identifique cualquier código de carga de biblioteca nativa que pueda eliminarse.
Tareas de actualización de código
- Eliminar paquetes NuGet de DinkToPdf
- Instalación del paquete IronPdf NuGet
- Actualizar las importaciones de espacios de nombres de
DinkToPdfaIronPdf - Sustituya
ConvertidorSincronizadoporChromePdfRenderer - Convertir patrones <código>HtmlToPdfDocument</códigoen llamadas directas a métodos
- Convertir <código>ConfiguraciónGlobal</códigoa
RenderingOptions - Convertir <código>ObjectSettings</códigoa
RenderingOptions - Actualizar la sintaxis de los marcadores de posición (
[page]→{page},[toPage]→{total-pages}) - Añadir la inicialización de la licenciaIronPDFal inicio
Tareas de limpieza de infraestructuras
- Eliminar binarios nativos (libwkhtmltox.*)
- Eliminar el código de carga de la biblioteca nativa
- Eliminar CustomAssemblyLoadContext si está presente
- Actualización de la inyección de dependencias (ya no se requiere singleton)
- Eliminar el código de detección de plataformas para los binarios nativos
Pruebas posteriores a la migración
Tras la migración, verifique estos aspectos:
- Prueba de conversión de HTML a PDF
- Prueba de conversión de URL a PDF
- Verificar la configuración de la página (tamaño, orientación, márgenes)
- Verificación de encabezados y pies de página con marcadores de posición
- Prueba con plantillas HTML reales
- Prueba de rendimiento bajo carga
Beneficios clave de migrar a IronPDF
Pasar de Haukcode.DinkToPdf aIronPDFofrece varias ventajas fundamentales:
Seguridad: elimina CVE-2022-35583 (SSRF) y otras vulnerabilidades de wkhtmltopdf que nunca serán parcheadas.
Motor de renderizado moderno: utiliza Chromium actualizado activamente en lugar del abandonado Qt WebKit de 2015. Compatibilidad total con HTML5, CSS3 y JavaScript.
Sin binarios nativos: biblioteca autónoma sin DLL específicos de la plataforma para administrar. Simplifica la implementación en Windows, Linux y macOS.
Seguridad de subprocesos: no se requiere singleton: use <código>ChromePdfRenderer</códigolibremente en cualquier patrón, incluida la instanciación por solicitud.
API más simple: llamadas de métodos directos ( RenderHtmlAsPdf() , RenderUrlAsPdf() ) en lugar de la construcción de objetos de documento complejos.
Desarrollo activo: a medida que aumenta la adopción de .NET 10 y C# 14 hasta 2026, las actualizaciones periódicas deIronPDFgarantizan la compatibilidad con las versiones actuales y futuras de .NET.






