Cómo migrar de TuesPechkin a IronPDF en C#
Migrando de MartesPechkina IronPDF: Una guía completa para desarrolladores de C
TuesPechkin ha servido como una envoltura a prueba de hilos alrededor de la biblioteca wkhtmltopdf, ayudando a los desarrolladores .NET a convertir HTML a PDF durante años. Sin embargo, la tecnología wkhtmltopdf subyacente se actualizó por última vez en 2015 y se abandonó oficialmente en diciembre de 2022. Esto crea limitaciones críticas de seguridad, estabilidad y renderización que los equipos de desarrollo ya no pueden ignorar.
Esta guía proporciona una ruta de migración completa de MartesPechkina IronPDF, con instrucciones paso a paso, comparaciones de código y ejemplos prácticos para desarrolladores .NET profesionales que estén evaluando esta transición.
Por qué migrar de MartesPechkinahora
La decisión de migrar de MartesPechkinya no es opcional para los equipos de desarrollo preocupados por la seguridad. La biblioteca wkhtmltopdf subyacente contiene vulnerabilidades críticas sin parche que nunca se solucionarán.
Vulnerabilidad de seguridad crítica: CVE-2022-35583
| Atributo | Valor |
|---|---|
| CVE ID | CVE-2022-35583 |
| Severity | CRITICO (9.8/10) |
| Vector de ataque | Red |
| Estado | NUNCA SERÁ PARCHEADO |
| Afectados | TODAS las versiones de TuesPechkin |
Los responsables de wkhtmltopdf han declarado explícitamente que NO corregirán las vulnerabilidades de seguridad. Toda aplicación que utilice MartesPechkinestá permanentemente expuesta a ataques de Falsificación de Peticiones del Lado del Servidor (SSRF).
Cómo funciona el ataque
Al procesar HTML proporcionado por el usuario, los atacantes pueden inyectar contenido malicioso:
<!-- Attacker submits this HTML to your PDF generator -->
<iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe>
<img src="http://internal-admin-panel:8080/api/users?export=all" /><!-- Attacker submits this HTML to your PDF generator -->
<iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe>
<img src="http://internal-admin-panel:8080/api/users?export=all" />Esto permite a los atacantes acceder a los puntos finales de metadatos de AWS/Azure/GCP, robar datos de API internos, escanear puertos de redes internas y extraer configuración confidencial.
La crisis tecnológica
TuesPechkin incluye wkhtmltopdf, que utiliza Qt WebKit 4.8, una tecnología antigua, anterior a la era Chrome. Esto significa:
- No es compatible con Flexbox
- No es compatible con CSS Grid
- Ejecución rota de JavaScript
- No es compatible con ES6+
La crisis de estabilidad
Incluso con el <código>ThreadSafeConverter</códigoanunciado, MartesPechkinse bloquea bajo carga elevada:
// ❌ MartesPechkin- "ThreadSafeConverter" still crashes
var converter = new TuesPechkin.ThreadSafeConverter(
new TuesPechkin.RemotingToolset<PechkinBindings>());
// Under high load, you'll see:
// System.AccessViolationException: Attempted to read or write protected memory
// Process terminated unexpectedly
// Converter hangs indefinitely// ❌ MartesPechkin- "ThreadSafeConverter" still crashes
var converter = new TuesPechkin.ThreadSafeConverter(
new TuesPechkin.RemotingToolset<PechkinBindings>());
// Under high load, you'll see:
// System.AccessViolationException: Attempted to read or write protected memory
// Process terminated unexpectedly
// Converter hangs indefinitelyIRON VB CONVERTER ERROR developers@ironsoftware.comIronPDFvs TuesPechkin: Comparación de características
Comprender las diferencias arquitectónicas ayuda a los responsables técnicos a evaluar la inversión en migración:
| Característica | MartesPechkin | IronPDF |
|---|---|---|
| Licencia | Gratuito (Licencia MIT) | Comercial |
| Seguridad de hilos | Requiere gestión manual | Soporte nativo |
| Moneda | Limitado, puede bloquearse bajo carga | Robusto, maneja alta concurrencia |
| Desarrollo | Inactivo, última actualización 2015 | Mejoras activas y continuas |
| Facilidad de uso | Configuración compleja | Fácil de usar con guías |
| Documentación | Básico | Extenso con ejemplos |
| Seguridad | cVE críticos | ✅ No se conocen vulnerabilidades |
| HTML a PDF | ⚠️ WebKit desactualizado | chromium moderno |
| CSS3 | ❌ Parcial | ✅ Soporte completo |
| Flexbox/Grid | ❌ No compatible | ✅ Soporte completo |
| JavaScript | ⚠️ Poco fiable | eS6+ completo |
| Manipulación de PDF | ❌ No disponible | ✅ Completo |
| Firmas digitales | ❌ No disponible | ✅ Completo |
| Cumplimiento de PDF/A | ❌ No disponible | ✅ Completo |
| Relleno de formularios | ❌ No disponible | ✅ Completo |
| Marcas de agua | ❌ No disponible | ✅ Completo |
| Fusionar/Dividir | ❌ No disponible | ✅ Completo |
Inicio rápido: Migración de MartesPechkina IronPDF
La migración puede comenzar inmediatamente con estos pasos básicos.
Paso 1: Sustituir paquetes NuGet
Eliminar todos los paquetes TuesPechkin:
# Remove MartesPechkinand all related packages
dotnet remove package TuesPechkin
dotnet remove package TuesPechkin.Wkhtmltox.Win64
dotnet remove package TuesPechkin.Wkhtmltox.Win32# Remove MartesPechkinand all related packages
dotnet remove package TuesPechkin
dotnet remove package TuesPechkin.Wkhtmltox.Win64
dotnet remove package TuesPechkin.Wkhtmltox.Win32Instalar IronPDF:
# Install IronPDF
dotnet add package IronPdf# Install IronPDF
dotnet add package IronPdfPaso 2: Eliminar binarios nativos
Elimine estos archivos y carpetas de su proyecto:
- <código>wkhtmltox.dll</código
- <código>wkhtmltopdf.exe</código
- Cualquier archivo
wkhtmlto* Carpeta TuesPechkin.Wkhtmltox
Paso 3: Actualizar los espacios de nombres
Sustituya los espacios de nombres MartesPechkinpor el espacio de nombres IronPdf:
// Before (TuesPechkin)
using TuesPechkin;
using TuesPechkin.Wkhtmltox.Win64;
// After (IronPDF)
using IronPdf;// Before (TuesPechkin)
using TuesPechkin;
using TuesPechkin.Wkhtmltox.Win64;
// After (IronPDF)
using IronPdf;IRON 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
Convertir HTML a PDF
El caso de uso más común demuestra la diferencia de complejidad entre estas bibliotecas PDF .NET.
Enfoque TuesPechkin:
// NuGet: Install-Package TuesPechkin
using TuesPechkin;
using System.IO;
class Program
{
static void Main()
{
var converter = new StandardConverter(
new RemotingToolset<PdfToolset>(
new Win64EmbeddedDeployment(
new TempFolderDeployment())));
string html = "<html><body><h1>Hello World</h1></body></html>";
byte[] pdfBytes = converter.Convert(new HtmlToPdfDocument
{
Objects = { new ObjectSettings { HtmlText = html } }
});
File.WriteAllBytes("output.pdf", pdfBytes);
}
}// NuGet: Install-Package TuesPechkin
using TuesPechkin;
using System.IO;
class Program
{
static void Main()
{
var converter = new StandardConverter(
new RemotingToolset<PdfToolset>(
new Win64EmbeddedDeployment(
new TempFolderDeployment())));
string html = "<html><body><h1>Hello World</h1></body></html>";
byte[] pdfBytes = converter.Convert(new HtmlToPdfDocument
{
Objects = { new ObjectSettings { HtmlText = html } }
});
File.WriteAllBytes("output.pdf", pdfBytes);
}
}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();
string html = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comLa versión MartesPechkinrequiere crear un ConvertidorEstándar con una compleja cadena de inicialización: RemotingToolset, Win64EmbeddedDeployment, y TempFolderDeployment. También debe escribir manualmente bytes en un archivo.
IronPDF elimina esta ceremonia por completo. Crear un ChromePdfRenderer, renderizar HTML y guardar. El código es autodocumentado y no requiere conocimientos de herramientas de despliegue ni de gestión de binarios específicos de la plataforma.
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 presenta diferencias de complejidad similares.
Enfoque TuesPechkin:
// NuGet: Install-Package TuesPechkin
using TuesPechkin;
using System.IO;
class Program
{
static void Main()
{
var converter = new StandardConverter(
new RemotingToolset<PdfToolset>(
new Win64EmbeddedDeployment(
new TempFolderDeployment())));
byte[] pdfBytes = converter.Convert(new HtmlToPdfDocument
{
Objects = {
new ObjectSettings {
PageUrl = "https://www.example.com"
}
}
});
File.WriteAllBytes("webpage.pdf", pdfBytes);
}
}// NuGet: Install-Package TuesPechkin
using TuesPechkin;
using System.IO;
class Program
{
static void Main()
{
var converter = new StandardConverter(
new RemotingToolset<PdfToolset>(
new Win64EmbeddedDeployment(
new TempFolderDeployment())));
byte[] pdfBytes = converter.Convert(new HtmlToPdfDocument
{
Objects = {
new ObjectSettings {
PageUrl = "https://www.example.com"
}
}
});
File.WriteAllBytes("webpage.pdf", pdfBytes);
}
}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.comTuesPechkin utiliza <código>ObjectSettings.PageUrl</códigoanidado dentro de un HtmlToPdfDocument.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 renderizado personalizada
La orientación de la página, el tamaño del papel y los márgenes requieren diferentes enfoques de configuración.
Enfoque TuesPechkin:
// NuGet: Install-Package TuesPechkin
using TuesPechkin;
using System.IO;
class Program
{
static void Main()
{
var converter = new StandardConverter(
new RemotingToolset<PdfToolset>(
new Win64EmbeddedDeployment(
new TempFolderDeployment())));
string html = "<html><body><h1>Custom PDF</h1></body></html>";
var document = new HtmlToPdfDocument
{
GlobalSettings = {
Orientación= GlobalSettings.PdfOrientation.Landscape,
PaperSize = GlobalSettings.PdfPaperSize.A4,
Margins = new MarginSettings { Unit = Unit.Millimeters, Top = 10, Bottom = 10 }
},
Objects = {
new ObjectSettings { HtmlText = html }
}
};
byte[] pdfBytes = converter.Convert(document);
File.WriteAllBytes("custom.pdf", pdfBytes);
}
}// NuGet: Install-Package TuesPechkin
using TuesPechkin;
using System.IO;
class Program
{
static void Main()
{
var converter = new StandardConverter(
new RemotingToolset<PdfToolset>(
new Win64EmbeddedDeployment(
new TempFolderDeployment())));
string html = "<html><body><h1>Custom PDF</h1></body></html>";
var document = new HtmlToPdfDocument
{
GlobalSettings = {
Orientación= GlobalSettings.PdfOrientation.Landscape,
PaperSize = GlobalSettings.PdfPaperSize.A4,
Margins = new MarginSettings { Unit = Unit.Millimeters, Top = 10, Bottom = 10 }
},
Objects = {
new ObjectSettings { HtmlText = html }
}
};
byte[] pdfBytes = converter.Convert(document);
File.WriteAllBytes("custom.pdf", pdfBytes);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comEnfoque IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Engines.Chrome;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
string html = "<html><body><h1>Custom PDF</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("custom.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Engines.Chrome;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
string html = "<html><body><h1>Custom PDF</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("custom.pdf");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comTuesPechkin separa los ajustes en <código>ConfiguraciónGlobal</códigopara las opciones de todo el documento y ObjectSettings para el contenido.IronPDFconsolida todo en <código>RenderingOptions</códigocon nombres de propiedades claros y fáciles de encontrar.
Referencia de la API de MartesPechkina IronPDF
Este mapeo acelera la migración al mostrar los equivalentes directos de las API:
| MartesPechkin | IronPDF | Notas |
|---|---|---|
ConvertidorEstándar | <código>ChromePdfRenderer</código | Sin inicializaciones complejas |
| <código>ThreadSafeConverter</código | <código>ChromePdfRenderer</código | Seguridad de hilos nativa |
| <código>HtmlToPdfDocument</código | Parámetros del método | No se necesita ningún objeto documental |
| <código>ConfiguraciónGlobal</código | <código>RenderingOptions</código | Opciones de configuración |
| <código>ObjectSettings.HtmlText</código | <código>RenderHtmlAsPdf(html)</código | Traducción directa |
| <código>ObjectSettings.PageUrl</código | <código>RenderUrlAsPdf(url)</código | Representación de URL |
| <código>GlobalSettings.PaperSize</código | <código>RenderingOptions.PaperSize</código | Tamaño del papel |
ConfiguraciónGlobal.Orientación | <código>RenderingOptions.PaperOrientation</código | Orientación |
| <código>MarginSettings</código> | MarginTop, MarginBottom, etc. | Propiedades de los márgenes individuales |
[page] marcador de posición | {page} marcador de posición | Sintaxis del número de página |
[toPage] marcador de posición | {total-páginas} marcador de posición | Sintaxis total de páginas |
Conjunto de herramientas remotas | No es necesario | Sin gestión de despliegue |
| <código>Win64EmbeddedDeployment</código | No es necesario | Sin binarios de plataforma |
| <código>TempFolderDeployment</código | No es necesario | Sin gestión de carpetas temporales |
Problemas comunes de migración y soluciones
Cuestión 1: Código de inicialización complejo
Problema: MartesPechkinrequiere una compleja configuración del conversor con conjuntos de herramientas de despliegue.
Solución:IronPDFes sencillo:
// Before (TuesPechkin)
var converter = new StandardConverter(
new RemotingToolset<PdfToolset>(
new Win64EmbeddedDeployment(
new TempFolderDeployment())));
// After (IronPDF)
var renderer = new ChromePdfRenderer();
// That's it!// Before (TuesPechkin)
var converter = new StandardConverter(
new RemotingToolset<PdfToolset>(
new Win64EmbeddedDeployment(
new TempFolderDeployment())));
// After (IronPDF)
var renderer = new ChromePdfRenderer();
// That's it!IRON VB CONVERTER ERROR developers@ironsoftware.comNúmero 2: Thread Safety Crashes
Problema: El <código>ThreadSafeConverter</códigode MartesPechkinsigue fallando bajo alta carga con AccessViolationException.
Solución:IronPDFcuenta con seguridad de subprocesos nativa, sin necesidad de configuración especial:
//IronPDFis inherently thread-safe
var renderer = new ChromePdfRenderer();
// Use from any thread without crashes//IronPDFis inherently thread-safe
var renderer = new ChromePdfRenderer();
// Use from any thread without crashesIRON VB CONVERTER ERROR developers@ironsoftware.comEdición 3: Sintaxis del marcador de posición del número de página
Problema: MartesPechkinutiliza [page] y [toPage] marcadores de posición.
Solución: Actualización de la sintaxis de los marcadores de posición de IronPDF:
// Before (TuesPechkin)
"Page [page] of [toPage]"
// After (IronPDF)
"Page {page} of {total-pages}"// Before (TuesPechkin)
"Page [page] of [toPage]"
// After (IronPDF)
"Page {page} of {total-pages}"IRON VB CONVERTER ERROR developers@ironsoftware.comNúmero 4: CSS Layout Broken
Problema: Los diseños Flexbox y Grid no funcionan en MartesPechkinporque wkhtmltopdf utiliza Qt WebKit 4.8.
Solución: Utilizar CSS moderno adecuado con IronPDF:
// Remove table-based workarounds, use modern CSS
var html = @"
<div style='display: flex; justify-content: space-between;'>
<div>Left</div>
<div>Right</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
// Works correctly with Chromium!// Remove table-based workarounds, use modern CSS
var html = @"
<div style='display: flex; justify-content: space-between;'>
<div>Left</div>
<div>Right</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
// Works correctly with Chromium!IRON VB CONVERTER ERROR developers@ironsoftware.comNúmero 5: Gestión nativa de binarios
Problema: MartesPechkinrequiere los binarios wkhtmltopdf específicos de la plataforma y la configuración de la ruta.
Solución:IronPDFgestiona todas las dependencias a través de NuGet, sin binarios nativos que gestionar:
# Just install the package
dotnet add package IronPdf
# No wkhtmltopdf binaries needed# Just install the package
dotnet add package IronPdf
# No wkhtmltopdf binaries neededLista de comprobación de la migración a TuesPechkin
Tareas previas a la migración
Audite su código base para identificar el uso de TuesPechkin:
grep -r "using TuesPechkin" --include="*.cs" .
grep -r "ThreadSafeConverter\|RemotingToolset" --include="*.cs" .grep -r "using TuesPechkin" --include="*.cs" .
grep -r "ThreadSafeConverter\|RemotingToolset" --include="*.cs" .Documentar las configuraciones actuales de <código>ConfiguraciónGlobal</código(tamaño del papel, orientación, márgenes). Documentar las configuraciones de ObjectSettings (contenido HTML, URL). Identificar las implementaciones de encabezado/pie para la conversión. Localice todos los binarios de wkhtmltopdf para eliminarlos.
Tareas de actualización de código
- Eliminar paquetes NuGet de TuesPechkin
- Eliminar los binarios nativos de wkhtmltopdf
- Instalación del paquete IronPdf NuGet
- Actualizar las declaraciones de uso de
TuesPechkinaIronPdf - Añadir la inicialización de la clave de licencia al inicio
- Sustituir convertidores por
ChromePdfRenderer - Convertir <código>ConfiguraciónGlobal</códigoa
RenderingOptions - Convertir
ObjectSettingsen parámetros de método - Actualizar la configuración de márgenes a propiedades individuales
- Actualizar la sintaxis de encabezado/pie de página a
HtmlHeaderFooterbasada en HTML - Corregir la sintaxis de los marcadores de página (
[página]→{página}) - Eliminar todo el código de despliegue/toolset
Pruebas posteriores a la migración
Tras la migración, verifique estos aspectos:
- Ejecutar todas las pruebas unitarias
- Pruebe escenarios seguros para subprocesos (IronPDF maneja subprocesos múltiples sin fallos)
- Comparar la calidad de salida de PDF (Chromium renderiza con más precisión)
- Verificación del renderizado CSS (Flexbox y Grid ahora funcionan)
- Pruebe la ejecución de JavaScript (ahora es compatible con ES6+)
- Prueba de renderizado de encabezado/pie de página
- Operaciones por lotes de pruebas de rendimiento
- Escaneo de seguridad para verificar que no quedan binarios wkhtmltopdf
Beneficios clave de migrar a IronPDF
Pasar de MartesPechkinaIronPDFofrece varias ventajas fundamentales:
Seguridad: Se eliminan CVE-2022-35583y otras vulnerabilidades de wkhtmltopdf. El motor Chromium deIronPDFrecibe actualizaciones de seguridad periódicas.
Seguridad de hilos nativa: Se acabaron las complejas configuraciones de ThreadSafeConverter. Se acabaron las AccessViolationException bajo carga.IronPDFgestiona la concurrencia automáticamente.
Motor de renderizado moderno: Compatibilidad total con CSS3, Flexbox, Grid y ES6+ JavaScript. Los PDF se muestran exactamente como aparecen en los navegadores modernos.
Despliegue simplificado: No hay que gestionar binarios específicos de la plataforma. Ninguna ceremonia RemotingToolset, Win64EmbeddedDeployment, o TempFolderDeployment. Basta con instalar el paquete NuGet.
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.
Capacidades ampliadas: MartesPechkinsólo convierte HTML a PDF.IronPDFañade manipulación de PDF, firmas digitales, conformidad con PDF/A, rellenado de formularios, marcas de agua y operaciones de fusión/división.
Conclusión
TuesPechkin ha servido bien a la comunidad .NET como una envoltura segura para hilos alrededor de wkhtmltopdf. Sin embargo, con la tecnología subyacente abandonada desde diciembre de 2022 y vulnerabilidades de seguridad críticas que nunca se parchearán, el uso continuado crea un riesgo inaceptable para las aplicaciones de producción.
IronPDF ofrece una alternativa moderna y segura con una API más sencilla, seguridad de hilos nativa y un motor de renderizado Chromium que maneja los estándares web contemporáneos. La ruta de migración es sencilla: sustituir los paquetes NuGet, eliminar los binarios nativos y simplificar el código del conversor.
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.






