Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

PdfGenerator.cs 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. using BlackRock.Reporting.API.Core.Interfaces;
  2. using iTextSharp.text;
  3. using iTextSharp.text.pdf;
  4. using PuppeteerSharp;
  5. namespace BlackRock.Reporting.API.Persistence
  6. {
  7. public class PdfGenerator : IPdfGenerator
  8. {
  9. private readonly IHostEnvironment host;
  10. public PdfGenerator(IHostEnvironment host)
  11. {
  12. this.host = host;
  13. }
  14. public async Task Generate(string url, string path, PdfOptions options)
  15. {
  16. await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
  17. var opts = new LaunchOptions
  18. {
  19. Headless = true
  20. };
  21. try
  22. {
  23. using (var browser = await Puppeteer.LaunchAsync(opts))
  24. using (var page = await browser.NewPageAsync())
  25. {
  26. await page.GoToAsync(url, WaitUntilNavigation.DOMContentLoaded);
  27. var allResultsSelector = ".chartjs-render-monitor";
  28. await page.WaitForSelectorAsync(allResultsSelector);
  29. await EvaluateScript(page, "dist/main.js");
  30. // await page.ClickAsync("button#btnLogin");
  31. await page.PdfAsync(path, options);
  32. var pixels = CalculatePixels(options.MarginOptions.Top);
  33. ModifyPDF(path, pixels);
  34. }
  35. }
  36. catch (Exception ex)
  37. {
  38. var e = ex.Message;
  39. }
  40. }
  41. public async Task Isolate(string url, string path, PdfOptions options)
  42. {
  43. await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
  44. var opts = new LaunchOptions
  45. {
  46. Headless = true
  47. };
  48. using (var browser = await Puppeteer.LaunchAsync(opts))
  49. using (var page = await browser.NewPageAsync())
  50. {
  51. await page.GoToAsync(url, WaitUntilNavigation.DOMContentLoaded);
  52. var allResultsSelector = ".chartjs-render-monitor";
  53. await page.WaitForSelectorAsync(allResultsSelector);
  54. await page.EvaluateFunctionAsync("() => document.getElementById('sel').selectedIndex = " + ((options.Landscape) ? 1 : 0));
  55. await page.ClickAsync("button.dugme");
  56. await EvaluateScript(page, "dist/main.js");
  57. await EvaluateScript(page, "dist/main2.js");
  58. await page.PdfAsync(path, options);
  59. }
  60. }
  61. private async Task EvaluateScript(Page page, string fileName)
  62. {
  63. string path2 = Path.Combine(host.ContentRootPath, fileName);
  64. var result = await System.IO.File.ReadAllTextAsync(path2);
  65. await page.EvaluateExpressionAsync(result);
  66. }
  67. private void ModifyPDF(string path, double marginTop)
  68. {
  69. var filePath = path;
  70. byte[] bytes = System.IO.File.ReadAllBytes(filePath);
  71. var pdfReader = new PdfReader(bytes);
  72. using (Stream output = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None))
  73. {
  74. using (PdfStamper pdfStamper = new PdfStamper(pdfReader, output))
  75. {
  76. for (int pageIndex = 1; pageIndex <= pdfReader.NumberOfPages; pageIndex++)
  77. {
  78. pdfStamper.FormFlattening = false;
  79. Rectangle pageRectangle = pdfReader.GetPageSizeWithRotation(pageIndex);
  80. PdfContentByte pdfData = pdfStamper.GetOverContent(pageIndex);
  81. pdfData.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 10);
  82. PdfGState graphicsState = new PdfGState
  83. {
  84. FillOpacity = 0.3F
  85. };
  86. pdfData.SetGState(graphicsState);
  87. Image image = Image.GetInstance(Path.Combine(host.ContentRootPath, "logo.png"));
  88. var OriginalWidth = image.Width;
  89. var OriginialHeight = image.Height;
  90. var scale = OriginalWidth / OriginialHeight;
  91. OriginialHeight = (float)marginTop - 5;
  92. OriginalWidth = OriginialHeight * scale;
  93. image.ScaleAbsoluteWidth(OriginalWidth);
  94. image.ScaleAbsoluteHeight(OriginialHeight);
  95. image.SetAbsolutePosition(5, pageRectangle.Height - OriginialHeight - 5);
  96. pdfData.AddImage(image);
  97. }
  98. }
  99. output.Close();
  100. output.Dispose();
  101. }
  102. }
  103. private double CalculatePixels(string v)
  104. {
  105. float Result;
  106. if (float.TryParse(v, out Result))
  107. return 2.83 * Result;
  108. var num = float.Parse(v.Split(' ')[0]);
  109. return 2.83 * num;
  110. }
  111. }
  112. }