ln.templates/ln.templates.service/render/PuppeteerRenderer.cs

72 lines
2.4 KiB
C#

using System;
using System.IO;
using Jint.Native.Object;
using ln.patterns;
using PuppeteerSharp;
namespace ln.templates.service.render
{
public static class PuppeteerRenderer
{
private static BrowserFetcher _browserFetcher;
public static Optional<Stream> RenderTemplate(Template template, string resourcePath, ObjectInstance globals)
{
using (StringWriter htmlWriter = new StringWriter())
{
try
{
Context context = new Context(template.Resolver, htmlWriter);
template.Render(context, globals);
using (var browser = Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true,
}).Result)
{
using (var page = browser.NewPageAsync().Result)
{
page.GoToAsync(resourcePath).Wait();
page.SetContentAsync(htmlWriter.ToString(), new NavigationOptions()
{
}).Wait();
var footerTemplate = page.EvaluateFunctionAsync<string>($@"()=>{{
let footers = document.getElementsByTagName('footer');
if (footers.length){{
let footerHtml = footers[0].outerHTML;
footers[0].remove();
return footerHtml;
}}
return null;
}}").Result;
page.SetContentAsync(page.GetContentAsync().Result).Wait();
TempFileStream pdfTempStream = new TempFileStream(".pdf");
page.PdfAsync(pdfTempStream.Name, new PdfOptions()
{
HeaderTemplate = "<div></div>",
FooterTemplate = footerTemplate,
DisplayHeaderFooter = true,
}).Wait();
return pdfTempStream;
}
}
}
catch (Exception e)
{
return e;
}
}
}
static PuppeteerRenderer()
{
_browserFetcher = new BrowserFetcher();
_browserFetcher.DownloadAsync(BrowserFetcher.DefaultChromiumRevision).Wait();
}
}
}