تبدیل Razor Views به HTML 🖥➡️📄
گام بعدی که نیاز داریم، راهی برای تبدیل Razor view به HTML است. میتوانیم از کتابخانه Razor.Templating.Core استفاده کنیم. این کتابخانه یک API ساده ارائه میدهد تا فایل .cshtml را به یک رشته (string) تبدیل کند.
Install-Package Razor.Templating.Core
میتوانید از کلاس static RazorTemplateEngine برای فراخوانی متد RenderAsync استفاده کنید. این متد مسیر Razor view و نمونه مدل (model) که به view منتقل میشود را میپذیرد.
نمونه کد:
Invoice invoice = invoiceFactory.Create();
string html = await RazorTemplateEngine.RenderAsync(
"Views/InvoiceReport.cshtml",
invoice);
همچنین میتوانید به جای کلاس static از IRazorTemplateEngine استفاده کنید. در این حالت باید متد AddRazorTemplating را برای ثبت سرویسهای مورد نیاز با DI فراخوانی کنید. این کار همچنین زمانی لازم است که بخواهید از dependency injection در داخل Razor views با @inject استفاده کنید. توصیه میشود بعد از ثبت تمام dependencies، AddRazorTemplating را فراخوانی کنید.
services.AddRazorTemplating();
تبدیل HTML به PDF 📄✨
حالا که Razor view ما به HTML تبدیل شد، میتوانیم از آن برای تولید یک گزارش PDF استفاده کنیم. کتابخانههای زیادی این قابلیت را ارائه میدهند. کتابخانهای که من بیشترین استفاده را از آن داشتهام IronPDF است. این یک کتابخانه پولی است (و واقعاً ارزشش را دارد)، اما میدانم توسعهدهندگان به گزینههای رایگان هم علاقه دارند، بنابراین چند گزینه رایگان را در انتها معرفی میکنم.
میتوانیم از ChromePdfRenderer در IronPDF استفاده کنیم، که از مرورگر Chrome تعبیهشده استفاده میکند. این renderer متد RenderHtmlAsPdf را ارائه میدهد که یک PdfDocument تولید میکند. پس از داشتن سند، میتوانید آن را در سیستم فایل ذخیره کنید یا به صورت داده باینری صادر کنید.
var renderer = new ChromePdfRenderer();
using var pdfDocument = renderer.RenderHtmlAsPdf(html);
pdfDocument.SaveAs($"invoice-{invoice.Number}.pdf");
اگر به دنبال گزینههای رایگان هستید، کتابخانه Puppeteer Sharp را بررسی کنید. این یک نسخه NET. از کتابخانه Puppeteer است و امکان اجرای headless Chrome را فراهم میکند.
گزینه دیگر که به صورت مشروط رایگان است، NReco.PdfGenerator میباشد، اما تنها برای استقرار روی یک سرور (single-server) رایگان است.
ترکیب همه چیز با هم 🛠
بیایید همه مواردی که بررسی کردیم را استفاده کنیم تا یک Minimal API endpoint برای تولید گزارش PDF فاکتور بسازیم و آن را به صورت فایل بازگردانیم.
app.MapGet("invoice-report", async (InvoiceFactory invoiceFactory) =>
{
Invoice invoice = invoiceFactory.Create();
var html = await RazorTemplateEngine.RenderAsync(
"Views/InvoiceReport.cshtml",
invoice);
var renderer = new ChromePdfRenderer();
using var pdfDocument = renderer.RenderHtmlAsPdf(html);
return Results.File(
pdfDocument.BinaryData,
"application/pdf",
$"invoice-{invoice.Number}.pdf");
});این همان PDF گزارش تولید شده است که خروجی میدهد: 📄✅