Migración de Haukcode.DinkToPdf a IronPDF
Migrando de Haukcode.DinkToPdf a IronPDF: Una guía completa para desarrolladores de C
Haukcode.DinkToPdf es una bifurcación de la anteriormente popular biblioteca DinkToPdf, que envuelve el binario wkhtmltopdf para proporcionar capacidades de conversión de HTML a PDF para aplicaciones .NET. Aunque Haukcode.DinkToPdf mantuvo la compatibilidad con .NET Core después de que el proyecto original DinkToPdf se estancara, hereda vulnerabilidades de seguridad críticas de su dependencia ascendente. El proyecto wkhtmltopdf subyacente fue archivado en enero de 2023, lo que significa que estas vulnerabilidades nunca serán parcheadas.
Esta guía proporciona una ruta de migración completa de Haukcode.DinkToPdf a IronPDF, con instrucciones paso a paso, comparaciones de código y ejemplos prácticos para desarrolladores .NET profesionales que necesitan 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 vulnerabilidad de seguridad crítica 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 recupere recursos internos
- Ataque a los metadatos de AWS: Se puede acceder a
http://169.254.169.254para robar credenciales de AWS - Acceso a redes internas: 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 RenderingOptionsIRON VB CONVERTER ERROR developers@ironsoftware.comPaso 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";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);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comEnfoque 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comHaukcode.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);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comEnfoque 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.comHaukcode.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);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comEnfoque 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comHaukcode.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!IRON VB CONVERTER ERROR developers@ironsoftware.comNú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 directlyIRON VB CONVERTER ERROR developers@ironsoftware.comEdició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}"
};IRON VB CONVERTER ERROR developers@ironsoftware.comLista 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 activamente actualizado en lugar del abandonado Qt WebKit de 2015. Compatibilidad total con HTML5, CSS3 y JavaScript.
Sin binarios nativos: Biblioteca autónoma sin DLL específicas de plataforma que gestionar. Simplifica la implementación en Windows, Linux y macOS.
Seguridad de los hilos: No se requiere singleton; utilice <código>ChromePdfRenderer</códigolibremente en cualquier patrón, incluida la instanciación por solicitud.
API más sencilla: Llamadas directas a métodos (RenderHtmlAsPdf(), RenderUrlAsPdf()) en lugar de la compleja construcción de objetos de documento.
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.
Conclusión
Haukcode.DinkToPdf sirvió como continuación del proyecto DinkToPdf, manteniendo la compatibilidad con .NET Core para la generación de PDF basada en wkhtmltopdf. Sin embargo, el binario wkhtmltopdf subyacente fue archivado en 2023, dejando vulnerabilidades de seguridad críticas como CVE-2022-35583 permanentemente sin parchear. Cada día que las aplicaciones siguen utilizando Haukcode.DinkToPdf, la infraestructura sigue estando en peligro de sufrir ataques SSRF.
IronPDF proporciona una alternativa moderna y segura con un motor de renderizado Chromium que maneja los estándares web contemporáneos. La ruta de migración es sencilla: eliminar los paquetes de DinkToPdf y los binarios nativos, sustituir la construcción de documentos por métodos de renderizado directo y actualizar la sintaxis de los marcadores de posición.
Comience su migración hoy mismo con una prueba gratuita de IronPDF y elimine las vulnerabilidades de seguridad inherentes a las soluciones basadas en wkhtmltopdf.
Para una guía de implementación completa, explore la documentación de IronPDF y tutoriales.






