лаба 2, формочка осталась

This commit is contained in:
a.puchkina 2024-09-30 23:07:42 +04:00
parent 6639c7be4d
commit e9ccb205f5
12 changed files with 561 additions and 0 deletions

View File

@ -7,4 +7,13 @@
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup> </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> </Project>

36
COP_5/COP_5/PdfForDiagram.Designer.cs generated Normal file
View 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
}
}

View 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
View 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
View 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
View 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
View 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);
}
}
}

View 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 или пустыми.");
}
}
}

View 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("Все поля должны быть заполнены.");
}
}
}
}

View File

@ -0,0 +1,10 @@
namespace COP_5.PdfHelper
{
public enum PdfParagraphAlignmentType
{
Left,
Right,
Top,
Bottom
}
}

View 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));
}
}
}

View 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;
}
}
}