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; 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, LegendPosition 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); } // Сохранение графика в изображение 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); // Сохранение документа в PDF PdfDocumentRenderer renderer = new PdfDocumentRenderer(true) { Document = document }; renderer.RenderDocument(); renderer.PdfDocument.Save(filePath); // Удалите временное изображение, если необходимо File.Delete("chart.png"); } } }