using Components.SaveToPdfHelpers; using MigraDoc.DocumentObjectModel; using MigraDoc.Rendering; using OxyPlot.Series; using OxyPlot; using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using OxyPlot.WindowsForms; using OxyPlot.Legends; namespace Components.NonVisual { public partial class HistogramPDF : Component { public HistogramPDF() { InitializeComponent(); System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); } public HistogramPDF(IContainer container) { container.Add(this); InitializeComponent(); } public void CreateHistogramPdf(HistogramData histogramData) { if (string.IsNullOrEmpty(histogramData.filePath)) throw new ArgumentException("Путь к файлу не может быть пустым."); if (string.IsNullOrEmpty(histogramData.documentTitle)) throw new ArgumentException("Название документа не может быть пустым."); if (string.IsNullOrEmpty(histogramData.chartTitle)) throw new ArgumentException("Заголовок диаграммы не может быть пустым."); if (histogramData.chartData == null || histogramData.chartData.Count == 0) throw new ArgumentException("Набор данных не может быть пустым."); foreach (var data in histogramData.chartData) { if (string.IsNullOrEmpty(data.SeriesName) || data.Data == null || data.Data.Count == 0) throw new ArgumentException($"Набор данных для серии '{data.SeriesName}' некорректен."); } // создание графика var plotModel = new PlotModel { Title = histogramData.chartTitle }; foreach (var data in histogramData.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, histogramData.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 = histogramData.documentTitle; document.Info.Subject = "Гистограмма"; Section section = document.AddSection(); section.AddParagraph(histogramData.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(histogramData.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, // Положение по умолчанию }; } } }