La génération de rapports simples au format PDF dans une application ASP.NET Core peut s'avérer fastidieuse si l'on doit constamment rechercher de la documentation. Ce guide propose une approche simplifiée pour cette tâche en utilisant la bibliothèque DinkToPDF.
Ce tutoriel vous guidera à travers les étapes nécessaires pour intégrer la génération de documents PDF dans votre projet ASP.NET Core. Vous pourrez ainsi gagner un temps précieux.
Prérequis et configuration initiale
Pour commencer, vous pouvez cloner le dépôt de code source associé à cet article. Il contient des exemples de création de documents PDF. N'hésitez pas à laisser une étoile si le code vous est utile.
Créez un nouveau projet ASP.NET Core (le type, MVC ou API, n'a pas d'importance pour cet exemple). Une fois le projet créé, installez le package NuGet DinkToPDF.
Vous devrez également télécharger le dossier "NativeLibrary" depuis le dépôt de code. Ce dossier contient des bibliothèques natives pour les architectures 32 bits et 64 bits. Choisissez celle qui correspond à votre système d'exploitation ; nous utiliserons ici la version 64 bits.
Enfin, intégrez la bibliothèque au démarrage de l'application et configurez l'injection de dépendances pour DinkToPDF.
public void ConfigureServices(IServiceCollection services)
{
// Assure le chargement correct des bibliothèques natives
var context = new CustomAssemblyLoadContext();
// Chemin vers la bibliothèque native wkhtmltox (adaptable selon votre structure)
context.LoadUnmanagedLibrary(Path.Combine(Directory.GetCurrentDirectory(), "libwkhtmltox.dll"));
// Configuration de l'injection de dépendances pour le convertisseur PDF
services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));
services.AddControllers();
}
Modélisation des données
Dans un scénario réel, les données pour les documents PDF proviendraient généralement d'une base de données ou d'une API externe. Pour simplifier, nous allons simuler la récupération de données à partir d'une source locale. Nous allons ensuite créer un modèle HTML pour ces données.
public class Employee
{
public string Name { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public string Gender { get; set; }
}
Créez un nouveau dossier nommé Services dans votre projet, et ajoutez-y deux fichiers : DataServices.cs et TemplateGenerator.cs. La structrue devrait ressembler à ceci :
using System.Collections.Generic;
public static class DataServices
{
public static List<Employee> GetAllEmployees()
{
// Simulation de données d'employés
return new List<Employee>
{
new Employee { Name = "Jean Dupont", LastName = "Martin", Age = 35, Gender = "Homme" },
new Employee { Name = "Alice", LastName = "Durand", Age = 22, Gender = "Femme" },
new Employee { Name = "Pierre", LastName = "Bernard", Age = 40, Gender = "Homme" },
new Employee { Name = "Sophie", LastName = "Leroy", Age = 30, Gender = "Femme" },
new Employee { Name = "Marc", LastName = "Petit", Age = 45, Gender = "Homme" }
};
}
}
Le service DataServices fournit des données fictives. Maintenant, nous devons générer un modèle HTML. Modifiez le fichier TemplateGenerator.cs comme suit :
using System.Text;
using System.Collections.Generic;
public static class TemplateGenerator
{
public static string GetHtmlString()
{
var employees = DataServices.GetAllEmployees();
var sb = new StringBuilder();
sb.Append(@"
<style>
.header {
text-align: center;
color: darkgreen;
padding-bottom: 35px;
}
table {
width: 80%;
border-collapse: collapse;
margin: 20px auto;
}
td, th {
border: 1px solid gray;
padding: 15px;
font-size: 16px;
text-align: center;
}
table th {
background-color: darkgreen;
color: white;
}
</style>
<div class="header"><h1>Rapport PDF Généré</h1></div>
<table>
<tr>
<th>Nom</th>
<th>Prénom</th>
<th>Âge</th>
<th>Genre</th>
</tr>");
foreach (var emp in employees)
{
sb.AppendFormat(@"<tr>
<td>{0}</td>
<td>{1}</td>
<td>{2}</td>
<td>{3}</td>
</tr>", emp.Name, emp.LastName, emp.Age, emp.Gender);
}
sb.Append(@"
</table>
");
return sb.ToString();
}
}
Notez que le style CSS est maintenant intégré directement dans le modèle HTML pour plus de simplicité. Si vous préférez utiliser des fichiers CSS externes, vous devrez les placer dans un répertoire approprié (par exemple, wwwroot/css) et les référencer via le chemin du serveur dans la configuration du contrôleur.
Logique du contrôleur
Enfin, implémentez la logique de génération du PDF dans un contrôleur. Créez un contrôleur API (par exemple, PdfCreatorController) :
using DinkToPdf;
using DinkToPdf.Contracts;
using Microsoft.AspNetCore.Mvc;
using System.IO;
[Route("api/[controller]")]
[ApiController]
public class PdfCreatorController : ControllerBase
{
private readonly IConverter _converter;
public PdfCreatorController(IConverter converter)
{
_converter = converter;
}
[HttpGet("generate")]
public IActionResult GeneratePdf()
{
// Configuration globale du document PDF
var globalSettings = new GlobalSettings
{
ColorMode = ColorMode.Color,
Orientation = Orientation.Portrait,
PaperSize = PaperKind.A4,
// Marges en mm
Margins = new MarginSettings { Top = 10, Bottom = 10, Left = 10, Right = 10 },
DocumentTitle = "Rapport PDF"
};
// Configuration du contenu HTML et des éléments spécifiques
var objectSettings = new ObjectSettings
{
PagesCount = true,
HtmlContent = TemplateGenerator.GetHtmlString(),
// Spécification de l'encodage et du chemin vers un fichier CSS externe si nécessaire
WebSettings = { DefaultEncoding = "utf-8" /*, UserStyleSheet = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "css", "styles.css") */ },
HeaderSettings = { FontName = "Arial", FontSize = 9, Right = "Page [page] sur [toPage]", Line = true },
FooterSettings = { FontName = "Arial", FontSize = 9, Line = true, Center = "Pied de page du rapport" }
};
// Création du document PDF à convertir
var pdfDocument = new HtmlToPdfDocument()
{
GlobalSettings = globalSettings,
Objects = { objectSettings }
};
// Conversion du document HTML en PDF
var pdfBytes = _converter.Convert(pdfDocument);
// Retourne le fichier PDF généré
return File(pdfBytes, "application/pdf", "Rapport.pdf");
}
}
Explication du code
- Injection de dépendances : L'interface
IConverterest injectée dans le constructeur du contrôleur pour permettre la conversion HTML vers PDF. GlobalSettings: Cette classe permet de définir les propriétés globales du document PDF, telles que le mode couleur, l'orientation, la taille du papier et le titre du document.ObjectSettings: Cette classe configure le contenu du document PDF. On y spécifie notamment la visibilité du compteur de pages, le contenu HTML à convertir (viaHtmlContent), et les paramètres de l'en-tête et du pied de page. LesWebSettingspermettent de définir l'encodage et de référencer un fichier CSS externe pour la mise en forme.HtmlToPdfDocument: Cette classe regroupe lesGlobalSettingset lesObjectSettingspour former le document complet à convertir._converter.Convert(): Méthode principale qui effectue la conversion du document HTML en un tableau d'octets représentant le fichier PDF.File(): Méthode du contrôleur qui retourne le contenu binaire du PDF avec le type MIME approprié.
Lancement et test
Lancez votre application ASP.NET Core. En accédant à l'URL de votre API (par exemple, /api/PdfCreator/generate), vous devriez être envité à télécharger le fichier PDF généré.
Cette approche permet de générer facilement des documents PDF dans ASP.NET Core, en offrant une flexibilité pour la personnalisation du contenu et de la mise en forme.