| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- 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;
- }
- }
- }
|