89 lines
2.4 KiB
C#
89 lines
2.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection.PortableExecutable;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using MigraDoc.DocumentObjectModel;
|
|
using MigraDoc.DocumentObjectModel.Shapes.Charts;
|
|
using MigraDoc.Rendering;
|
|
|
|
namespace ProjectLibrary.Reports;
|
|
|
|
public class PdfBuilder
|
|
{
|
|
private readonly string _filePath;
|
|
private readonly Document _document;
|
|
public PdfBuilder(string filePath)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(filePath))
|
|
{
|
|
throw new ArgumentNullException(nameof(filePath));
|
|
}
|
|
if (File.Exists(filePath))
|
|
{
|
|
File.Delete(filePath);
|
|
}
|
|
_filePath = filePath;
|
|
_document = new Document();
|
|
DefineStyles();
|
|
}
|
|
public PdfBuilder AddHeader(string header)
|
|
{
|
|
_document.AddSection().AddParagraph(header, "NormalBold");
|
|
return this;
|
|
}
|
|
|
|
public PdfBuilder AddPieChart(string title, List<(string Caption, double Value)> data)
|
|
{
|
|
if (data == null || data.Count == 0)
|
|
{
|
|
return this;
|
|
}
|
|
var chart = new Chart(ChartType.Pie2D);
|
|
var series = chart.SeriesCollection.AddSeries();
|
|
series.Add(data.Select(x => x.Value).ToArray());
|
|
|
|
var xseries = chart.XValues.AddXSeries();
|
|
xseries.Add(data.Select(x => x.Caption).ToArray());
|
|
|
|
chart.DataLabel.Type = DataLabelType.Percent;
|
|
chart.DataLabel.Position = DataLabelPosition.OutsideEnd;
|
|
|
|
chart.Width = Unit.FromCentimeter(16);
|
|
chart.Height = Unit.FromCentimeter(12);
|
|
|
|
chart.TopArea.AddParagraph(title);
|
|
|
|
chart.XAxis.MajorTickMark = TickMarkType.Outside;
|
|
|
|
chart.YAxis.MajorTickMark = TickMarkType.Outside;
|
|
chart.YAxis.HasMajorGridlines = true;
|
|
|
|
chart.PlotArea.LineFormat.Width = 1;
|
|
chart.PlotArea.LineFormat.Visible = true;
|
|
|
|
chart.TopArea.AddLegend();
|
|
|
|
_document.LastSection.Add(chart);
|
|
return this;
|
|
}
|
|
|
|
public void Build()
|
|
{
|
|
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
|
|
var renderer = new PdfDocumentRenderer(true)
|
|
{
|
|
Document = _document
|
|
};
|
|
renderer.RenderDocument();
|
|
renderer.PdfDocument.Save(_filePath);
|
|
}
|
|
private void DefineStyles()
|
|
{
|
|
var headerStyle = _document.AddStyle("NormalBold", "Normal");
|
|
headerStyle.Font.Bold = true;
|
|
headerStyle.Font.Size = 14;
|
|
}
|
|
}
|