Passer au contenu du pied de page
GUIDES DE MIGRATION

Comment migrer d'un générateur de PDF NReco vers IronPDF en C#

Pourquoi passer de NReco PDF Generatorà IronPDF

Questions de sécurité critiques avec NReco PDF Generator

NReco PDF Generator intègre le binaire déprécié wkhtmltopdf, héritant ainsi de toutes ses vulnérabilités en matière de sécurité. Il ne s'agit pas d'un problème théorique : il existe plus de 20 CVE documentés sans aucun correctif disponible depuis l'abandon de wkhtmltopdf en 2020 :

  • CVE-2020-21365 : Falsification de requête côté serveur (SSRF)
  • CVE-2022-35583 : Lecture de fichiers locaux via injection HTML
  • CVE-2022-35580 : Potentiel d'exécution de code à distance

Ces vulnérabilités ne peuvent pas être corrigées car le projet wkhtmltopdf sous-jacent n'est plus maintenu.

Limitations supplémentaires de NReco PDF Generator

  1. Version gratuite avec filigrane : L'utilisation en production nécessite une licence payante dont le prix est opaque et qui requiert de contacter le service commercial.

  2. Moteur de rendu obsolète : WebKit Qt (environ 2012) offre une prise en charge web moderne limitée :

    • Pas de grille CSS ni de Flexbox
    • Pas de JavaScriptmoderne (ES6+)
    • Mauvaise prise en charge des polices de caractères sur le web
    • Pas de variables CSS ni de propriétés personnalisées
  3. Dépendance binaire externe : nécessite la gestion des binaires wkhtmltopdf par plateforme ( wkhtmltopdf.exe , wkhtmltox.dll ).

  4. Aucun développement actif : le wrapper bénéficie d'une maintenance sans mises à jour du moteur sous-jacent.

  5. Prise en charge asynchrone limitée : l'API synchrone bloque les threads dans les applications Web.

NReco PDF GeneratorvsIronPDFComparaison

Aspect NReco PDF Generator IronPDF
Moteur de rendu WebKit Qt (2012) Chromium (actuel)
Sécurité plus de 20 CVE, pas de correctifs Mises à jour de sécurité actives
Support CSS CSS2.1, CSS3 limité CSS3 complet, grille, Flexbox
JavaScript ES5 de base ES6+ complet, async/await
Dépendances Binaire externe wkhtmltopdf Autonome
Prise en charge de l'asynchronisme Synchrone uniquement Async/await complet
Polices de caractères Web Limité Polices Google complètes, @font-face
Licence d'utilisation Prix opaques, contacter les ventes Tarification transparente
Essai gratuit En filigrane Fonctionnalité complète

Pour les équipes qui prévoient l'adoption de .NET 10 et C# 14 jusqu'en 2025 et 2026,IronPDFconstitue une base à l'épreuve du temps avec un développement actif et des capacités de rendu modernes.


Avant de commencer

Prérequis

  1. Environnement .NET : .NET Framework 4.6.2+ ou .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Accès à NuGet : possibilité d'installer des packages NuGet
  3. Licence IronPDF : Obtenez votre clé de licence sur ironpdf.com

Modifications du paquet 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

<Supprimez également les binaires wkhtmltopdf de votre déploiement :

  • Supprimer wkhtmltopdf.exe, wkhtmltox.dll du projet
  • Supprimer tous les scripts d'installation de wkhtmltopdf
  • Supprimer les dossiers binaires spécifiques à une plateforme

Configuration de la licence

// 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

Identifier l'utilisation du générateur de PDF 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

Référence API complète

Mappages de classes de base

NReco PDF Generator IronPDF Notes
HtmlToPdfConverter ChromePdfRenderer Rendu principal
PageMargins Propriétés des marges individuelles MarginTop, MarginBottom, etc.
PageOrientation PdfPaperOrientation Enum
Taille de la page PdfPaperSize Enum

Mappages de méthodes de rendu

NReco PDF Generator IronPDF Notes
GénérerPdf(html) RenderHtmlAsPdf(html) Retourne le document Pdf
GeneratePdfFromFile(url, output) RenderUrlAsPdf(url) Prise en charge des URL directes
GeneratePdfFromFile(htmlPath, output) RenderHtmlFileAsPdf(path) Chemin d'accès au fichier
(async non pris en charge) RenderHtmlAsPdfAsync(html) Version asynchrone
(async non pris en charge) RenderUrlAsPdfAsync(url) Version asynchrone

Mappages de configuration de page

NReco PDF Generator IronPDF Notes
PageWidth = 210 RenderingOptions.PaperSize = PdfPaperSize.A4 Utiliser enum ou SetCustomPaperSize
Hauteur de page = 297 RenderingOptions.SetCustomPaperSizeinMilimeters(w, h) Taille personnalisée
Orientation = PageOrientation.Landscape RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape Paysage
Taille = PageSize.A4 RenderingOptions.PaperSize = PdfPaperSize.A4 Énumération de la taille du papier

Mise en correspondance des marges

NReco PDF Generator IronPDF Notes
Margins.Top = 10 RenderingOptions.MarginTop = 10 En millimètres
Margins.Bottom = 10 RenderingOptions.MarginBottom = 10 En millimètres
Margins.Left = 10 RenderingOptions.MarginLeft = 10 En millimètres
Margins.Right = 10 RenderingOptions.MarginRight = 10 En millimètres
nouvelles marges de page { ... } Propriétés individuelles Pas d'objet de marge

Mappages des espaces réservés de l'en-tête et du pied de page

NReco PDF Generator(wkhtmltopdf) IronPDF Notes
[page] {page} Numéro de page actuel
[topage] {total-pages} Nombre total de pages
[date] {date} Date actuelle
[time] {heure} Heure actuelle
[titre] {html-title} Titre du document

Mappages de gestion des sorties

NReco PDF Generator IronPDF Notes
byte[] pdfBytes = GeneratePdf(html) PdfDocument pdf = RenderHtmlAsPdf(html) Objet retourné
File.WriteAllBytes(path, bytes) pdf.SaveAs(path) Sauvegarde directe
return pdfBytes return pdf.BinaryData Obtenir un tableau d'octets
new MemoryStream(pdfBytes) pdf.Stream Obtenir un flux

Exemples de migration de code

Exemple 1 : HTML de base vers PDF

Avant (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

Aprè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 différence fondamentale réside dans le type de retour et le modèle de sauvegarde. Le HtmlToPdfConverter.GeneratePdf() de NReco PDF Generatorrenvoie un byte[] que vous devez écrire manuellement sur le disque à l'aide de File.WriteAllBytes(). Le ChromePdfRenderer.RenderHtmlAsPdf() d'IronPDF renvoie un objet PdfDocument avec une méthode SaveAs() intégrée.

Cette approche orientée objet offre des avantages supplémentaires : vous pouvez manipuler le PDF (ajouter des filigranes, fusionner des documents, ajouter de la sécurité) avant de l'enregistrer. Si vous avez besoin des octets bruts pour des raisons de compatibilité avec le code existant, utilisez pdf.BinaryData. Voir la documentation HTML vers PDF pour des options de rendu supplémentaires.

Exemple 2 : Taille de page personnalisée avec marges

Avant (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

Aprè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 utilise des dimensions numériques (PageWidth = 210, PageHeight = 297) et un objet PageMargins.IronPDFutilise l'enum PdfPaperSize(qui comprend des tailles standard comme A4, Letter, Legal) et des propriétés de marge individuelles sur l'objet RenderingOptions.

Les principaux changements liés à la migration :

  • PageWidth / PageHeightRenderingOptions.PaperSize = PdfPaperSize.A4
  • new PageMargins { Top = 10, ... }→ Propriétés individuelles : RenderingOptions.MarginTop = 10

Pour les tailles de papier personnalisées non couvertes par l'énumération, utilisez RenderingOptions.SetCustomPaperSizeinMilimeters(width, height). En savoir plus sur les options de configuration des pages.

Exemple 3 : Conversion d'une URL en PDF

Avant (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

Aprè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 utilise la méthode GeneratePdfFromFile() au nom déroutant, à la fois pour les fichiers locaux et les URL, avec un second paramètre nullable.IronPDFpropose des méthodes dédiées : RenderUrlAsPdf() pour les URL et RenderHtmlFileAsPdf() pour les fichiers HTML locaux.

L'approche d'IronPDF est plus propre et plus intuitive. Pour les applications web asynchrones, utilisez await renderer.RenderUrlAsPdfAsync(url) pour éviter de bloquer les threads - ce que NReco PDF Generatorne peut tout simplement pas faire.


Notesde migration essentielles

Conversion de la valeur du zoom

NReco PDF Generator utilise des valeurs flottantes (0,0-2,0), tandis qu'IronPDF utilise des nombres entiers en pourcentage :

// 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

Mise à jour de la syntaxe des espaces réservés

Tous les marqueurs d'en-tête et de pied de page doivent être mis à jour :

NReco PDF Generator IronPDF
[page] {page}
[topage] {total-pages}
[date] {date}
[titre] {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

Changement de type de retour

NReco PDF Generator renvoie directement les byte[] ;IronPDFrenvoie PdfDocument :

// NReco PDF Generatorpattern:
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;
// NReco PDF Generatorpattern:
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

Sécurité des threads et réutilisabilité

NReco PDF Generator crée généralement un nouveau convertisseur par appel. Le ChromePdfRendererd'IronPDF est à l'abri des threads et peut être réutilisé :

// NReco PDF Generatorpattern (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;
}
// NReco PDF Generatorpattern (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

Support asynchrone (nouvelle capacité)

IronPDF prend en charge les modèles async/await que NReco PDF Generatorne peut pas fournir :

// 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

Dépannage

Édition 1 : HtmlToPdfConverter introuvable

Problème : la classe HtmlToPdfConvertern'existe pas dans IronPDF.

Solution : Utiliser ChromePdfRenderer :

// 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

Sujet 2 : GeneratePdf renvoie un type erroné

Problème : le code attend byte[] mais reçoit PdfDocument .

Solution : Accédez à la propriété .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

Sujet 3 : Objet PageMargins introuvable

Problème : la classe PageMarginsn'existe pas dans IronPDF.

Solution : Utiliser les propriétés de marge individuelles :

// 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

Sujet 4 : Les numéros de page n'apparaissent pas

Problème : les espaces réservés [page]et [topage]ne fonctionnent pas.

Solution : Mise à jour de la syntaxe des espaces réservés d'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

Liste de contrôle de la migration

Pré-migration

  • Recenser toutes les utilisations NReco.PdfGenerator dans le code source
  • Documentez toutes les valeurs CustomWkHtmlArgs et CustomWkHtmlPageArgs
  • Lister tous les modèles HTML d'en-tête/de pied de page avec espaces réservés
  • Identifier les exigences asynchrones (contrôleurs web, services)
  • Vérifier les paramètres de zoom et de marge
  • Sauvegarder les fichiers PDF existants à des fins de comparaison
  • Obtenir une clé de licence IronPDF

Modifications du paquet

  • Supprimer le package NuGet NReco.PdfGenerator
  • Installez le package NuGet IronPdf : dotnet add package IronPdf
  • Mettre à jour les importations d'espace de noms en using NReco.PdfGenerator; par using IronPdf;

Modifications du code

  • Ajouter la configuration de la clé de licence au démarrage
  • Remplacez HtmlToPdfConverterpar ChromePdfRenderer
  • Remplacez GénérerPdf(html)par RenderHtmlAsPdf(html)
  • Remplacez GeneratePdfFromFile(url, null) par RenderUrlAsPdf(url)
  • Convertir l'objet PageMarginsen propriétés de marge individuelles
  • Mettre à jour les valeurs de zoom, qui sont désormais converties en pourcentages.
  • Mise à jour de la syntaxe des espaces réservés : [page]{page}, [topage]{total-pages}
  • Remplacez File.WriteAllBytes() par pdf.SaveAs()
  • Convertir les appels synchrones en appels asynchrones lorsque cela s'avère utile

Après la migration

  • Supprimer les fichiers binaires wkhtmltopdf du projet/déploiement
  • Mettez à jour les fichiers Docker pour supprimer l'installation de wkhtmltopdf
  • Effectuer des tests de régression comparant les résultats PDF
  • Vérifier que les espaces réservés à l'en-tête et au pied de page s'affichent correctement
  • Testé sur toutes les plateformes cibles (Windows, Linux, macOS)
  • Mettre à jour le pipeline CI/CD pour supprimer les étapes wkhtmltopdf
  • Mettre à jour l'analyse de sécurité pour confirmer la suppression des CVE

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite