PIbd-31_Danilov_V_V_COP-30/Components/NonVisual/HistogramPDF.cs
2024-11-02 18:51:07 +04:00

120 lines
4.0 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 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, // Положение по умолчанию
};
}
}
}