Сданная 2 лаба

This commit is contained in:
maxnes3 2023-11-01 18:28:06 +04:00
parent 79a329d782
commit a75923818e
21 changed files with 832 additions and 50 deletions

View File

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

View File

@ -1,39 +0,0 @@
namespace WinForm
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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
}
}

View File

@ -1,10 +0,0 @@
namespace WinForm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}

153
WinForm/WinForm/FormNoGraphics.Designer.cs generated Normal file
View File

@ -0,0 +1,153 @@
namespace WinForm
{
partial class FormNoGraphics
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}

View File

@ -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<ExampleClass> GenerateRandomClass(int count)
{
string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
Random random = new Random();
List<ExampleClass> returnedList = new List<ExampleClass>();
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<ExampleClass> tableData = new();
List<PdfWithTableHeader> 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<string> { "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);
}
}
}
}

View File

@ -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());
}
}
}

View File

@ -8,4 +8,8 @@
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\WinFormsLibrary\WinFormsLibrary.csproj" />
</ItemGroup>
</Project>

View File

@ -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,
}
}

View File

@ -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<PdfWithDiagramSeries> Series { get; set; } = new();
}
}

View File

@ -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();
}
}

View File

@ -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<T>
{
public string FilePath { get; set; } = string.Empty;
public string DocumentTitle { get; set; } = string.Empty;
public List<PdfWithTableHeader> TableHeader { get; set; } = new();
public List<T> TableData { get; set; } = new();
public List<string> Props { get; set; } = new();
}
}

View File

@ -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<PdfWithTableSubHeader> SubColumns { get; set; } = new List<PdfWithTableSubHeader>();
}
}

View File

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

View File

@ -0,0 +1,36 @@
namespace WinFormsLibrary
{
partial class PdfGeneratorControl
{
/// <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,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<string> 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);
}
}
}

View File

@ -0,0 +1,36 @@
namespace WinFormsLibrary
{
partial class PdfGeneratorLinearDiagram
{
/// <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,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<LegendSettingsAttribute>();
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);
}
}
}

View File

@ -0,0 +1,36 @@
namespace WinFormsLibrary
{
partial class PdfTableGenerator
{
/// <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,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<T>(PdfWithTableData<T> 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<PdfWithTableHeader> 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<T>(Table table, PdfWithTableData<T> 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 { }
}
}
}
}
}

View File

@ -7,4 +7,10 @@
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="OxyPlot.Core" Version="2.1.2" />
<PackageReference Include="OxyPlot.WindowsForms" Version="2.1.2" />
<PackageReference Include="PdfSharp.MigraDoc.Standard" Version="1.51.15" />
</ItemGroup>
</Project>