72 lines
2.4 KiB
C#
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();
|
|
}
|
|
|
|
}
|
|
} |