using System; using System.Collections.Generic; using System.Linq; using System.Reflection.PortableExecutable; using System.Text; using System.Threading.Tasks; using MigraDoc.DocumentObjectModel; using MigraDoc.DocumentObjectModel.Shapes.Charts; using MigraDoc.Rendering; namespace ProjectLibrary.Reports; public class PdfBuilder { private readonly string _filePath; private readonly Document _document; public PdfBuilder(string filePath) { if (string.IsNullOrWhiteSpace(filePath)) { throw new ArgumentNullException(nameof(filePath)); } if (File.Exists(filePath)) { File.Delete(filePath); } _filePath = filePath; _document = new Document(); DefineStyles(); } public PdfBuilder AddHeader(string header) { _document.AddSection().AddParagraph(header, "NormalBold"); return this; } public PdfBuilder AddPieChart(string title, List<(string Caption, double Value)> data) { if (data == null || data.Count == 0) { return this; } var chart = new Chart(ChartType.Pie2D); var series = chart.SeriesCollection.AddSeries(); series.Add(data.Select(x => x.Value).ToArray()); var xseries = chart.XValues.AddXSeries(); xseries.Add(data.Select(x => x.Caption).ToArray()); chart.DataLabel.Type = DataLabelType.Percent; chart.DataLabel.Position = DataLabelPosition.OutsideEnd; chart.Width = Unit.FromCentimeter(16); chart.Height = Unit.FromCentimeter(12); chart.TopArea.AddParagraph(title); chart.XAxis.MajorTickMark = TickMarkType.Outside; chart.YAxis.MajorTickMark = TickMarkType.Outside; chart.YAxis.HasMajorGridlines = true; chart.PlotArea.LineFormat.Width = 1; chart.PlotArea.LineFormat.Visible = true; chart.TopArea.AddLegend(); _document.LastSection.Add(chart); return this; } public void Build() { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var renderer = new PdfDocumentRenderer(true) { Document = _document }; renderer.RenderDocument(); renderer.PdfDocument.Save(_filePath); } private void DefineStyles() { var headerStyle = _document.AddStyle("NormalBold", "Normal"); headerStyle.Font.Bold = true; headerStyle.Font.Size = 14; } }