89 lines
3.6 KiB
C#
89 lines
3.6 KiB
C#
|
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> 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");
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|