feat: add FundChartSectionRenderer (chart PNG wrapped as PDF landscape page)

This commit is contained in:
2026-06-08 17:47:21 +02:00
parent d26ca9f7bd
commit 5347424e42

View File

@@ -0,0 +1,52 @@
using CertReports.Syncfusion.Services.Interfaces;
using Syncfusion.Drawing;
using Syncfusion.Pdf;
using Syncfusion.Pdf.Graphics;
namespace CertReports.Syncfusion.Services.Implementations;
public class FundChartSectionRenderer
{
private readonly IFundDataService _dataService;
private readonly ILogger<FundChartSectionRenderer> _logger;
public FundChartSectionRenderer(IFundDataService dataService,
ILogger<FundChartSectionRenderer> logger)
{
_dataService = dataService;
_logger = logger;
}
public async Task<PdfDocument?> RenderAsync(string isin, string instrumentName)
{
try
{
var points = await _dataService.GetChartPricesAsync(isin);
var pngBytes = FundSkiaChartRenderer.Render(points, instrumentName,
width: 1100, height: 650);
return WrapInPdf(pngBytes);
}
catch (Exception ex)
{
_logger.LogError(ex, "Errore FundChartSectionRenderer per ISIN {Isin}", isin);
return null;
}
}
private static PdfDocument WrapInPdf(byte[] pngBytes)
{
var doc = new PdfDocument();
doc.PageSettings.Size = PdfPageSize.A4;
doc.PageSettings.Orientation = PdfPageOrientation.Landscape;
doc.PageSettings.Margins.All = 20;
var page = doc.Pages.Add();
var g = page.Graphics;
float w = page.GetClientSize().Width;
float h = page.GetClientSize().Height;
using var imgStream = new MemoryStream(pngBytes);
var pdfImage = PdfImage.FromStream(imgStream);
g.DrawImage(pdfImage, new RectangleF(0, 0, w, h));
return doc;
}
}