лаба 2, формочка осталась
This commit is contained in:
parent
6639c7be4d
commit
e9ccb205f5
@ -7,4 +7,13 @@
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Remove="C:\Users\annap\.nuget\packages\pdfsharp.standard\1.51.15\contentFiles\any\netstandard2.0\SharpZipLib\ReadMe.txt" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="PdfSharp.MigraDoc.Standard" Version="1.51.15" />
|
||||
<PackageReference Include="PDFSharp.Standard" Version="1.51.15" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
36
COP_5/COP_5/PdfForDiagram.Designer.cs
generated
Normal file
36
COP_5/COP_5/PdfForDiagram.Designer.cs
generated
Normal file
@ -0,0 +1,36 @@
|
||||
namespace COP_5
|
||||
{
|
||||
partial class PdfForDiagram
|
||||
{
|
||||
/// <summary>
|
||||
/// Обязательная переменная конструктора.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Освободить все используемые ресурсы.
|
||||
/// </summary>
|
||||
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Код, автоматически созданный конструктором компонентов
|
||||
|
||||
/// <summary>
|
||||
/// Требуемый метод для поддержки конструктора — не изменяйте
|
||||
/// содержимое этого метода с помощью редактора кода.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
components = new System.ComponentModel.Container();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
111
COP_5/COP_5/PdfForDiagram.cs
Normal file
111
COP_5/COP_5/PdfForDiagram.cs
Normal file
@ -0,0 +1,111 @@
|
||||
using MigraDoc.DocumentObjectModel;
|
||||
using MigraDoc.DocumentObjectModel.Shapes;
|
||||
using MigraDoc.Rendering;
|
||||
using System.ComponentModel;
|
||||
using MigraDoc.DocumentObjectModel.Shapes.Charts;
|
||||
using COP_5.PdfHelper;
|
||||
|
||||
namespace COP_5
|
||||
{
|
||||
public partial class PdfForDiagram : Component
|
||||
{
|
||||
public PdfForDiagram()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public PdfForDiagram(IContainer container)
|
||||
{
|
||||
container.Add(this);
|
||||
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private Document _document;
|
||||
private Chart _chart;
|
||||
|
||||
private Document Document
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_document == null)
|
||||
{
|
||||
_document = new Document();
|
||||
}
|
||||
return _document;
|
||||
}
|
||||
}
|
||||
|
||||
public void CreateHeader(string header)
|
||||
{
|
||||
var section = Document.AddSection();
|
||||
var paragraph = section.AddParagraph(header);
|
||||
paragraph.Format.Font.Color = Colors.Black;
|
||||
paragraph.Format.Font.Bold = true;
|
||||
}
|
||||
|
||||
private void ConfigChart(DiagramPdfInfo info)
|
||||
{
|
||||
((Shape)_chart).Width = Unit.FromCentimeter(16.0);
|
||||
((Shape)_chart).Height = Unit.FromCentimeter(12.0);
|
||||
_chart.TopArea.AddParagraph(info.ChartTitle);
|
||||
_chart.XAxis.MajorTickMark = (TickMarkType)2;
|
||||
_chart.YAxis.MajorTickMark = (TickMarkType)2;
|
||||
_chart.YAxis.HasMajorGridlines = true;
|
||||
_chart.PlotArea.LineFormat.Width = new Unit(1);
|
||||
_chart.PlotArea.LineFormat.Visible = true;
|
||||
switch (info.LegendLocation)
|
||||
{
|
||||
case PdfParagraphAlignmentType.Left:
|
||||
_chart.LeftArea.AddLegend();
|
||||
break;
|
||||
case PdfParagraphAlignmentType.Right:
|
||||
_chart.RightArea.AddLegend();
|
||||
break;
|
||||
case PdfParagraphAlignmentType.Top:
|
||||
_chart.TopArea.AddLegend();
|
||||
break;
|
||||
case PdfParagraphAlignmentType.Bottom:
|
||||
_chart.BottomArea.AddLegend();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void CreatePieChart(DiagramPdfInfo info)
|
||||
{
|
||||
_chart = new Chart(ChartType.Pie2D);
|
||||
foreach (var kvp in info.Data)
|
||||
{
|
||||
Series series = _chart.SeriesCollection.AddSeries();
|
||||
series.Name = kvp.Key;
|
||||
series.Add(kvp.Value.Select(x => x.Value).ToArray()); // Используем Value для данных
|
||||
}
|
||||
_chart.XValues.AddXSeries().Add(info.Data.First().Value.Select(x => x.Name).ToArray()); // Используем Date для оси X
|
||||
ConfigChart(info);
|
||||
}
|
||||
|
||||
public void SaveDoc(string filepath)
|
||||
{
|
||||
if (string.IsNullOrEmpty(filepath))
|
||||
throw new ArgumentNullException(nameof(filepath), "File path cannot be null or empty.");
|
||||
if (_document == null)
|
||||
throw new ArgumentNullException(nameof(_document), "Document is not created.");
|
||||
if (_chart != null)
|
||||
_document.LastSection.Add(_chart);
|
||||
PdfDocumentRenderer documentRenderer = new PdfDocumentRenderer(true)
|
||||
{
|
||||
Document = _document
|
||||
};
|
||||
documentRenderer.RenderDocument();
|
||||
documentRenderer.PdfDocument.Save(filepath);
|
||||
}
|
||||
|
||||
public void CreateDoc(DiagramPdfInfo info)
|
||||
{
|
||||
info.CheckFields();
|
||||
CreateHeader(info.Header);
|
||||
CreatePieChart(info);
|
||||
SaveDoc(info.FilePath);
|
||||
}
|
||||
}
|
||||
}
|
36
COP_5/COP_5/PdfForImages.Designer.cs
generated
Normal file
36
COP_5/COP_5/PdfForImages.Designer.cs
generated
Normal file
@ -0,0 +1,36 @@
|
||||
namespace COP_5
|
||||
{
|
||||
partial class PdfForImages
|
||||
{
|
||||
/// <summary>
|
||||
/// Обязательная переменная конструктора.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Освободить все используемые ресурсы.
|
||||
/// </summary>
|
||||
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Код, автоматически созданный конструктором компонентов
|
||||
|
||||
/// <summary>
|
||||
/// Требуемый метод для поддержки конструктора — не изменяйте
|
||||
/// содержимое этого метода с помощью редактора кода.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
components = new System.ComponentModel.Container();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
127
COP_5/COP_5/PdfForImages.cs
Normal file
127
COP_5/COP_5/PdfForImages.cs
Normal file
@ -0,0 +1,127 @@
|
||||
using System.ComponentModel;
|
||||
using MigraDoc.DocumentObjectModel;
|
||||
using MigraDoc.Rendering;
|
||||
using COP_5.PdfHelper;
|
||||
using System.Text;
|
||||
|
||||
namespace COP_5
|
||||
{
|
||||
public partial class PdfForImages : Component
|
||||
{
|
||||
private Document _document = null;
|
||||
|
||||
private Section _section = null;
|
||||
|
||||
private List<byte[]> _images = null;
|
||||
|
||||
private Document Document
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_document == null)
|
||||
{
|
||||
_document = new Document();
|
||||
}
|
||||
|
||||
return _document;
|
||||
}
|
||||
}
|
||||
|
||||
private Section Section
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_section == null)
|
||||
{
|
||||
_section = Document.AddSection();
|
||||
}
|
||||
|
||||
return _section;
|
||||
}
|
||||
}
|
||||
|
||||
private List<byte[]> Images
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_images == null)
|
||||
{
|
||||
_images = new List<byte[]>();
|
||||
}
|
||||
|
||||
return _images;
|
||||
}
|
||||
}
|
||||
public PdfForImages()
|
||||
{
|
||||
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public PdfForImages(IContainer container)
|
||||
{
|
||||
container.Add(this);
|
||||
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
|
||||
InitializeComponent();
|
||||
}
|
||||
public void CreatePdf(ImagePdfInfo info)
|
||||
{
|
||||
info.CheckFields();
|
||||
CreateHeader(info.Header);
|
||||
foreach (var image in info.Images)
|
||||
{
|
||||
CreateImage(image);
|
||||
}
|
||||
|
||||
SavePdf(info.FilePath);
|
||||
}
|
||||
|
||||
public void CreateHeader(string header)
|
||||
{
|
||||
var paragraph = Section.AddParagraph(header);
|
||||
paragraph.Format.Font.Name = "Arial";
|
||||
paragraph.Format.Font.Bold = true;
|
||||
paragraph.Format.Font.Size = 20;
|
||||
paragraph.Format.SpaceAfter = 10;
|
||||
}
|
||||
|
||||
public void SavePdf(string filepath)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(filepath))
|
||||
{
|
||||
throw new ArgumentNullException("Имя файла не задано");
|
||||
}
|
||||
|
||||
if (_document == null || _section == null)
|
||||
{
|
||||
throw new ArgumentNullException("Документ не сформирован, сохранять нечего");
|
||||
}
|
||||
|
||||
var pdfRenderer = new PdfDocumentRenderer(true)
|
||||
{
|
||||
Document = _document,
|
||||
};
|
||||
pdfRenderer.RenderDocument();
|
||||
pdfRenderer.Save(filepath);
|
||||
}
|
||||
|
||||
public void CreateImage(byte[] image)
|
||||
{
|
||||
if (image == null || image.Length == 0)
|
||||
{
|
||||
throw new ArgumentNullException("Картинка не загружена");
|
||||
}
|
||||
|
||||
Images.Add(image);
|
||||
|
||||
var imageFileName = Path.GetTempFileName();
|
||||
File.WriteAllBytes(imageFileName, image);
|
||||
|
||||
var img = Section.AddImage(imageFileName);
|
||||
img.Width = Unit.FromCentimeter(15); // Можно настроить ширину изображения
|
||||
img.LockAspectRatio = true;
|
||||
Section.AddParagraph();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
36
COP_5/COP_5/PdfForTables.Designer.cs
generated
Normal file
36
COP_5/COP_5/PdfForTables.Designer.cs
generated
Normal file
@ -0,0 +1,36 @@
|
||||
namespace COP_5
|
||||
{
|
||||
partial class PdfForTables
|
||||
{
|
||||
/// <summary>
|
||||
/// Обязательная переменная конструктора.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Освободить все используемые ресурсы.
|
||||
/// </summary>
|
||||
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Код, автоматически созданный конструктором компонентов
|
||||
|
||||
/// <summary>
|
||||
/// Требуемый метод для поддержки конструктора — не изменяйте
|
||||
/// содержимое этого метода с помощью редактора кода.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
components = new System.ComponentModel.Container();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
104
COP_5/COP_5/PdfForTables.cs
Normal file
104
COP_5/COP_5/PdfForTables.cs
Normal file
@ -0,0 +1,104 @@
|
||||
using System.ComponentModel;
|
||||
using MigraDoc.DocumentObjectModel;
|
||||
using MigraDoc.DocumentObjectModel.Tables;
|
||||
using MigraDoc.Rendering;
|
||||
using System.Reflection;
|
||||
using COP_5.PdfHelper;
|
||||
|
||||
namespace COP_5
|
||||
{
|
||||
public partial class PdfForTables : Component
|
||||
{
|
||||
public void CreatePdf<T>(TablePdfInfo<T> info)
|
||||
{
|
||||
info.CheckFields();
|
||||
|
||||
// Создание документа
|
||||
var document = new Document();
|
||||
var section = document.AddSection();
|
||||
|
||||
// Установка заголовка
|
||||
var titleParagraph = section.AddParagraph(info.Title);
|
||||
titleParagraph.Format.Alignment = ParagraphAlignment.Center;
|
||||
titleParagraph.Format.Font.Size = 16;
|
||||
titleParagraph.Format.Font.Bold = true;
|
||||
titleParagraph.Format.SpaceAfter = 20;
|
||||
|
||||
// Создание таблицы
|
||||
var table = section.AddTable();
|
||||
table.Borders.Width = 0.75;
|
||||
|
||||
// Создание столбцов
|
||||
for (int i = 0; i < info.Data.Count + 2; i++)
|
||||
{
|
||||
var column = table.AddColumn(Unit.FromCentimeter(3)); // Ширину можно настроить
|
||||
column.Format.Alignment = ParagraphAlignment.Center;
|
||||
}
|
||||
|
||||
// Создание заголовков
|
||||
for (int rowIndex = 0; rowIndex < info.PropertiesPerRow.Count; rowIndex++)
|
||||
{
|
||||
var row = table.AddRow();
|
||||
row.Height = Unit.FromCentimeter(info.RowHeights[rowIndex]); // Высота строки
|
||||
|
||||
foreach (Cell cell in row.Cells)
|
||||
{
|
||||
cell.VerticalAlignment = VerticalAlignment.Center;
|
||||
cell.Format.Alignment = ParagraphAlignment.Center;
|
||||
}
|
||||
}
|
||||
|
||||
int rowNum = 0;
|
||||
foreach (var kvp in info.Headers)
|
||||
{
|
||||
string key = kvp.Key;
|
||||
List<string> values = kvp.Value;
|
||||
|
||||
if (values.Count == 0)
|
||||
{
|
||||
table.Rows[rowNum].Cells[0].AddParagraph(key);
|
||||
table.Rows[rowNum].Cells[0].MergeRight = 1;
|
||||
rowNum++;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
table.Rows[rowNum].Cells[0].AddParagraph(key);
|
||||
table.Rows[rowNum].Cells[0].MergeDown = values.Count - 1;
|
||||
|
||||
foreach (var value in values)
|
||||
{
|
||||
table.Rows[rowNum].Cells[1].AddParagraph(value);
|
||||
rowNum++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (int colIndex = 0; colIndex < info.Data.Count; colIndex++)
|
||||
{
|
||||
for (int rowIndex = 0; rowIndex < info.PropertiesPerRow.Count; rowIndex++)
|
||||
{
|
||||
Type type = typeof(T);
|
||||
PropertyInfo property = type.GetProperty(info.PropertiesPerRow[rowIndex]);
|
||||
|
||||
if (property == null)
|
||||
{
|
||||
throw new ArgumentException($"Property with name {info.PropertiesPerRow[rowIndex]} doesn't exist in class {type.Name}");
|
||||
}
|
||||
|
||||
table.Rows[rowIndex].Cells[colIndex + 2].AddParagraph(property.GetValue(info.Data[colIndex]).ToString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Рендеринг документа в PDF
|
||||
var pdfRenderer = new PdfDocumentRenderer(true)
|
||||
{
|
||||
Document = document
|
||||
};
|
||||
pdfRenderer.RenderDocument();
|
||||
pdfRenderer.PdfDocument.Save(info.FileName);
|
||||
}
|
||||
}
|
||||
}
|
21
COP_5/COP_5/PdfHelper/DiagramPdfInfo.cs
Normal file
21
COP_5/COP_5/PdfHelper/DiagramPdfInfo.cs
Normal file
@ -0,0 +1,21 @@
|
||||
namespace COP_5.PdfHelper
|
||||
{
|
||||
public class DiagramPdfInfo
|
||||
{
|
||||
public string FilePath { get; set; }
|
||||
public string Header { get; set; }
|
||||
public string ChartTitle { get; set; }
|
||||
public PdfParagraphAlignmentType LegendLocation { get; set; }
|
||||
public Dictionary<string, List<(string Name, double Value)>> Data { get; set; }
|
||||
|
||||
public void CheckFields()
|
||||
{
|
||||
if (string.IsNullOrEmpty(FilePath))
|
||||
throw new ArgumentNullException(nameof(FilePath), "Путь к файлу не может быть null или пустым.");
|
||||
if (string.IsNullOrEmpty(Header))
|
||||
throw new ArgumentNullException(nameof(Header), "Заголовок не может быть null или пустым.");
|
||||
if (Data == null || !Data.Any())
|
||||
throw new ArgumentNullException(nameof(Data), "Данные не могут быть null или пустыми.");
|
||||
}
|
||||
}
|
||||
}
|
17
COP_5/COP_5/PdfHelper/ImagePdfInfo.cs
Normal file
17
COP_5/COP_5/PdfHelper/ImagePdfInfo.cs
Normal file
@ -0,0 +1,17 @@
|
||||
namespace COP_5.PdfHelper
|
||||
{
|
||||
public class ImagePdfInfo
|
||||
{
|
||||
public string FilePath { get; set; }
|
||||
public string Header { get; set; }
|
||||
public List<byte[]> Images { get; set; }
|
||||
|
||||
public void CheckFields()
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(FilePath) || string.IsNullOrWhiteSpace(Header) || Images == null || Images.Count == 0)
|
||||
{
|
||||
throw new ArgumentException("Все поля должны быть заполнены.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
10
COP_5/COP_5/PdfHelper/PdfParagraphAlignmentType.cs
Normal file
10
COP_5/COP_5/PdfHelper/PdfParagraphAlignmentType.cs
Normal file
@ -0,0 +1,10 @@
|
||||
namespace COP_5.PdfHelper
|
||||
{
|
||||
public enum PdfParagraphAlignmentType
|
||||
{
|
||||
Left,
|
||||
Right,
|
||||
Top,
|
||||
Bottom
|
||||
}
|
||||
}
|
38
COP_5/COP_5/PdfHelper/TablePdfInfo.cs
Normal file
38
COP_5/COP_5/PdfHelper/TablePdfInfo.cs
Normal file
@ -0,0 +1,38 @@
|
||||
namespace COP_5.PdfHelper
|
||||
{
|
||||
public class TablePdfInfo<T>
|
||||
{
|
||||
public string FileName { get; set; }
|
||||
public string Title { get; set; }
|
||||
public List<double> RowHeights { get; set; }
|
||||
public Dictionary<string, List<string>> Headers { get; set; }
|
||||
public List<string> PropertiesPerRow { get; set; }
|
||||
public List<T> Data { get; set; }
|
||||
public void CheckFields()
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(FileName))
|
||||
throw new ArgumentException("Имя файла не может быть пустым.", nameof(FileName));
|
||||
|
||||
if (string.IsNullOrWhiteSpace(Title))
|
||||
throw new ArgumentException("Название документа не может быть пустым.", nameof(DocumentTitle));
|
||||
|
||||
if (Headers == null || Headers.Count == 0)
|
||||
throw new ArgumentException("Заголовки для шапки не могут быть пустыми.", nameof(Headers));
|
||||
|
||||
if (Data == null || Data.Count == 0)
|
||||
throw new ArgumentException("Данные для таблицы не могут быть пустыми.", nameof(Data));
|
||||
|
||||
if (RowHeights == null || RowHeights.Count == 0)
|
||||
throw new ArgumentException("Высоты строк не могут быть пустыми.", nameof(RowHeights));
|
||||
|
||||
if (PropertiesPerRow.Any(string.IsNullOrWhiteSpace))
|
||||
throw new ArgumentException("Список названий свойств не может содержать пустые строки.", nameof(PropertiesPerRow));
|
||||
|
||||
if (RowHeights.Count != PropertiesPerRow.Count)
|
||||
throw new ArgumentException("Количество высот строк должно соответствовать количеству названий свойств.", nameof(RowHeights));
|
||||
|
||||
if (Data.Count != PropertiesPerRow.Count)
|
||||
throw new ArgumentException("Количество данных должно соответствовать количеству названий свойств.", nameof(Data));
|
||||
}
|
||||
}
|
||||
}
|
16
COP_5/COP_5/TestClasses/Human.cs
Normal file
16
COP_5/COP_5/TestClasses/Human.cs
Normal file
@ -0,0 +1,16 @@
|
||||
namespace COP_5.TestClasses
|
||||
{
|
||||
public class Human
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Surname { get; set; }
|
||||
public int Age { get; set; }
|
||||
public Human() { }
|
||||
public Human(string name, string surname, int age)
|
||||
{
|
||||
Name = name;
|
||||
Surname = surname;
|
||||
Age = age;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user