using FormLibrary.HelperClasses; using MigraDoc.DocumentObjectModel; using MigraDoc.DocumentObjectModel.Shapes; using MigraDoc.DocumentObjectModel.Shapes.Charts; using MigraDoc.Rendering; using OxyPlot.Series; using OxyPlot; using System; using System.Collections.Generic; using System.ComponentModel; using OxyPlot.WindowsForms; using OxyPlot.Legends; using OxyPlot.Annotations; namespace FormLibrary { public partial class ComponentHistogramToPdf : Component { public ComponentHistogramToPdf() { InitializeComponent(); } public ComponentHistogramToPdf(IContainer container) { container.Add(this); InitializeComponent(); } public void CreateHistogramPdf(string filePath, string documentTitle, string chartTitle, LegendPositions legendPosition, List chartData) { if (string.IsNullOrEmpty(filePath)) throw new ArgumentException("Путь к файлу не может быть пустым."); if (string.IsNullOrEmpty(documentTitle)) throw new ArgumentException("Название документа не может быть пустым."); if (string.IsNullOrEmpty(chartTitle)) throw new ArgumentException("Заголовок диаграммы не может быть пустым."); if (chartData == null || chartData.Count == 0) throw new ArgumentException("Набор данных не может быть пустым."); foreach (var data in chartData) { if (string.IsNullOrEmpty(data.SeriesName) || data.Data == null || data.Data.Count == 0) throw new ArgumentException($"Набор данных для серии '{data.SeriesName}' некорректен."); } // создание графика var plotModel = new PlotModel { Title = chartTitle }; foreach (var data in chartData) { var barSeries = new BarSeries { Title = data.SeriesName }; foreach (var item in data.Data) { barSeries.Items.Add(new BarItem(item.Value)); } plotModel.Series.Add(barSeries); } // Добавление легенды AddLegend(plotModel, legendPosition); // сохранение графика в изображение var pngExporter = new PngExporter { Width = 600, Height = 400 }; using (var stream = new MemoryStream()) { pngExporter.Export(plotModel, stream); File.WriteAllBytes("chart.png", stream.ToArray()); } // создание документа Document document = new Document(); document.Info.Title = documentTitle; document.Info.Subject = "Гистограмма"; Section section = document.AddSection(); section.AddParagraph(chartTitle, "Heading1"); // вставка изображения в PDF var image = section.AddImage("chart.png"); image.Width = Unit.FromCentimeter(15); PdfDocumentRenderer renderer = new PdfDocumentRenderer(true) { Document = document }; renderer.RenderDocument(); renderer.PdfDocument.Save(filePath); File.Delete("chart.png"); } //добавление легенды private void AddLegend(PlotModel plotModel, LegendPositions legendPosition) { // Создание легенды var legend = new OxyPlot.Legends.Legend { LegendPlacement = LegendPlacement.Outside, LegendPosition = ConvertLegendPosition(legendPosition), LegendOrientation = LegendOrientation.Vertical }; plotModel.Legends.Add(legend); } // конвертация позиции легенды private OxyPlot.Legends.LegendPosition ConvertLegendPosition(LegendPositions legendPosition) { return legendPosition switch { LegendPositions.Top => OxyPlot.Legends.LegendPosition.TopCenter, LegendPositions.Bottom => OxyPlot.Legends.LegendPosition.BottomCenter, LegendPositions.Left => OxyPlot.Legends.LegendPosition.LeftTop, LegendPositions.Right => OxyPlot.Legends.LegendPosition.RightTop, _ => OxyPlot.Legends.LegendPosition.TopCenter, // Положение по умолчанию }; } } }