COP_Petrushin_PIbd-32/Library14Petrushin/PdfColGroupTable.cs
2024-09-30 00:41:41 +04:00

102 lines
4.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using PdfSharp.Drawing;
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 Library14Petrushin
{
public partial class PdfColGroupTable : Component
{
public void GeneratePdf<T>(
string fileName,
string documentTitle,
List<(int startRow, int endRow, int startColumn, int endColumn)> mergeCells,
List<double> rowHeights,
List<string> headers,
List<string> propertyNames,
List<T> data)
{
// Проверка на заполненность входных данных
if (string.IsNullOrEmpty(fileName) || string.IsNullOrEmpty(documentTitle) ||
mergeCells == null || rowHeights == null || headers == null ||
propertyNames == null || data == null)
{
throw new ArgumentException("Все входные данные должны быть заполнены.");
}
// Проверка на соответствие количества заголовков и свойств
if (headers.Count != propertyNames.Count)
{
throw new ArgumentException("Количество заголовков должно совпадать с количеством свойств.");
}
// Проверка на соответствие количества строк и высот строк
if (rowHeights.Count != data.Count)
{
throw new ArgumentException("Количество высот строк должно совпадать с количеством строк данных.");
}
// Создание документа
PdfDocument document = new PdfDocument();
PdfPage page = document.AddPage();
XGraphics gfx = XGraphics.FromPdfPage(page);
XFont font = new XFont("Verdana", 10);
// Отрисовка заголовка документа
gfx.DrawString(documentTitle, new XFont("Verdana", 16, XFontStyleEx.Bold), XBrushes.Black, new XRect(0, 0, page.Width, 50), XStringFormats.Center);
// Отрисовка таблицы
double margin = 50; // Отступ от краев страницы
double x = margin;
double y = 70;
double rowHeight = 20; // Фиксированная высота строки
double columnWidth = (page.Width - 2 * margin) / (headers.Count + 1); // Ширина столбца
// Отрисовка шапки
for (int col = 0; col < headers.Count; col++)
{
gfx.DrawString(headers[col], font, XBrushes.Black, new XRect(x, y + col * rowHeight, columnWidth, rowHeight), XStringFormats.CenterLeft);
gfx.DrawRectangle(XPens.Black, new XRect(x, y + col * rowHeight, columnWidth, rowHeight)); // Добавляем рамку
}
x += columnWidth;
// Отрисовка данных
for (int col = 0; col < data.Count; col++)
{
for (int row = 0; row < propertyNames.Count; row++)
{
var item = data[col];
var property = item.GetType().GetProperty(propertyNames[row]);
if (property != null)
{
var value = property.GetValue(item)?.ToString() ?? string.Empty;
gfx.DrawString(value, font, XBrushes.Black, new XRect(x + col * columnWidth, y + row * rowHeight, columnWidth, rowHeight), XStringFormats.CenterLeft);
gfx.DrawRectangle(XPens.Black, new XRect(x + col * columnWidth, y + row * rowHeight, columnWidth, rowHeight)); // Добавляем рамку
}
}
}
// Объединение ячеек
foreach (var (startRow, endRow, startColumn, endColumn) in mergeCells)
{
double mergeX = margin + (startColumn * columnWidth);
double mergeWidth = (endColumn - startColumn + 1) * columnWidth;
double mergeY = 70 + (startRow * rowHeight);
double mergeHeight = (endRow - startRow + 1) * rowHeight;
gfx.DrawRectangle(XPens.Black, XBrushes.White, new XRect(mergeX, mergeY, mergeWidth, mergeHeight));
gfx.DrawString(headers[startRow], font, XBrushes.Black, new XRect(mergeX, mergeY, mergeWidth, mergeHeight), XStringFormats.Center);
}
// Сохранение документа
document.Save(fileName);
}
}
}