Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

PdfGenerator.cs 4.7KB

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