using Library14Petrushin.Classes; using PdfSharp.Drawing; using PdfSharp.Pdf; using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Library14Petrushin { public partial class PdfCirclDiagr : Component { public void GeneratePdf( string fileName, string documentTitle, string chartTitle, LegendPosition legendPosition, List chartData) { // Проверка на заполненность входных данных if (string.IsNullOrEmpty(fileName) || string.IsNullOrEmpty(documentTitle) || string.IsNullOrEmpty(chartTitle) || chartData == null || !chartData.Any()) { throw new ArgumentException("Все входные данные должны быть заполнены."); } // Создание документа PdfDocument document = new PdfDocument(); PdfPage page = document.AddPage(); XGraphics gfx = XGraphics.FromPdfPage(page); XFont font = new XFont("Verdana", 10); // Отрисовка заголовка документа gfx.DrawString(documentTitle, new XFont("Verdana", 16, XFontStyleEx.Bold), XBrushes.Black, new XRect(0, 0, page.Width, 50), XStringFormats.Center); // Отрисовка заголовка диаграммы gfx.DrawString(chartTitle, font, XBrushes.Black, new XRect(50, 50, page.Width - 100, 30), XStringFormats.Center); // Отрисовка круговой диаграммы DrawPieChart(gfx, new XRect(50, 100, 300, 300), chartData, legendPosition); // Сохранение документа document.Save(fileName); } private void DrawPieChart(XGraphics gfx, XRect rect, List chartData, LegendPosition legendPosition) { double total = chartData.Sum(d => d.Value); double startAngle = 0; int legendX = 0; int legendY = 0; // Определение расположения легенды switch (legendPosition) { case LegendPosition.Top: legendX = (int)rect.X + (int)rect.Width / 2; legendY = (int)rect.Y - 50; break; case LegendPosition.Bottom: legendX = (int)rect.X + (int)rect.Width / 2; legendY = (int)rect.Y + (int)rect.Height + 20; break; case LegendPosition.Left: legendX = (int)rect.X - 100; legendY = (int)rect.Y + (int)rect.Height / 2; break; case LegendPosition.Right: legendX = (int)rect.X + (int)rect.Width + 20; legendY = (int)rect.Y + (int)rect.Height / 2; break; } // Отрисовка секторов диаграммы foreach (var data in chartData) { double sweepAngle = 360 * (data.Value / total); gfx.DrawPie(GetRandomBrush(), rect, startAngle, sweepAngle); startAngle += sweepAngle; // Отрисовка легенды gfx.DrawString(data.SeriesName, new XFont("Verdana", 8), XBrushes.Black, new XPoint(legendX, legendY)); legendY += 20; } } private XBrush GetRandomBrush() { Random random = new Random(); return new XSolidBrush(XColor.FromArgb(random.Next(256), random.Next(256), random.Next(256))); } } }