KOP_PIbd-33_Volkov_N.A._Tik.../KopLab1/FormLibrary/ComponentHistogramToPdf.cs
2024-10-02 19:39:58 +04:00

115 lines
4.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using FormLibrary.HelperClasses;
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
using OxyPlot.Series;
using OxyPlot;
using System.ComponentModel;
using OxyPlot.WindowsForms;
using OxyPlot.Legends;
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> 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, // Положение по умолчанию
};
}
}
}