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

Cómo migrar de NReco PDF Generator a IronPDF en C#

Por qué migrar de Generador de PDF de NRecoa IronPDF

Cuestiones críticas de seguridad con NReco PDF Generator

NReco PDF Generator envuelve el obsoleto binario wkhtmltopdf, heredando todas sus vulnerabilidades de seguridad. No se trata de una preocupación teórica: hay más de 20 CVE documentadas sin parches disponibles desde que wkhtmltopdf se abandonó en 2020:

  • CVE-2020-21365: Falsificación de solicitud del lado del servidor (SSRF)
  • CVE-2022-35583: Lectura de archivos locales mediante inyección HTML
  • CVE-2022-35580: Potencial de ejecución remota de código

Estas vulnerabilidades no pueden parchearse porque el proyecto wkhtmltopdf subyacente ya no se mantiene.

Limitaciones adicionales del generador de PDF de NReco

  1. Versión gratuita con marca de agua: el uso en producción requiere una licencia paga con precios opacos que requieren contactar al departamento de ventas.

  2. Motor de renderizado obsoleto: WebKit Qt (circa 2012) ofrece compatibilidad web moderna limitada:

    • Sin CSS Grid ni Flexbox
    • Sin JavaScriptmoderno (ES6+)
    • Escasa compatibilidad con fuentes web
    • Sin variables CSS ni propiedades personalizadas
  3. Dependencia binaria externa: requiere administrar binarios wkhtmltopdf por plataforma ( wkhtmltopdf.exe , wkhtmltox.dll ).

  4. Sin desarrollo activo: el contenedor recibe mantenimiento sin actualizaciones del motor subyacentes.

  5. Compatibilidad asincrónica limitada: la API sincrónica bloquea subprocesos en aplicaciones web.

Comparación entre Generador de PDF de NRecoe IronPDF

AspectoGenerador de PDF de NRecoIronPDF
Motor de renderizadoWebKit Qt (2012)Chromium (actual)
Seguridadmás de 20 CVE, sin parchesActualizaciones de seguridad activas
Soporte CSSCSS2.1, CSS3 limitadoCSS3 completo, Grid, Flexbox
JavaScriptES5 básicoES6+ completo, async/await
DependenciasBinario externo wkhtmltopdfAutocontenido
Soporte de AsyncSólo sincrónicoAsync/await completo
Fuentes webLimitadoFuentes Google completas, @font-face
LicenciasPrecios opacos, póngase en contacto con ventasPrecios transparentes
Prueba gratuitaMarca de aguaFuncionalidad completa

Para los equipos que planifican la adopción de .NET 10 y C# 14 hasta 2025 y 2026,IronPDFproporciona una base preparada para el futuro con desarrollo activo y capacidades de renderización modernas.


Antes de empezar

Prerrequisitos

  1. Entorno .NET: .NET Framework 4.6.2+ o .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Acceso a NuGet: Capacidad para instalar paquetes NuGet
  3. Licencia de IronPDF: Obtenga su clave de licencia en ironpdf.com

Cambios en el paquete NuGet

# Remove NReco.PdfGenerator
dotnet remove package NReco.PdfGenerator

# Install IronPDF
dotnet add package IronPdf
# Remove NReco.PdfGenerator
dotnet remove package NReco.PdfGenerator

# Install IronPDF
dotnet add package IronPdf
SHELL

Elimine también los binarios wkhtmltopdf de su despliegue:

  • Eliminar wkhtmltopdf.exe, wkhtmltox.dll del proyecto
  • Eliminar cualquier script de instalación de wkhtmltopdf
  • Eliminar carpetas binarias específicas de la plataforma

Configuración de licencias

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
$vbLabelText   $csharpLabel

Identificar el uso del generador de PDF de NReco

# Find all NReco.PdfGenerator references
grep -r "NReco.PdfGenerator\|HtmlToPdfConverter\|GeneratePdf" --include="*.cs" .
# Find all NReco.PdfGenerator references
grep -r "NReco.PdfGenerator\|HtmlToPdfConverter\|GeneratePdf" --include="*.cs" .
SHELL

Referencia completa de la API

Asignaciones de clases principales

Generador de PDF de NRecoIronPDFNotas
<código>HtmlToPdfConverter</código<código>ChromePdfRenderer</códigoRenderizador principal
Margenes de páginaPropiedades de los márgenes individualesMarginTop, MarginBottom, etc.
Orientación de páginaOrientación del documento pdfEnum
<código>TamañoDePágina</código<código>TamañoDelPapel</códigoEnum

Métodos de renderizado

Generador de PDF de NRecoIronPDFNotas
<código>GenerarPdf(html)</código><código>RenderHtmlAsPdf(html)</códigoDevuelve PdfDocument
<código>GeneratePdfFromFile(url, output)</código<código>RenderUrlAsPdf(url)</códigoSoporte directo de URL
<código>GeneratePdfFromFile(htmlPath, output)</código<código>RenderHtmlFileAsPdf(ruta)</códigoRuta del archivo
(async no compatible)_<código>RenderHtmlAsPdfAsync(html)</códigoVersión asíncrona
(async no compatible)_<código>RenderUrlAsPdfAsync(url)</códigoVersión asíncrona

Configuración de páginas

Generador de PDF de NRecoIronPDFNotas
Ancho de página = 210<código>RenderingOptions.PaperSize = PdfPaperSize.A4</códigoUtilizar enum o SetCustomPaperSize
Altura de página = 297<código>RenderingOptions.SetCustomPaperSizeinMilimeters(w, h)</códigoTamaño personalizado
Orientación = PageOrientation.Landscape<código>RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape</códigoPaisaje
Tamaño = TamañoPágina.A4<código>RenderingOptions.PaperSize = PdfPaperSize.A4</códigoEnumeración del tamaño del papel

Mapeo de márgenes

Generador de PDF de NRecoIronPDFNotas
Margins.Top = 10<código>RenderingOptions.MarginTop = 10</códigoEn milímetros
Margins.Bottom = 10<código>RenderingOptions.MarginBottom = 10</códigoEn milímetros
Margins.Left = 10<código>RenderingOptions.MarginLeft = 10</códigoEn milímetros
Margins.Right = 10<código>RenderingOptions.MarginRight = 10</códigoEn milímetros
nuevos PageMargins { ... }Propiedades individualesSin objeto de márgenes

Mapas de marcador de posición de encabezado/pie

Generador de PDF de NReco (wkhtmltopdf)IronPDFNotas
<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
<código>[tiempo]</código>{time}Horario actual
<código>[título]</código>{html-title}Título del documento

Mapeos de manejo de salidas

Generador de PDF de NRecoIronPDFNotas
byte[] pdfBytes = GenerarPdf(html)<código>PdfDocument pdf = RenderHtmlAsPdf(html)</códigoObjeto de devolución
<código>File.WriteAllBytes(ruta, bytes)</código<código>pdf.SaveAs(ruta)</códigoAhorro directo
return pdfBytes<código>return pdf.BinaryData</códigoObtener matriz de bytes
nuevo MemoryStream(pdfBytes)<código>pdf.Stream</códigoObtener flujo

Ejemplos de migración de código

Ejemplo 1: HTML básico a PDF

Antes (NReco PDF Generator):

// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;

class Program
{
    static void Main()
    {
        var htmlToPdf = new HtmlToPdfConverter();
        var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
        var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
        File.WriteAllBytes("output.pdf", pdfBytes);
    }
}
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;

class Program
{
    static void Main()
    {
        var htmlToPdf = new HtmlToPdfConverter();
        var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
        var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
        File.WriteAllBytes("output.pdf", pdfBytes);
    }
}
$vbLabelText   $csharpLabel

Después (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
$vbLabelText   $csharpLabel

La diferencia fundamental radica en el tipo de retorno y el patrón de guardado. El HtmlToPdfConverter.GeneratePdf() de Generador de PDF de NRecodevuelve un byte[] que debe escribir manualmente en el disco mediante File.WriteAllBytes(). IronPDF's ChromePdfRenderer.RenderHtmlAsPdf() devuelve un objeto PdfDocument con un método SaveAs() incorporado.

Este enfoque orientado a objetos ofrece ventajas adicionales: se puede manipular el PDF (añadir marcas de agua, fusionar documentos, añadir seguridad) antes de guardarlo. Si necesita los bytes sin procesar por compatibilidad con el código existente, utilice pdf.BinaryData. Consulte la documentación HTML a PDF para obtener más opciones de conversión.

Ejemplo 2: Tamaño de página personalizado con márgenes

Antes (NReco PDF Generator):

// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;

class Program
{
    static void Main()
    {
        var htmlToPdf = new HtmlToPdfConverter();
        htmlToPdf.PageWidth = 210;
        htmlToPdf.PageHeight = 297;
        htmlToPdf.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
        var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
        var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
        File.WriteAllBytes("custom-size.pdf", pdfBytes);
    }
}
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;

class Program
{
    static void Main()
    {
        var htmlToPdf = new HtmlToPdfConverter();
        htmlToPdf.PageWidth = 210;
        htmlToPdf.PageHeight = 297;
        htmlToPdf.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
        var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
        var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
        File.WriteAllBytes("custom-size.pdf", pdfBytes);
    }
}
$vbLabelText   $csharpLabel

Después (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;
        var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("custom-size.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;
        var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("custom-size.pdf");
    }
}
$vbLabelText   $csharpLabel

NReco PDF Generator utiliza dimensiones numéricas (PageWidth = 210, PageHeight = 297) y un objeto PageMargins.IronPDFutiliza el enum <código>TamañoDelPapel</código(que incluye tamaños estándar como A4, Letter, Legal) y propiedades de margen individuales en el objeto RenderingOptions.

Los cambios clave de la migración:

  • PageWidth / PageHeightRenderingOptions.PaperSize = PdfPaperSize.A4
  • nuevo PageMargins { Top = 10, ... }→ Propiedades individuales:RenderingOptions.MarginTop = 10`

Para tamaños de papel personalizados no cubiertos por el enum, utilice RenderingOptions.SetCustomPaperSizeinMilimeters(width, height). Más información sobre opciones de configuración de página.

Ejemplo 3: Conversión de URL a PDF

Antes (NReco PDF Generator):

// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;

class Program
{
    static void Main()
    {
        var htmlToPdf = new HtmlToPdfConverter();
        var pdfBytes = htmlToPdf.GeneratePdfFromFile("https://www.example.com", null);
        File.WriteAllBytes("webpage.pdf", pdfBytes);
    }
}
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;

class Program
{
    static void Main()
    {
        var htmlToPdf = new HtmlToPdfConverter();
        var pdfBytes = htmlToPdf.GeneratePdfFromFile("https://www.example.com", null);
        File.WriteAllBytes("webpage.pdf", pdfBytes);
    }
}
$vbLabelText   $csharpLabel

Después (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

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;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
$vbLabelText   $csharpLabel

NReco PDF Generator utiliza el método de nombre confuso GeneratePdfFromFile() tanto para archivos locales como para URL, con un segundo parámetro anulable.IronPDFproporciona métodos específicos: RenderUrlAsPdf() para URLs y RenderHtmlFileAsPdf() para archivos HTML locales.

El enfoque deIronPDFes más limpio e intuitivo. Para aplicaciones web asíncronas, utilice await renderer.RenderUrlAsPdfAsync(url) para evitar el bloqueo de hilos, algo que Generador de PDF de NRecosimplemente no puede hacer.


Notas de migración críticas

Conversión de valores de zoom

NReco PDF Generator utiliza valores flotantes (0,0-2,0), mientras queIronPDFutiliza enteros porcentuales:

// NReco PDF Generator: Zoom = 0.9f (90%)
// IronPDF: Zoom = 90

// Conversion formula:
int ironPdfZoom = (int)(nrecoZoom * 100);
// NReco PDF Generator: Zoom = 0.9f (90%)
// IronPDF: Zoom = 90

// Conversion formula:
int ironPdfZoom = (int)(nrecoZoom * 100);
$vbLabelText   $csharpLabel

Actualización de la sintaxis de los marcadores

Deben actualizarse todos los marcadores de posición de encabezado/pie de página:

Generador de PDF de NRecoIronPDF
<código>[página]</código>{page}
[topage]{total de páginas}
<código>[fecha]</código>{fecha}
<código>[título]</código>{html-title}
// NReco PDF Generator:
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";

// IronPDF:
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div>Page {page} of {total-pages}</div>",
    MaxHeight = 20
};
// NReco PDF Generator:
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";

// IronPDF:
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div>Page {page} of {total-pages}</div>",
    MaxHeight = 20
};
$vbLabelText   $csharpLabel

Cambio de tipo de retorno

NReco PDF Generator devuelve byte[] directamente;IronPDFdevuelve PdfDocument:

// Generador de PDF de NRecopattern:
byte[] pdfBytes = converter.GeneratePdf(html);
File.WriteAllBytes("output.pdf", pdfBytes);

//IronPDFpattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");

// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
// Generador de PDF de NRecopattern:
byte[] pdfBytes = converter.GeneratePdf(html);
File.WriteAllBytes("output.pdf", pdfBytes);

//IronPDFpattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");

// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
$vbLabelText   $csharpLabel

Seguridad y reutilización de hilos

NReco PDF Generator suele crear un nuevo conversor por llamada. El <código>ChromePdfRenderer</códigodeIronPDFes seguro y puede reutilizarse:

// Generador de PDF de NRecopattern (creates new each time):
public byte[] Generate(string html)
{
    var converter = new HtmlToPdfConverter();
    return converter.GeneratePdf(html);
}

//IronPDFpattern (reuse renderer, thread-safe):
private readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();

public byte[] Generate(string html)
{
    return _renderer.RenderHtmlAsPdf(html).BinaryData;
}
// Generador de PDF de NRecopattern (creates new each time):
public byte[] Generate(string html)
{
    var converter = new HtmlToPdfConverter();
    return converter.GeneratePdf(html);
}

//IronPDFpattern (reuse renderer, thread-safe):
private readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();

public byte[] Generate(string html)
{
    return _renderer.RenderHtmlAsPdf(html).BinaryData;
}
$vbLabelText   $csharpLabel

Soporte asíncrono (nueva capacidad)

IronPDF admite patrones async/await que Generador de PDF de NRecono puede proporcionar:

// NReco PDF Generator: No async support available

// IronPDF: Full async support
public async Task<byte[]> GenerateAsync(string html)
{
    var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}
// NReco PDF Generator: No async support available

// IronPDF: Full async support
public async Task<byte[]> GenerateAsync(string html)
{
    var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}
$vbLabelText   $csharpLabel

Solución de problemas

Asunto 1: HtmlToPdfConverter no encontrado

Problema: la clase <código>HtmlToPdfConverter</códigono existe en IronPDF.

Solución: utilice <código>ChromePdfRenderer</código:

// NReco PDF Generator
var converter = new HtmlToPdfConverter();

// IronPDF
var renderer = new ChromePdfRenderer();
// NReco PDF Generator
var converter = new HtmlToPdfConverter();

// IronPDF
var renderer = new ChromePdfRenderer();
$vbLabelText   $csharpLabel

Asunto 2: GeneratePdf devuelve un tipo incorrecto

Problema: el código espera byte[] pero obtiene PdfDocument .

Solución: Acceder a la propiedad .BinaryData :

// NReco PDF Generator
byte[] pdfBytes = converter.GeneratePdf(html);

// IronPDF
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
// NReco PDF Generator
byte[] pdfBytes = converter.GeneratePdf(html);

// IronPDF
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
$vbLabelText   $csharpLabel

Edición 3: Objeto PageMargins no encontrado

Problema: la clase Margenes de páginano existe en IronPDF.

Solución: utilice propiedades de margen individuales:

// NReco PDF Generator
converter.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };

// IronPDF
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
// NReco PDF Generator
converter.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };

// IronPDF
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
$vbLabelText   $csharpLabel

Cuestión 4: Los números de página no aparecen

Problema: los marcadores de posición <código>[página]</código>y [topage]no funcionan.

Solución: Actualizar la sintaxis del marcador de posición IronPDF:

// NReco PDF Generator
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";

// IronPDF
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div>Page {page} of {total-pages}</div>",
    MaxHeight = 20
};
// NReco PDF Generator
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";

// IronPDF
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div>Page {page} of {total-pages}</div>",
    MaxHeight = 20
};
$vbLabelText   $csharpLabel

Lista de comprobación de la migración

Pre-Migración

  • Inventariar todos los usos de NReco.PdfGenerator en el código base
  • Documentar todos los valores CustomWkHtmlArgs y CustomWkHtmlPageArgs
  • Enumere todas las plantillas HTML de encabezado/pie de página con marcadores de posición
  • Identificar requisitos asincrónicos (controladores web, servicios)
  • Revisar la configuración de zoom y márgenes
  • Realice una copia de seguridad de las salidas PDF existentes para compararlas
  • Obtener la clave de licencia de IronPDF

Cambios en el paquete

  • Eliminar el paquete NuGet NReco.PdfGenerator
  • Instalar el paquete NuGet IronPdf : dotnet add package IronPdf
  • Actualizar las importaciones de espacios de nombres desde using NReco.PdfGenerator; al using IronPdf;

Cambios de código

  • Agregar configuración de clave de licencia al inicio
  • Reemplace <código>HtmlToPdfConverter</códigocon ChromePdfRenderer
  • Reemplace <código>GenerarPdf(html)</código>con RenderHtmlAsPdf(html)
  • Reemplace GeneratePdfFromFile(url, null) con RenderUrlAsPdf(url)
  • Convertir el objeto Margenes de páginaen propiedades de margen individuales
  • Actualizar los valores de zoom de flotante a porcentaje
  • Actualizar la sintaxis del marcador de posición: <código>[página]</código>→ {page}, [topage]{total-pages}
  • Reemplace File.WriteAllBytes() con pdf.SaveAs()
  • Convertir llamadas sincrónicas en asincrónicas cuando sea beneficioso

Posmigración

  • Eliminar los binarios wkhtmltopdf del proyecto/implementación
  • Actualizar los archivos de Docker para eliminar la instalación de wkhtmltopdf
  • Ejecutar pruebas de regresión comparando la salida PDF
  • Verificar que los marcadores de posición de encabezado y pie de página se representen correctamente
  • Prueba en todas las plataformas de destino (Windows, Linux, macOS)
  • Actualizar la canalización CI/CD para eliminar los pasos wkhtmltopdf
  • Actualizar el análisis de seguridad para confirmar la eliminación de CVE

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