TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #2877 2.58K
День 2392. #ЗаметкиНаПолях
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
  • 👍 10
More from @netdeveloperdiary
  1. Oct 2, 2026День 2802. #Карьера #Юмор Секреты Программирования, Известные Только Легендам Ещё один пос…
  2. Oct 1, 2026Post #3357
  3. Sep 30, 2026Post #3356
  4. Sep 29, 2026Фото 3 (с) Анатолий Кулаков
  5. Sep 29, 2026День 2799. Конференция DotNext 2026. Часть 1 25 и 26 сентября в Москве прошла очередная ко…
  6. Sep 28, 2026День 2798. #Оффтоп Утиная Типизация в C# с Помощью Перехватчиков. Часть 2 Некоторое время…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →