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( string fileName, string documentTitle, List<(int startRow, int endRow, int startColumn, int endColumn)> mergeCells, List rowHeights, List<(string, string)> headersNames, List commonHeaders, List data) { // Проверка на заполненность входных данных if (string.IsNullOrEmpty(fileName) || string.IsNullOrEmpty(documentTitle) || mergeCells == null || rowHeights == null || headersNames == null || data == null) { 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) / (headersNames.Count + 1); // Ширина столбца // Отрисовка шапки for (int col = 0; col < commonHeaders.Count; col++) { gfx.DrawString(commonHeaders[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 < headersNames.Count; col++) { gfx.DrawString(headersNames[col].Item1, 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 < headersNames.Count; row++) { var item = data[col]; var property = item.GetType().GetProperty(headersNames[row].Item2); 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)); if (endColumn == 0) { gfx.DrawString(commonHeaders[startRow], font, XBrushes.Black, new XRect(mergeX, mergeY, mergeWidth, mergeHeight), XStringFormats.Center); } else { gfx.DrawString(headersNames[startRow].Item1, font, XBrushes.Black, new XRect(mergeX, mergeY, mergeWidth, mergeHeight), XStringFormats.Center); } } document.Save(fileName); } } }