PDF из HTML в .NET (бесплатно). Начало
Создание качественных PDF-отчётов в .NET не обязательно должно быть мучением. Тем, кто хоть немного работает с HTML, проще будет использовать преобразование из HTML в PDF.
Но многие популярные библиотеки требуют коммерческой лицензии. В этой серии рассмотрим бесплатный подход с использованием:
- Handlebars.NET для шаблонов,
- PuppeteerSharp для рендеринга.
Это даёт вам полный контроль над макетом, стилем и содержимым:
- Богатая стилизация с помощью CSS,
- Легкий просмотр/отладка в браузере,
- Поддержка диаграмм/изображений через JS/CSS,
- Полный контроль над макетом (медиазапросы, разрывы страниц и т. д.).
Минусы:
- Требуется установка браузера (например, Chromium),
- Медленнее, чем нативные библиотеки PDF,
- Немного сложнее в настройке.
1. Настройка
Создадим проект минимальных API и установим NuGet-пакеты:
Install-Package Handlebars.Net
Install-Package PuppeteerSharp
2. Создание шаблона
Это простой HTML-документ с несколькими заместителями для Handlebars. Вы заметите их по синтаксису
{{variable}}. Они будут заменены реальными данными при рендеринге шаблона.<!-- Templates/InvoiceTemplate.html -->
<html lang="en">
<head>
<style>
body {
font-family: Arial;
}
</style>
</head>
<body>
<h1>Invoice #{{Number}}</h1>
<p>Date: {{formatDate IssuedDate}}</p>
<h2>From:</h2>
<p>{{SellerAddress.CompanyName}}</p>
<p>{{SellerAddress.Email}}</p>
<h2>To:</h2>
<p>{{CustomerAddress.CompanyName}}</p>
<p>{{CustomerAddress.Email}}</p>
<h2>Items:</h2>
<table>
<tr>
<th>Name</th>
<th>Price</th>
</tr>
{{#each LineItems}}
<tr>
<td>{{Name}}</td>
<td>{{formatCurrency Price}}</td>
</tr>
{{/each}}
</table>
<p><strong>Total: {{formatCurrency Total}}</strong></p>
</body>
</html>
Вызовы функций, вроде
{{formatDate IssuedDate}} – это пользовательские вспомогательные функции, которые можно определить в Handlebars. Они регистрируются так:Handlebars.RegisterHelper("formatDate", (context, arguments) =>
{
if (arguments[0] is DateOnly date)
return date.ToString("dd/MM/yyyy");
return arguments[0]?.ToString() ?? "";
});Это позволяет, например, форматировать даты, валюты и т.п. при необходимости. Вспомогательные функции регистрируются перед компиляцией шаблона (его мы рассмотрим в продолжении), достаточно одного раза при запуске приложения.
Кроме того, в Handlebars есть встроенные управляющие конструкции, например:
-
{{#if …}} ... {{/if}} для условий, -
{{#each …}} ... {{/each}} для перебора коллекций.Продолжение следует…
Источник: https://www.milanjovanovic.tech/blog/pdf-reporting-in-dotnet-with-html-templates-and-puppeteersharp