using BlackRock.Reporting.API.Core.Interfaces; using iTextSharp.text; using iTextSharp.text.pdf; using PuppeteerSharp; namespace BlackRock.Reporting.API.Persistence { public class PdfGenerator : IPdfGenerator { private readonly IHostEnvironment host; public PdfGenerator(IHostEnvironment host) { this.host = host; } public async Task Generate(string url, string path, PdfOptions options) { await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision); var opts = new LaunchOptions { Headless = true }; try { using (var browser = await Puppeteer.LaunchAsync(opts)) using (var page = await browser.NewPageAsync()) { await page.GoToAsync(url, WaitUntilNavigation.DOMContentLoaded); var allResultsSelector = ".chartjs-render-monitor"; await page.WaitForSelectorAsync(allResultsSelector); await EvaluateScript(page, "dist/main.js"); // await page.ClickAsync("button#btnLogin"); await page.PdfAsync(path, options); var pixels = CalculatePixels(options.MarginOptions.Top); ModifyPDF(path, pixels); } } catch (Exception ex) { var e = ex.Message; } } public async Task Isolate(string url, string path, PdfOptions options) { await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision); var opts = new LaunchOptions { Headless = true }; using (var browser = await Puppeteer.LaunchAsync(opts)) using (var page = await browser.NewPageAsync()) { await page.GoToAsync(url, WaitUntilNavigation.DOMContentLoaded); var allResultsSelector = ".chartjs-render-monitor"; await page.WaitForSelectorAsync(allResultsSelector); await page.EvaluateFunctionAsync("() => document.getElementById('sel').selectedIndex = " + ((options.Landscape) ? 1 : 0)); await page.ClickAsync("button.dugme"); await EvaluateScript(page, "dist/main.js"); await EvaluateScript(page, "dist/main2.js"); await page.PdfAsync(path, options); } } private async Task EvaluateScript(Page page, string fileName) { string path2 = Path.Combine(host.ContentRootPath, fileName); var result = await System.IO.File.ReadAllTextAsync(path2); await page.EvaluateExpressionAsync(result); } private void ModifyPDF(string path, double marginTop) { var filePath = path; byte[] bytes = System.IO.File.ReadAllBytes(filePath); var pdfReader = new PdfReader(bytes); using (Stream output = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None)) { using (PdfStamper pdfStamper = new PdfStamper(pdfReader, output)) { for (int pageIndex = 1; pageIndex <= pdfReader.NumberOfPages; pageIndex++) { pdfStamper.FormFlattening = false; Rectangle pageRectangle = pdfReader.GetPageSizeWithRotation(pageIndex); PdfContentByte pdfData = pdfStamper.GetOverContent(pageIndex); pdfData.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 10); PdfGState graphicsState = new PdfGState { FillOpacity = 0.3F }; pdfData.SetGState(graphicsState); Image image = Image.GetInstance(Path.Combine(host.ContentRootPath, "logo.png")); var OriginalWidth = image.Width; var OriginialHeight = image.Height; var scale = OriginalWidth / OriginialHeight; OriginialHeight = (float)marginTop - 5; OriginalWidth = OriginialHeight * scale; image.ScaleAbsoluteWidth(OriginalWidth); image.ScaleAbsoluteHeight(OriginialHeight); image.SetAbsolutePosition(5, pageRectangle.Height - OriginialHeight - 5); pdfData.AddImage(image); } } output.Close(); output.Dispose(); } } private double CalculatePixels(string v) { float Result; if (float.TryParse(v, out Result)) return 2.83 * Result; var num = float.Parse(v.Split(' ')[0]); return 2.83 * num; } } }