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 + + + + + +