Comment migrer de Syncfusion PDF vers IronPDF en C#
Full Comparison
Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Syncfusion PDF on pricing, HTML support, and licensing.
La migration de Syncfusion PDFFramework versIronPDFtransforme votre flux de production de PDF, passant d'une API graphique basée sur les coordonnées et intégrée à une grande suite à une bibliothèque autonome, HTML/CSS d'abord, avec un rendu moderne de Chromium. Ce guide fournit un chemin de migration complet, étape par étape, qui élimine les licences pour les suites uniquement, les exigences de déploiement complexes et le positionnement basé sur les coordonnées.
Pourquoi migrer de Syncfusion PDFà IronPDF
Comprendre Syncfusion PDFFramework
Le Syncfusion PDFFramework est une bibliothèque complète qui offre un large éventail de fonctionnalités pour la création, l'édition et la sécurisation de documents PDF à l'aide de C#. Ce logiciel fait partie de Essential Studio de Syncfusion, qui comprend plus d'un millier de composants pour de multiples plateformes.
Cependant, l'un de ses principaux inconvénients est qu'il ne peut pas être acheté en tant que produit autonome ; les développeurs doivent acheter l'ensemble des composants Syncfusion. Cette exigence peut s'avérer contraignante pour les équipes qui ne s'intéressent qu'aux fonctionnalités des PDF, d'autant plus que cette offre groupée peut inclure des outils inutiles pour leurs projets.
Le problème des licences d'offres groupées
Le modèle de licence de Syncfusion crée des défis importants pour les équipes qui n'ont besoin que de la fonctionnalité PDF :
- Achat de la suite uniquement : la bibliothèque PDF ne peut pas être achetée séparément ; l'achat de la suite Essential Studio complète est requis.
- Restrictions de la licence communautaire : La version gratuite nécessite à la fois un chiffre d'affaires inférieur à 1 million de dollars et moins de 5 développeurs.
- Licences de déploiement complexes : différentes licences pour les déploiements web, de bureau et serveur
- Renouvellement annuel requis : Modèle d'abonnement avec frais annuels
- Tarification par développeur : les coûts augmentent proportionnellement à la taille de l'équipe
- Suite logicielle surchargée : Inclut plus de 1 000 composants dont vous n'aurez peut-être pas besoin.
Comparaison de Syncfusion PDFet IronPDF
| Aspect | Syncfusion PDF | IronPDF |
|---|---|---|
| Modèle d'achat | Offre groupée uniquement | Autonome |
| Licence | Niveaux complexes | Simple par développeur |
| Limite de la communauté | <$1M AND <5 devs | Essai gratuit, puis licence |
| Déploiement | Plusieurs types de licences | Une licence couvre l'ensemble des |
| Style API | Graphiques basés sur les coordonnées | HTML/CSS d'abord |
| Support HTML | Requiert BlinkBinaries | Chrome natif |
| Support CSS | Limité | CSS3 complet/flexbox/grid |
| Dépendances | Plusieurs paquets | NuGet simple |
| Exigences de la suite | Oui (suite complète) | Non |
| Focus sur le PDF | Large ; partie d'une suite plus large | Étroite ; Axé sur le PDF |
IronPDF propose une approche plus ciblée en offrant ses fonctionnalités PDF en tant que produit autonome. Cette différence a un impact significatif sur les coûts et la facilité d'intégration.
Pour les équipes qui prévoient l'adoption de .NET 10 et C# 14 jusqu'en 2025 et 2026, la licence autonome d'IronPDF et l'approche HTML/CSS d'abordoffrent une flexibilité sans dépendance vis-à-vis de la suite.
Avant de commencer
Prérequis
- Environnement .NET : .NET Framework 4.6.2+ ou .NET Core 3.1+ / .NET 5/6/7/8/9+
- Accès à NuGet : possibilité d'installer des packages NuGet
- Licence IronPDF : Obtenez votre clé de licence sur IronPDF
Modifications du paquet NuGet
# Remove Syncfusion packages
dotnet remove package Syncfusion.Pdf.Net.Core
dotnet remove package Syncfusion.HtmlToPdfConverter.Net.Windows
dotnet remove package Syncfusion.Licensing
# Install IronPDF
dotnet add package IronPdf
# Remove Syncfusion packages
dotnet remove package Syncfusion.Pdf.Net.Core
dotnet remove package Syncfusion.HtmlToPdfConverter.Net.Windows
dotnet remove package Syncfusion.Licensing
# Install IronPDF
dotnet add package IronPdf
Configuration de la licence
Syncfusion:
// Must register before any Syncfusion calls
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-SYNCFUSION-KEY");
// Must register before any Syncfusion calls
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-SYNCFUSION-KEY");
' Must register before any Syncfusion calls
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-SYNCFUSION-KEY")
IronPDF :
// One-time at startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-KEY";
// One-time at startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-KEY";
' One-time at startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-KEY"
Référence API complète
Modifications de l'espace de nommage
// Before: Syncfusion PDF
using Syncfusion.Pdf;
using Syncfusion.Pdf.Graphics;
using Syncfusion.Pdf.Parsing;
using Syncfusion.HtmlConverter;
using Syncfusion.Drawing;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: Syncfusion PDF
using Syncfusion.Pdf;
using Syncfusion.Pdf.Graphics;
using Syncfusion.Pdf.Parsing;
using Syncfusion.HtmlConverter;
using Syncfusion.Drawing;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
Imports IronPdf
Imports IronPdf.Rendering
Mappages de l'API de base
| Syncfusion | IronPDF |
|---|---|
PdfDocument |
ChromePdfRenderer |
PdfLoadedDocument |
PdfDocument.FromFile() |
HtmlToPdfConverter |
ChromePdfRenderer |
graphics.DrawString() |
Éléments de texte HTML |
graphics.DrawImage() |
<img> balise |
PdfGrid |
HTML <table> |
PdfStandardFont |
CSS font-family |
PdfBrushes.Black |
CSS color: black |
document.Security |
pdf.SecuritySettings |
PdfTextExtractor |
pdf.ExtractAllText() |
ImportPageRange() |
PdfDocument.Merge() |
document.Save(stream) |
pdf.SaveAs(path) |
document.Close(true) |
Pas nécessaire |
Exemples de migration de code
Exemple 1 : Conversion HTML/URL vers PDF
Avant (Syncfusion PDF):
// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.HtmlConverter;
using Syncfusion.Pdf;
using System.IO;
class Program
{
static void Main()
{
// Initialize HTML to PDF converter
HtmlToPdfConverter htmlConverter = new HtmlToPdfConverter();
// Convert URL to PDF
PdfDocument document = htmlConverter.Convert("https://www.example.com");
// Save the document
FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
document.Save(fileStream);
document.Close(true);
fileStream.Close();
}
}
// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.HtmlConverter;
using Syncfusion.Pdf;
using System.IO;
class Program
{
static void Main()
{
// Initialize HTML to PDF converter
HtmlToPdfConverter htmlConverter = new HtmlToPdfConverter();
// Convert URL to PDF
PdfDocument document = htmlConverter.Convert("https://www.example.com");
// Save the document
FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
document.Save(fileStream);
document.Close(true);
fileStream.Close();
}
}
Imports Syncfusion.HtmlConverter
Imports Syncfusion.Pdf
Imports System.IO
Module Program
Sub Main()
' Initialize HTML to PDF converter
Dim htmlConverter As New HtmlToPdfConverter()
' Convert URL to PDF
Dim document As PdfDocument = htmlConverter.Convert("https://www.example.com")
' Save the document
Dim fileStream As New FileStream("Output.pdf", FileMode.Create)
document.Save(fileStream)
document.Close(True)
fileStream.Close()
End Sub
End Module
Après (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
// Create a PDF from a URL
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
// Save the PDF
pdf.SaveAs("Output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
// Create a PDF from a URL
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
// Save the PDF
pdf.SaveAs("Output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
' Create a PDF from a URL
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
' Save the PDF
pdf.SaveAs("Output.pdf")
End Sub
End Class
Cet exemple illustre les différences fondamentales entre les API. Syncfusion PDFnécessite une instance HtmlToPdfConverter, appelant Convert() qui renvoie un PdfDocument, puis créant manuellement un FileStream, enregistrant et fermant à la fois le document et le flux.
IronPDF utilise un ChromePdfRenderer avec RenderUrlAsPdf() en seulement trois lignes de code. Pas de gestion FileStream, pas d'appels Close() —IronPDFgère le nettoyage automatiquement. Consultez la documentation HTML vers PDF pour des exemples complets.
Exemple 2 : Création d'un PDF à partir d'un texte
Avant (Syncfusion PDF):
// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.Pdf;
using Syncfusion.Pdf.Graphics;
using Syncfusion.Drawing;
using System.IO;
class Program
{
static void Main()
{
// Create a new PDF document
PdfDocument document = new PdfDocument();
// Add a page
PdfPage page = document.Pages.Add();
// Create a font
PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 12);
// Draw text
page.Graphics.DrawString("Hello, World!", font, PdfBrushes.Black, new PointF(10, 10));
// Save the document
FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
document.Save(fileStream);
document.Close(true);
fileStream.Close();
}
}
// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.Pdf;
using Syncfusion.Pdf.Graphics;
using Syncfusion.Drawing;
using System.IO;
class Program
{
static void Main()
{
// Create a new PDF document
PdfDocument document = new PdfDocument();
// Add a page
PdfPage page = document.Pages.Add();
// Create a font
PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 12);
// Draw text
page.Graphics.DrawString("Hello, World!", font, PdfBrushes.Black, new PointF(10, 10));
// Save the document
FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
document.Save(fileStream);
document.Close(true);
fileStream.Close();
}
}
Imports Syncfusion.Pdf
Imports Syncfusion.Pdf.Graphics
Imports Syncfusion.Drawing
Imports System.IO
Module Program
Sub Main()
' Create a new PDF document
Dim document As New PdfDocument()
' Add a page
Dim page As PdfPage = document.Pages.Add()
' Create a font
Dim font As PdfFont = New PdfStandardFont(PdfFontFamily.Helvetica, 12)
' Draw text
page.Graphics.DrawString("Hello, World!", font, PdfBrushes.Black, New PointF(10, 10))
' Save the document
Dim fileStream As New FileStream("Output.pdf", FileMode.Create)
document.Save(fileStream)
document.Close(True)
fileStream.Close()
End Sub
End Module
Après (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
// Create a PDF from HTML string
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello, World!</h1>");
// Save the document
pdf.SaveAs("Output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
// Create a PDF from HTML string
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello, World!</h1>");
// Save the document
pdf.SaveAs("Output.pdf");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Class Program
Shared Sub Main()
' Create a PDF from HTML string
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello, World!</h1>")
' Save the document
pdf.SaveAs("Output.pdf")
End Sub
End Class
Syncfusion PDF utilise un modèle graphique basé sur les coordonnées. Vous créez un PdfDocument, ajoutez un PdfPage, créez un PdfFont avec PdfFontFamily.Helvetica, puis appelez page.Graphics.DrawString() avec des coordonnées explicites (new PointF(10, 10)), une police et un pinceau (PdfBrushes.Black). Enfin, vous gérez la création et la suppression de FileStream.
IronPDF utilise une approche HTML/CSS d'abord. Instead of coordinates, you write <h1>Hello, World!</h1> and let CSS handle positioning, fonts, and colors. Cette approche est plus simple, plus facile à maintenir et tire parti des compétences que les développeurs possèdent déjà. Pour en savoir plus, consultez nos tutoriels.
Exemple 3 : Fusionner des documents PDF
Avant (Syncfusion PDF):
// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.Pdf;
using Syncfusion.Pdf.Parsing;
using System.IO;
class Program
{
static void Main()
{
// Load the first PDF document
FileStream stream1 = new FileStream("Document1.pdf", FileMode.Open, FileAccess.Read);
PdfLoadedDocument loadedDocument1 = new PdfLoadedDocument(stream1);
// Load the second PDF document
FileStream stream2 = new FileStream("Document2.pdf", FileMode.Open, FileAccess.Read);
PdfLoadedDocument loadedDocument2 = new PdfLoadedDocument(stream2);
// Merge the documents
PdfDocument finalDocument = new PdfDocument();
finalDocument.ImportPageRange(loadedDocument1, 0, loadedDocument1.Pages.Count - 1);
finalDocument.ImportPageRange(loadedDocument2, 0, loadedDocument2.Pages.Count - 1);
// Save the merged document
FileStream outputStream = new FileStream("Merged.pdf", FileMode.Create);
finalDocument.Save(outputStream);
// Close all documents
finalDocument.Close(true);
loadedDocument1.Close(true);
loadedDocument2.Close(true);
stream1.Close();
stream2.Close();
outputStream.Close();
}
}
// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.Pdf;
using Syncfusion.Pdf.Parsing;
using System.IO;
class Program
{
static void Main()
{
// Load the first PDF document
FileStream stream1 = new FileStream("Document1.pdf", FileMode.Open, FileAccess.Read);
PdfLoadedDocument loadedDocument1 = new PdfLoadedDocument(stream1);
// Load the second PDF document
FileStream stream2 = new FileStream("Document2.pdf", FileMode.Open, FileAccess.Read);
PdfLoadedDocument loadedDocument2 = new PdfLoadedDocument(stream2);
// Merge the documents
PdfDocument finalDocument = new PdfDocument();
finalDocument.ImportPageRange(loadedDocument1, 0, loadedDocument1.Pages.Count - 1);
finalDocument.ImportPageRange(loadedDocument2, 0, loadedDocument2.Pages.Count - 1);
// Save the merged document
FileStream outputStream = new FileStream("Merged.pdf", FileMode.Create);
finalDocument.Save(outputStream);
// Close all documents
finalDocument.Close(true);
loadedDocument1.Close(true);
loadedDocument2.Close(true);
stream1.Close();
stream2.Close();
outputStream.Close();
}
}
Imports Syncfusion.Pdf
Imports Syncfusion.Pdf.Parsing
Imports System.IO
Class Program
Shared Sub Main()
' Load the first PDF document
Dim stream1 As New FileStream("Document1.pdf", FileMode.Open, FileAccess.Read)
Dim loadedDocument1 As New PdfLoadedDocument(stream1)
' Load the second PDF document
Dim stream2 As New FileStream("Document2.pdf", FileMode.Open, FileAccess.Read)
Dim loadedDocument2 As New PdfLoadedDocument(stream2)
' Merge the documents
Dim finalDocument As New PdfDocument()
finalDocument.ImportPageRange(loadedDocument1, 0, loadedDocument1.Pages.Count - 1)
finalDocument.ImportPageRange(loadedDocument2, 0, loadedDocument2.Pages.Count - 1)
' Save the merged document
Dim outputStream As New FileStream("Merged.pdf", FileMode.Create)
finalDocument.Save(outputStream)
' Close all documents
finalDocument.Close(True)
loadedDocument1.Close(True)
loadedDocument2.Close(True)
stream1.Close()
stream2.Close()
outputStream.Close()
End Sub
End Class
Après (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;
class Program
{
static void Main()
{
// Load PDF documents
var pdf1 = PdfDocument.FromFile("Document1.pdf");
var pdf2 = PdfDocument.FromFile("Document2.pdf");
// Merge PDFs
var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
// Save the merged document
merged.SaveAs("Merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;
class Program
{
static void Main()
{
// Load PDF documents
var pdf1 = PdfDocument.FromFile("Document1.pdf");
var pdf2 = PdfDocument.FromFile("Document2.pdf");
// Merge PDFs
var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
// Save the merged document
merged.SaveAs("Merged.pdf");
}
}
Imports IronPdf
Imports System.Collections.Generic
Class Program
Shared Sub Main()
' Load PDF documents
Dim pdf1 = PdfDocument.FromFile("Document1.pdf")
Dim pdf2 = PdfDocument.FromFile("Document2.pdf")
' Merge PDFs
Dim merged = PdfDocument.Merge(New List(Of PdfDocument) From {pdf1, pdf2})
' Save the merged document
merged.SaveAs("Merged.pdf")
End Sub
End Class
Le contraste dans la fusion des PDF est spectaculaire. Syncfusion PDFnécessite la création d'objets FileStream pour chaque document d'entrée, leur chargement en tant qu'objets PdfLoadedDocument, la création d'un nouvel objet PdfDocument, l'appel de la fonction ImportPageRange() avec des indices de début et de fin pour chaque source, la création d'un objet de sortie FileStream, puis la fermeture de six objets distincts (finalDocument, loadedDocument1, loadedDocument2, stream1, stream2, outputStream).
IronPDF utilise PdfDocument.FromFile() pour charger chaque PDF et une méthode statique PdfDocument.Merge() qui accepte une liste de documents. Pas de gestion de flux, pas de calcul manuel de l'intervalle de pages, pas d'à-peu-près.
Différences clés dans la philosophie des API
Coordonnées vs HTML/CSS d'abord
Syncfusion PDF utilise un modèle graphique basé sur les coordonnées, hérité des bibliothèques PDF traditionnelles :
// Syncfusion: Manuel positioning
page.Graphics.DrawString("Text", font, PdfBrushes.Black, new PointF(100, 200));
page.Graphics.DrawRectangle(brush, new RectangleF(50, 50, 200, 100));
// Syncfusion: Manuel positioning
page.Graphics.DrawString("Text", font, PdfBrushes.Black, new PointF(100, 200));
page.Graphics.DrawRectangle(brush, new RectangleF(50, 50, 200, 100));
' Syncfusion: Manuel positioning
page.Graphics.DrawString("Text", font, PdfBrushes.Black, New PointF(100, 200))
page.Graphics.DrawRectangle(brush, New RectangleF(50, 50, 200, 100))
IronPDF utilise HTML/CSS pour la mise en page :
// IronPDF: CSS-based positioning
var html = @"
<div style='margin: 50px; padding: 20px; border: 1px solid black;'>
<p style='color: black;'>Text</p>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
// IronPDF: CSS-based positioning
var html = @"
<div style='margin: 50px; padding: 20px; border: 1px solid black;'>
<p style='color: black;'>Text</p>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
' IronPDF: CSS-based positioning
Dim html As String = "
<div style='margin: 50px; padding: 20px; border: 1px solid black;'>
<p style='color: black;'>Text</p>
</div>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
L'approche HTML/CSS est plus intuitive pour les développeurs web, plus facile à maintenir et produit des résultats cohérents sur différentes tailles de pages.
Gestion des flux de données et nettoyage automatique
Syncfusion PDF nécessite un flux explicite et l'élimination des documents :
// Syncfusion: Manuel cleanup
FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
document.Save(fileStream);
document.Close(true);
fileStream.Close();
// Syncfusion: Manuel cleanup
FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
document.Save(fileStream);
document.Close(true);
fileStream.Close();
' Syncfusion: Manuel cleanup
Dim fileStream As New FileStream("Output.pdf", FileMode.Create)
document.Save(fileStream)
document.Close(True)
fileStream.Close()
IronPDF se charge automatiquement du nettoyage :
// IronPDF: Automatiquecleanup
pdf.SaveAs("Output.pdf");
// IronPDF: Automatiquecleanup
pdf.SaveAs("Output.pdf");
' IronPDF: Automatiquecleanup
pdf.SaveAs("Output.pdf")
Comparaison des fonctionnalités
| Fonction | Syncfusion PDF | IronPDF |
|---|---|---|
| Achat de Standalone | Non (suite uniquement) | Oui |
| Licence | Commercial avec des restrictions communautaires | Commercial simplifié |
| HTML à PDF | Requiert BlinkBinaries | Chrome natif |
| Support CSS3 | Limité | Plein (flexbox, grille) |
| Style API | Graphiques basés sur les coordonnées | HTML/CSS d'abord |
| Gestion des flux | Manuel | Automatique |
| Dépendances | Plusieurs paquets | NuGet simple |
| Complexité du déploiement | Potentiellement complexe | Simplicité |
Liste de contrôle de la migration
Pré-migration
- Recenser toutes les utilisations de Syncfusion PDFdans le code source
- Coûts de licence des documents et exigences de déploiement
- Identifier les utilisations de
PdfGrid,PdfGraphicsetHtmlToPdfConverter - Obtenez votre clé de licenceIronPDFsur IronPDF
Mises à jour du code
- Supprimer les packages Syncfusion (
Syncfusion.Pdf.Net.Core,Syncfusion.HtmlToPdfConverter.Net.Windows,Syncfusion.Licensing) - Installer le package NuGet
IronPdf - Mise à jour des importations d'espace de noms (
using Syncfusion.Pdf;→using IronPdf;) - Remplacez
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense()parIronPdf.License.LicenseKey = "..." - Remplacez
HtmlToPdfConverter.Convert()parChromePdfRenderer.RenderUrlAsPdf()ouRenderHtmlAsPdf() - Remplacez
PdfDocument+Pages.Add()+Graphics.DrawString()parChromePdfRenderer.RenderHtmlAsPdf() - Remplacez
PdfLoadedDocumentparPdfDocument.FromFile() - Remplacez
ImportPageRange()parPdfDocument.Merge() - Remplacez
document.Save(stream)parpdf.SaveAs(path) - Supprimez tous les appels
document.Close(true)etstream.Close() - Remplacez
PdfGridpar les éléments HTML<table> - Remplacez
PdfStandardFontpar CSSfont-family - Remplacez
PdfBrushespar les propriétés CSScolor
Essai
- Comparaison visuelle des fichiers PDF générés
- Vérifier les améliorations du rendu CSS (flexbox et grid fonctionnent désormais)
- Extraction de texte de test
- Fusion et division des tests
- Comparaison des performances

