using ComponentProgramming.NonVisualComponents.HelperModels; using MigraDoc.DocumentObjectModel; using MigraDoc.DocumentObjectModel.Shapes.Charts; using MigraDoc.Rendering; using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ComponentProgramming.NonVisualComponents { public partial class PdfPieChart : Component { public PdfPieChart() { InitializeComponent(); } public PdfPieChart(IContainer container) { //container.Add(this); InitializeComponent(); } public bool CreatePieChart(DataForPieChart dataForPDFPie) { // проверки if (string.IsNullOrEmpty(dataForPDFPie.FilePath) || string.IsNullOrEmpty(dataForPDFPie.DocumentTitle) || string.IsNullOrEmpty(dataForPDFPie.ChartTitle) || string.IsNullOrEmpty(dataForPDFPie.LegendName) || dataForPDFPie.Items.Count == 0) throw new ArgumentException("Недостаточно данных"); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Document _document = new Document(); var section = _document.AddSection(); var paragraph = section.AddParagraph(dataForPDFPie.DocumentTitle); paragraph.Format.Alignment = ParagraphAlignment.Center; paragraph.Format.SpaceAfter = "2cm"; Chart chart = section.AddChart(ChartType.Pie2D); chart.Width = Unit.FromCentimeter(16); chart.Height = Unit.FromCentimeter(12); chart.HeaderArea.AddParagraph(dataForPDFPie.ChartTitle); // заголовок диаграммы Series series = chart.SeriesCollection.AddSeries(); series.Name = dataForPDFPie.LegendName; // название сериии XSeries xseries = chart.XValues.AddXSeries(); foreach ((double, string) el in dataForPDFPie.Items) // заполнение серии { series.Add(el.Item1); xseries.Add(el.Item2); } switch (dataForPDFPie.diagLegend) // позиция легенды { case DiagramLegendEnum.Top: chart.TopArea.AddLegend(); break; case DiagramLegendEnum.Bottom: chart.BottomArea.AddLegend(); break; case DiagramLegendEnum.Right: chart.RightArea.AddLegend(); break; case DiagramLegendEnum.Left: chart.LeftArea.AddLegend(); break; } chart.DataLabel.Type = DataLabelType.Percent; chart.DataLabel.Position = DataLabelPosition.OutsideEnd; PdfDocumentRenderer renderer = new PdfDocumentRenderer(true); renderer.Document = _document; renderer.RenderDocument(); renderer.PdfDocument.Save(dataForPDFPie.FilePath); return true; } } }