diff --git a/WinForm/WinForm/ExampleClass.cs b/WinForm/WinForm/ExampleClass.cs
new file mode 100644
index 0000000..2f03c31
--- /dev/null
+++ b/WinForm/WinForm/ExampleClass.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WinForm
+{
+ public class ExampleClass
+ {
+ public int Id { get; set; }
+ public string Book { get; set; }
+ public string Genre { get; set; }
+ public string Author { get; set; }
+
+ public ExampleClass(int Id, string Book, string Genre, string Author)
+ {
+ this.Id = Id;
+ this.Book = Book;
+ this.Genre = Genre;
+ this.Author = Author;
+ }
+ }
+}
diff --git a/WinForm/WinForm/Form1.Designer.cs b/WinForm/WinForm/Form1.Designer.cs
deleted file mode 100644
index d2d4052..0000000
--- a/WinForm/WinForm/Form1.Designer.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-namespace WinForm
-{
- partial class Form1
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- this.components = new System.ComponentModel.Container();
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(800, 450);
- this.Text = "Form1";
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/WinForm/WinForm/Form1.cs b/WinForm/WinForm/Form1.cs
deleted file mode 100644
index d100d20..0000000
--- a/WinForm/WinForm/Form1.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace WinForm
-{
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- }
-}
\ No newline at end of file
diff --git a/WinForm/WinForm/FormNoGraphics.Designer.cs b/WinForm/WinForm/FormNoGraphics.Designer.cs
new file mode 100644
index 0000000..9b3415d
--- /dev/null
+++ b/WinForm/WinForm/FormNoGraphics.Designer.cs
@@ -0,0 +1,153 @@
+namespace WinForm
+{
+ partial class FormNoGraphics
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ pdfGeneratorControl = new WinFormsLibrary.PdfGeneratorControl(components);
+ groupBoxPdfText = new GroupBox();
+ buttonSaveDiagram = new Button();
+ buttonSaveTable = new Button();
+ buttonSaveFile = new Button();
+ richTextBox = new RichTextBox();
+ labelBigText = new Label();
+ labelTitle = new Label();
+ textBoxTitle = new TextBox();
+ pdfTableGenerator = new WinFormsLibrary.PdfTableGenerator(components);
+ pdfGeneratorLinearDiagram = new WinFormsLibrary.PdfGeneratorLinearDiagram(components);
+ groupBoxPdfText.SuspendLayout();
+ SuspendLayout();
+ //
+ // groupBoxPdfText
+ //
+ groupBoxPdfText.Controls.Add(buttonSaveDiagram);
+ groupBoxPdfText.Controls.Add(buttonSaveTable);
+ groupBoxPdfText.Controls.Add(buttonSaveFile);
+ groupBoxPdfText.Controls.Add(richTextBox);
+ groupBoxPdfText.Controls.Add(labelBigText);
+ groupBoxPdfText.Controls.Add(labelTitle);
+ groupBoxPdfText.Controls.Add(textBoxTitle);
+ groupBoxPdfText.Location = new Point(12, 12);
+ groupBoxPdfText.Name = "groupBoxPdfText";
+ groupBoxPdfText.Size = new Size(328, 369);
+ groupBoxPdfText.TabIndex = 0;
+ groupBoxPdfText.TabStop = false;
+ groupBoxPdfText.Text = "Работа с большим текстом pdf";
+ //
+ // buttonSaveDiagram
+ //
+ buttonSaveDiagram.Location = new Point(41, 319);
+ buttonSaveDiagram.Name = "buttonSaveDiagram";
+ buttonSaveDiagram.Size = new Size(226, 23);
+ buttonSaveDiagram.TabIndex = 7;
+ buttonSaveDiagram.Text = "Сохранить Диаграмму в PDF";
+ buttonSaveDiagram.UseVisualStyleBackColor = true;
+ buttonSaveDiagram.Click += ButtonSaveDiagram_Click;
+ //
+ // buttonSaveTable
+ //
+ buttonSaveTable.Location = new Point(41, 290);
+ buttonSaveTable.Name = "buttonSaveTable";
+ buttonSaveTable.Size = new Size(226, 23);
+ buttonSaveTable.TabIndex = 6;
+ buttonSaveTable.Text = "Сохранить Таблицу в PDF";
+ buttonSaveTable.UseVisualStyleBackColor = true;
+ buttonSaveTable.Click += ButtonSaveTable_Click;
+ //
+ // buttonSaveFile
+ //
+ buttonSaveFile.Location = new Point(41, 261);
+ buttonSaveFile.Name = "buttonSaveFile";
+ buttonSaveFile.Size = new Size(226, 23);
+ buttonSaveFile.TabIndex = 4;
+ buttonSaveFile.Text = "Сохранить Текст в PDF";
+ buttonSaveFile.UseVisualStyleBackColor = true;
+ buttonSaveFile.Click += ButtonSaveFile_Click;
+ //
+ // richTextBox
+ //
+ richTextBox.Location = new Point(41, 56);
+ richTextBox.Name = "richTextBox";
+ richTextBox.Size = new Size(268, 199);
+ richTextBox.TabIndex = 3;
+ richTextBox.Text = "";
+ //
+ // labelBigText
+ //
+ labelBigText.AutoSize = true;
+ labelBigText.Location = new Point(6, 56);
+ labelBigText.Name = "labelBigText";
+ labelBigText.Size = new Size(28, 15);
+ labelBigText.TabIndex = 2;
+ labelBigText.Text = "Text";
+ //
+ // labelTitle
+ //
+ labelTitle.AutoSize = true;
+ labelTitle.Location = new Point(6, 25);
+ labelTitle.Name = "labelTitle";
+ labelTitle.Size = new Size(29, 15);
+ labelTitle.TabIndex = 1;
+ labelTitle.Text = "Title";
+ //
+ // textBoxTitle
+ //
+ textBoxTitle.Location = new Point(41, 22);
+ textBoxTitle.Name = "textBoxTitle";
+ textBoxTitle.Size = new Size(268, 23);
+ textBoxTitle.TabIndex = 0;
+ //
+ // FormNoGraphics
+ //
+ AutoScaleDimensions = new SizeF(7F, 15F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(351, 393);
+ Controls.Add(groupBoxPdfText);
+ Name = "FormNoGraphics";
+ StartPosition = FormStartPosition.CenterScreen;
+ Text = "Form";
+ groupBoxPdfText.ResumeLayout(false);
+ groupBoxPdfText.PerformLayout();
+ ResumeLayout(false);
+ }
+
+ #endregion
+
+ private WinFormsLibrary.PdfGeneratorControl pdfGeneratorControl;
+ private GroupBox groupBoxPdfText;
+ private Label labelTitle;
+ private TextBox textBoxTitle;
+ private Button buttonSaveFile;
+ private RichTextBox richTextBox;
+ private Label labelBigText;
+ private WinFormsLibrary.PdfTableGenerator pdfTableGenerator;
+ private Button buttonSaveDiagram;
+ private Button buttonSaveTable;
+ private WinFormsLibrary.PdfGeneratorLinearDiagram pdfGeneratorLinearDiagram;
+ }
+}
\ No newline at end of file
diff --git a/WinForm/WinForm/FormNoGraphics.cs b/WinForm/WinForm/FormNoGraphics.cs
new file mode 100644
index 0000000..37bcd23
--- /dev/null
+++ b/WinForm/WinForm/FormNoGraphics.cs
@@ -0,0 +1,129 @@
+using WinFormsLibrary.Helpers;
+
+namespace WinForm
+{
+ public partial class FormNoGraphics : Form
+ {
+ public FormNoGraphics()
+ {
+ InitializeComponent();
+ }
+
+ private List<(double, double)> GenerateRandomData(int count)
+ {
+ Random random = new Random();
+ var data = new List<(double, double)>();
+ for (int i = 1; i <= count; i++)
+ {
+ data.Add((i, random.NextDouble() * 50));
+ }
+ return data;
+ }
+
+ private List GenerateRandomClass(int count)
+ {
+ string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ Random random = new Random();
+ List returnedList = new List();
+ for (int i = 0; i < count; ++i)
+ {
+ char[] stringChars = new char[10];
+ for (int j = 0; j < 10; ++j)
+ {
+ stringChars[j] = chars[random.Next(chars.Length)];
+ }
+ returnedList.Add(new ExampleClass(i, new string(stringChars), new string(stringChars), new string(stringChars)));
+ }
+ return returnedList;
+ }
+
+ private string SavePath()
+ {
+ string filePath = string.Empty;
+ SaveFileDialog saveFileDialog = new SaveFileDialog();
+ saveFileDialog.Filter = "PDF Files|*.pdf";
+ if (saveFileDialog.ShowDialog() == DialogResult.OK)
+ {
+ filePath = saveFileDialog.FileName;
+ }
+ return filePath;
+ }
+
+ private void ButtonSaveFile_Click(object sender, EventArgs e)
+ {
+ System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
+ pdfGeneratorControl.GeneratePdf(SavePath(), textBoxTitle.Text, richTextBox.Lines.ToList());
+ MessageBox.Show("PDF- .", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+
+ private void ButtonSaveTable_Click(object sender, EventArgs e)
+ {
+ System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
+ PdfWithTableData tableData = new();
+ List tableHeader = new()
+ {
+ new PdfWithTableHeader()
+ {
+ ColumnName="Id",
+ ColumnWidth=50
+ },
+ new PdfWithTableHeader()
+ {
+ ColumnName="Book",
+ ColumnWidth=100
+ },
+ new PdfWithTableHeader()
+ {
+ ColumnName="Params",
+ ColumnWidth=250,
+ SubColumns = new()
+ {
+ new (){ ColumnName="Genre", ColumnWidth=125},
+ new (){ ColumnName="Author", ColumnWidth=125}
+ }
+ }
+ };
+
+ tableData.TableHeader = tableHeader;
+ tableData.Props = new List { "Id", "Book", "Genre", "Author" };
+ tableData.TableData = GenerateRandomClass(5);
+
+ tableData.DocumentTitle = textBoxTitle.Text;
+ tableData.FilePath = SavePath();
+ pdfTableGenerator.GeneratePdf(tableData);
+ MessageBox.Show("PDF- .", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+
+ private void ButtonSaveDiagram_Click(object sender, EventArgs e)
+ {
+ System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
+ PdfWithDiagramData diagramData = new();
+
+ diagramData.DocumentTitle = textBoxTitle.Text;
+ diagramData.DiagramName = textBoxTitle.Text;
+ diagramData.LegendPosition = DiagramLegendPosition.BottomCenterOutside;
+ diagramData.Series = new(){
+ new()
+ {
+ Name = "-1",
+ Data = GenerateRandomData(5)
+ },
+ new()
+ {
+ Name = "-2",
+ Data = GenerateRandomData(5)
+ }
+ };
+ diagramData.FilePath = SavePath();
+ try
+ {
+ pdfGeneratorLinearDiagram.GeneratePdfDocumentWithChart(diagramData);
+ MessageBox.Show("PDF- .", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"PDF- : {ex.Message}", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/WinForm/WinForm/Form1.resx b/WinForm/WinForm/FormNoGraphics.resx
similarity index 100%
rename from WinForm/WinForm/Form1.resx
rename to WinForm/WinForm/FormNoGraphics.resx
diff --git a/WinForm/WinForm/Program.cs b/WinForm/WinForm/Program.cs
index 0ab1b60..da3220a 100644
--- a/WinForm/WinForm/Program.cs
+++ b/WinForm/WinForm/Program.cs
@@ -11,7 +11,7 @@ namespace WinForm
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
- Application.Run(new Form1());
+ Application.Run(new FormNoGraphics());
}
}
}
\ No newline at end of file
diff --git a/WinForm/WinForm/WinForm.csproj b/WinForm/WinForm/WinForm.csproj
index b57c89e..0654708 100644
--- a/WinForm/WinForm/WinForm.csproj
+++ b/WinForm/WinForm/WinForm.csproj
@@ -8,4 +8,8 @@
enable
+
+
+
+
\ No newline at end of file
diff --git a/WinForm/WinFormsLibrary/Helpers/DiagramLegendPosition.cs b/WinForm/WinFormsLibrary/Helpers/DiagramLegendPosition.cs
new file mode 100644
index 0000000..d5518f8
--- /dev/null
+++ b/WinForm/WinFormsLibrary/Helpers/DiagramLegendPosition.cs
@@ -0,0 +1,57 @@
+using OxyPlot.Legends;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WinFormsLibrary.Helpers
+{
+ public class LegendSettingsAttribute : Attribute
+ {
+ public LegendPosition Position { get; }
+ public LegendPlacement Placement { get; }
+
+ public LegendSettingsAttribute(LegendPosition position, LegendPlacement placement)
+ {
+ Position = position;
+ Placement = placement;
+ }
+ }
+
+ public enum DiagramLegendPosition
+ {
+ [LegendSettings(LegendPosition.LeftTop, LegendPlacement.Outside)]
+ TopLeftOutside,
+ [LegendSettings(LegendPosition.TopCenter, LegendPlacement.Outside)]
+ TopCenterOutside,
+ [LegendSettings(LegendPosition.RightTop, LegendPlacement.Outside)]
+ TopRightOutside,
+ [LegendSettings(LegendPosition.LeftMiddle, LegendPlacement.Outside)]
+ MiddleLeftOutside,
+ [LegendSettings(LegendPosition.RightMiddle, LegendPlacement.Outside)]
+ MiddleRightOutside,
+ [LegendSettings(LegendPosition.BottomLeft, LegendPlacement.Outside)]
+ BottomLeftOutside,
+ [LegendSettings(LegendPosition.BottomCenter, LegendPlacement.Outside)]
+ BottomCenterOutside,
+ [LegendSettings(LegendPosition.BottomRight, LegendPlacement.Outside)]
+ BottomRightOutside,
+ [LegendSettings(LegendPosition.LeftTop, LegendPlacement.Inside)]
+ TopLeftInside,
+ [LegendSettings(LegendPosition.TopCenter, LegendPlacement.Inside)]
+ TopCenterInside,
+ [LegendSettings(LegendPosition.RightTop, LegendPlacement.Inside)]
+ TopRightInside,
+ [LegendSettings(LegendPosition.LeftMiddle, LegendPlacement.Inside)]
+ MiddleLeftInside,
+ [LegendSettings(LegendPosition.RightMiddle, LegendPlacement.Inside)]
+ MiddleRightInside,
+ [LegendSettings(LegendPosition.BottomLeft, LegendPlacement.Inside)]
+ BottomLeftInside,
+ [LegendSettings(LegendPosition.BottomCenter, LegendPlacement.Inside)]
+ BottomCenterInside,
+ [LegendSettings(LegendPosition.BottomRight, LegendPlacement.Inside)]
+ BottomRightInside,
+ }
+}
diff --git a/WinForm/WinFormsLibrary/Helpers/PdfWithDiagramData.cs b/WinForm/WinFormsLibrary/Helpers/PdfWithDiagramData.cs
new file mode 100644
index 0000000..81d890b
--- /dev/null
+++ b/WinForm/WinFormsLibrary/Helpers/PdfWithDiagramData.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WinFormsLibrary.Helpers
+{
+ public class PdfWithDiagramData
+ {
+ public string FilePath { get; set; } = string.Empty;
+ public string DocumentTitle { get; set; } = string.Empty;
+ public string DiagramName { get; set; } = string.Empty;
+ public DiagramLegendPosition LegendPosition { get; set; } = DiagramLegendPosition.BottomCenterOutside;
+ public List Series { get; set; } = new();
+ }
+}
diff --git a/WinForm/WinFormsLibrary/Helpers/PdfWithDiagramSeries.cs b/WinForm/WinFormsLibrary/Helpers/PdfWithDiagramSeries.cs
new file mode 100644
index 0000000..a3e8c7e
--- /dev/null
+++ b/WinForm/WinFormsLibrary/Helpers/PdfWithDiagramSeries.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WinFormsLibrary.Helpers
+{
+ public class PdfWithDiagramSeries
+ {
+ public string Name { get; set; } = string.Empty;
+ public List<(double, double)> Data { get; set; } = new();
+ }
+}
diff --git a/WinForm/WinFormsLibrary/Helpers/PdfWithTableData.cs b/WinForm/WinFormsLibrary/Helpers/PdfWithTableData.cs
new file mode 100644
index 0000000..502673d
--- /dev/null
+++ b/WinForm/WinFormsLibrary/Helpers/PdfWithTableData.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WinFormsLibrary.Helpers
+{
+ public class PdfWithTableData
+ {
+ public string FilePath { get; set; } = string.Empty;
+ public string DocumentTitle { get; set; } = string.Empty;
+ public List TableHeader { get; set; } = new();
+ public List TableData { get; set; } = new();
+ public List Props { get; set; } = new();
+ }
+}
diff --git a/WinForm/WinFormsLibrary/Helpers/PdfWithTableHeader.cs b/WinForm/WinFormsLibrary/Helpers/PdfWithTableHeader.cs
new file mode 100644
index 0000000..3e7f15e
--- /dev/null
+++ b/WinForm/WinFormsLibrary/Helpers/PdfWithTableHeader.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WinFormsLibrary.Helpers
+{
+ public class PdfWithTableHeader
+ {
+ public string? ColumnName { get; set; } = string.Empty;
+ public int ColumnWidth { get; set; } = 100;
+ public List SubColumns { get; set; } = new List();
+ }
+}
diff --git a/WinForm/WinFormsLibrary/Helpers/PdfWithTableSubHeader.cs b/WinForm/WinFormsLibrary/Helpers/PdfWithTableSubHeader.cs
new file mode 100644
index 0000000..1d8a0d7
--- /dev/null
+++ b/WinForm/WinFormsLibrary/Helpers/PdfWithTableSubHeader.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WinFormsLibrary.Helpers
+{
+ public class PdfWithTableSubHeader
+ {
+ public string? ColumnName { get; set; } = string.Empty;
+ public int ColumnWidth { get; set; } = 100;
+ }
+}
diff --git a/WinForm/WinFormsLibrary/PdfGeneratorControl.Designer.cs b/WinForm/WinFormsLibrary/PdfGeneratorControl.Designer.cs
new file mode 100644
index 0000000..76979ec
--- /dev/null
+++ b/WinForm/WinFormsLibrary/PdfGeneratorControl.Designer.cs
@@ -0,0 +1,36 @@
+namespace WinFormsLibrary
+{
+ partial class PdfGeneratorControl
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Освободить все используемые ресурсы.
+ ///
+ /// истинно, если управляемый ресурс должен быть удален; иначе ложно.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Код, автоматически созданный конструктором компонентов
+
+ ///
+ /// Требуемый метод для поддержки конструктора — не изменяйте
+ /// содержимое этого метода с помощью редактора кода.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ }
+
+ #endregion
+ }
+}
diff --git a/WinForm/WinFormsLibrary/PdfGeneratorControl.cs b/WinForm/WinFormsLibrary/PdfGeneratorControl.cs
new file mode 100644
index 0000000..2b332a7
--- /dev/null
+++ b/WinForm/WinFormsLibrary/PdfGeneratorControl.cs
@@ -0,0 +1,55 @@
+using MigraDoc.DocumentObjectModel;
+using MigraDoc.Rendering;
+using PdfSharp.Fonts;
+using PdfSharp.Pdf;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WinFormsLibrary
+{
+ public partial class PdfGeneratorControl : Component
+ {
+ public PdfGeneratorControl()
+ {
+ InitializeComponent();
+ }
+
+ public PdfGeneratorControl(IContainer container)
+ {
+ container.Add(this);
+
+ InitializeComponent();
+ }
+
+ public void GeneratePdf(string filePath, string documentTitle, List textData)
+ {
+ if (string.IsNullOrEmpty(filePath) || string.IsNullOrEmpty(documentTitle) || textData == null)
+ {
+ return;
+ }
+
+ Document document = new Document();
+
+ Section section = document.AddSection();
+
+ Paragraph title = section.AddParagraph(documentTitle);
+ title.Format.Font.Bold = true;
+
+ foreach (var item in textData)
+ {
+ Paragraph paragraph = section.AddParagraph();
+ paragraph.AddText(item);
+ }
+
+ PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(true, PdfFontEmbedding.Always);
+ pdfRenderer.Document = document;
+ pdfRenderer.RenderDocument();
+ pdfRenderer.PdfDocument.Save(filePath);
+ }
+ }
+}
diff --git a/WinForm/WinFormsLibrary/PdfGeneratorLinearDiagram.Designer.cs b/WinForm/WinFormsLibrary/PdfGeneratorLinearDiagram.Designer.cs
new file mode 100644
index 0000000..5aee678
--- /dev/null
+++ b/WinForm/WinFormsLibrary/PdfGeneratorLinearDiagram.Designer.cs
@@ -0,0 +1,36 @@
+namespace WinFormsLibrary
+{
+ partial class PdfGeneratorLinearDiagram
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Освободить все используемые ресурсы.
+ ///
+ /// истинно, если управляемый ресурс должен быть удален; иначе ложно.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Код, автоматически созданный конструктором компонентов
+
+ ///
+ /// Требуемый метод для поддержки конструктора — не изменяйте
+ /// содержимое этого метода с помощью редактора кода.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ }
+
+ #endregion
+ }
+}
diff --git a/WinForm/WinFormsLibrary/PdfGeneratorLinearDiagram.cs b/WinForm/WinFormsLibrary/PdfGeneratorLinearDiagram.cs
new file mode 100644
index 0000000..9027813
--- /dev/null
+++ b/WinForm/WinFormsLibrary/PdfGeneratorLinearDiagram.cs
@@ -0,0 +1,84 @@
+using MigraDoc.DocumentObjectModel;
+using MigraDoc.Rendering;
+using OxyPlot;
+using OxyPlot.Axes;
+using OxyPlot.Legends;
+using OxyPlot.Series;
+using OxyPlot.WindowsForms;
+using System.ComponentModel;
+using System.Reflection;
+using WinFormsLibrary.Helpers;
+
+namespace WinFormsLibrary
+{
+ public partial class PdfGeneratorLinearDiagram : Component
+ {
+ public PdfGeneratorLinearDiagram()
+ {
+ InitializeComponent();
+ }
+
+ public PdfGeneratorLinearDiagram(IContainer container)
+ {
+ container.Add(this);
+
+ InitializeComponent();
+ }
+
+ public void GeneratePdfDocumentWithChart(PdfWithDiagramData pdfDiagram)
+ {
+ if (string.IsNullOrEmpty(pdfDiagram.FilePath) || string.IsNullOrEmpty(pdfDiagram.DocumentTitle)
+ || string.IsNullOrEmpty(pdfDiagram.DiagramName) || pdfDiagram.Series == null)
+ {
+ return;
+ }
+
+ var plotModel = new PlotModel { Title = pdfDiagram.DiagramName };
+
+ var xAxis = new LinearAxis { Position = AxisPosition.Bottom };
+ var yAxis = new LinearAxis { Position = AxisPosition.Left };
+ plotModel.Axes.Add(xAxis);
+ plotModel.Axes.Add(yAxis);
+
+ foreach (var item in pdfDiagram.Series)
+ {
+ var singleSeries = new LineSeries { Title = item.Name };
+ foreach (var coordinates in item.Data)
+ {
+ singleSeries.Points.Add(new DataPoint(coordinates.Item1, coordinates.Item2));
+ }
+ plotModel.Series.Add(singleSeries);
+ }
+
+ var fieldInfo = typeof(DiagramLegendPosition).GetField(pdfDiagram.LegendPosition.ToString());
+ var attribute = fieldInfo?.GetCustomAttribute();
+
+ plotModel.Legends.Add(new Legend()
+ {
+ LegendTitle = "Легенда",
+ LegendPlacement = attribute.Placement,
+ LegendPosition = attribute.Position,
+ });
+ plotModel.IsLegendVisible = true;
+
+ var document = new Document();
+ document.Info.Title = pdfDiagram.DocumentTitle;
+
+ var section = document.AddSection();
+ section.PageSetup.TopMargin = "1cm";
+
+ var image = new PngExporter { Width = 600, Height = 400 }.ExportToBitmap(plotModel);
+ image.Save("temp.png");
+
+ var chartImage = section.AddImage("temp.png");
+ chartImage.LockAspectRatio = true;
+ chartImage.Width = "15cm";
+ chartImage.Height = "10cm";
+
+ var pdfRenderer = new PdfDocumentRenderer(true);
+ pdfRenderer.Document = document;
+ pdfRenderer.RenderDocument();
+ pdfRenderer.PdfDocument.Save(pdfDiagram.FilePath);
+ }
+ }
+}
diff --git a/WinForm/WinFormsLibrary/PdfTableGenerator.Designer.cs b/WinForm/WinFormsLibrary/PdfTableGenerator.Designer.cs
new file mode 100644
index 0000000..e2c35bb
--- /dev/null
+++ b/WinForm/WinFormsLibrary/PdfTableGenerator.Designer.cs
@@ -0,0 +1,36 @@
+namespace WinFormsLibrary
+{
+ partial class PdfTableGenerator
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Освободить все используемые ресурсы.
+ ///
+ /// истинно, если управляемый ресурс должен быть удален; иначе ложно.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Код, автоматически созданный конструктором компонентов
+
+ ///
+ /// Требуемый метод для поддержки конструктора — не изменяйте
+ /// содержимое этого метода с помощью редактора кода.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ }
+
+ #endregion
+ }
+}
diff --git a/WinForm/WinFormsLibrary/PdfTableGenerator.cs b/WinForm/WinFormsLibrary/PdfTableGenerator.cs
new file mode 100644
index 0000000..4695dd1
--- /dev/null
+++ b/WinForm/WinFormsLibrary/PdfTableGenerator.cs
@@ -0,0 +1,134 @@
+using PdfSharp.Pdf;
+using MigraDoc.DocumentObjectModel;
+using MigraDoc.DocumentObjectModel.Tables;
+using MigraDoc.Rendering;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WinFormsLibrary.Helpers;
+
+namespace WinFormsLibrary
+{
+ public partial class PdfTableGenerator : Component
+ {
+ private int fontSize = 14;
+
+ public PdfTableGenerator()
+ {
+ InitializeComponent();
+ }
+
+ public PdfTableGenerator(IContainer container)
+ {
+ container.Add(this);
+
+ InitializeComponent();
+ }
+
+ public void GeneratePdf(PdfWithTableData pdfTable)
+ {
+ if (pdfTable == null || string.IsNullOrEmpty(pdfTable.FilePath)
+ || string.IsNullOrEmpty(pdfTable.DocumentTitle) || pdfTable.TableHeader == null)
+ {
+ throw new ArgumentException("Недостаточно данных для создания PDF-документа.");
+ }
+ Document document = new Document();
+ Section section = document.AddSection();
+
+ Paragraph title = section.AddParagraph(pdfTable.DocumentTitle);
+ title.Format.Font.Bold = true;
+ title.Format.Alignment = ParagraphAlignment.Center;
+
+ Table table = section.AddTable();
+ table.Borders.Visible = true;
+
+ foreach (var column in pdfTable.TableHeader)
+ {
+ if (column.SubColumns.Count > 0)
+ {
+ foreach(var sub in column.SubColumns)
+ {
+ Column newsub = table.AddColumn();
+ newsub.Width = sub.ColumnWidth;
+ }
+ continue;
+ }
+
+ Column newcolumn = table.AddColumn();
+ newcolumn.Width = column.ColumnWidth;
+ }
+
+ CreateTableHeader(table, pdfTable.TableHeader);
+
+ CreateTableData(table, pdfTable);
+
+ PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(true);
+ pdfRenderer.Document = document;
+ pdfRenderer.RenderDocument();
+ pdfRenderer.PdfDocument.Save(pdfTable.FilePath);
+ }
+
+ public void CreateTableHeader(Table table, List headerInfo)
+ {
+ Row headerRow1 = table.AddRow();
+ Row headerRow2 = table.AddRow();
+
+ foreach (Row headerRow in new Row[] { headerRow1, headerRow2 })
+ {
+ headerRow.HeadingFormat = true;
+ headerRow.Format.Alignment = ParagraphAlignment.Center;
+ headerRow.Format.Font.Bold = true;
+ }
+
+ int i = 0;
+ foreach (var column in headerInfo)
+ {
+ int rowSpan = Math.Max(1, column.SubColumns.Count);
+
+ if (column.SubColumns.Count > 0)
+ {
+ headerRow1.Cells[i].MergeRight = rowSpan - 1;
+
+ for (int j = 0; j < column.SubColumns.Count; j++)
+ {
+ headerRow2.Cells[i + j].AddParagraph(column.SubColumns[j].ColumnName);
+ }
+ }
+ else
+ {
+ headerRow1.Cells[i].MergeDown = rowSpan;
+ }
+
+ headerRow1.Cells[i].AddParagraph(column.ColumnName);
+ i += rowSpan;
+ }
+ }
+
+ private void CreateTableData(Table table, PdfWithTableData data)
+ {
+ if (data == null || data.TableData == null)
+ return;
+
+ foreach (var rowData in data.TableData)
+ {
+ Row newrow = table.AddRow();
+ int i = 0;
+ foreach (var column in data.Props)
+ {
+ try
+ {
+ object cellValue = typeof(T).GetProperty(column).GetValue(rowData);
+ string cellText = cellValue?.ToString() ?? string.Empty;
+ newrow.Cells[i].AddParagraph(cellText);
+ ++i;
+ }
+ catch { }
+ }
+ }
+ }
+ }
+}
diff --git a/WinForm/WinFormsLibrary/WinFormsLibrary.csproj b/WinForm/WinFormsLibrary/WinFormsLibrary.csproj
index 060aa1c..8a056da 100644
--- a/WinForm/WinFormsLibrary/WinFormsLibrary.csproj
+++ b/WinForm/WinFormsLibrary/WinFormsLibrary.csproj
@@ -7,4 +7,10 @@
enable
+
+
+
+
+
+