using QuestPDF.Fluent; using QuestPDF.Infrastructure; using QuestPDF.Helpers; using Microsoft.EntityFrameworkCore.Metadata.Internal; public class TarBallPDF : IDocument { public DocumentMetadata GetMetadata() => new DocumentMetadata { Title = "TarBall Sampling Form", Author = "PAKAR SCIENO TW Integrated Environmental Solutions", Subject = "Environmental Survey and Observations" }; public void Compose(IDocumentContainer container) { container.Page(page => { // Page Setup page.Size(PageSizes.A4); page.Margin(1.1f, Unit.Centimetre); page.DefaultTextStyle(x => x.FontFamily("Arial").FontSize(10)); // Header Section page.Header().Row(row => { row.RelativeItem(1).Element(CellStyle).Column(column => { column.Item() .AlignMiddle() // Ensures vertical centering .AlignCenter() // Ensures horizontal centering .Text("Logo Placeholder"); // Placeholder for the logo }); row.RelativeItem(1).Element(CellStyle) .AlignMiddle() // Ensures vertical centering .AlignCenter() // Ensures horizontal centering .Text("TARBALL SAMPLING FORM") .FontSize(16) .FontColor("#4B0082"); row.RelativeItem(1).Column(column => { column.Spacing(0); // Adds consistent spacing between rows // Document Row column.Item().Row(innerRow => { innerRow.RelativeItem(1).Element(CellStyle).Text("Document:") .AlignLeft(); innerRow.RelativeItem(1).Element(CellStyle).Text("F-MM06") .AlignLeft().Bold(); }); column.Item().Row(innerRow => { innerRow.RelativeItem(1).Element(CellStyle).Text("Effective Date:") .AlignLeft(); innerRow.RelativeItem(1).Element(CellStyle).Text("1 April 2025") .AlignLeft(); }); column.Item().Row(innerRow => { innerRow.RelativeItem(1).Element(CellStyle).Text("Revision No.") .AlignLeft(); innerRow.RelativeItem(1).Element(CellStyle).Text("02") .AlignLeft(); }); }); // Define styles static IContainer CellStyle(IContainer container) => container.Border(0.5f).Padding(5); // Retains padding for text }); // Content Section page.Content().Column(column => { // Observations Table column.Item().Element(container => { container .PaddingTop(20) // Adds space above the text .PaddingBottom(10) .Text("Please be informed that we have observed the following conditions:"); }); column.Item().Table(table => { column.Spacing(0); table.ColumnsDefinition(columns => { columns.RelativeColumn(3); // Label/Header column columns.RelativeColumn(3); // Data Entry column }); // Table Rows table.Cell() .Background(Colors.Grey.Lighten2).Element(CellStyle).Text("STATE") .Bold(); table.Cell().Element(CellStyle).Text(""); // Empty cell for data entry table.Cell() .Background(Colors.Grey.Lighten2).Element(CellStyle).Text("STATION ID") .Bold(); table.Cell().Element(CellStyle).Text(""); // Empty cell for data entry table.Cell() .Background(Colors.Grey.Lighten2).Element(CellStyle).Text("LOCATION") .Bold(); table.Cell().Element(CellStyle).Text(""); // Empty cell for data entry table.Cell() .Background(Colors.Grey.Lighten2).Element(CellStyle).Text("TARBALL SURVEY LOCATION LONGITUDE & LATITUDE") .Bold(); table.Cell().Element(CellStyle).Text(""); // Empty cell for data entry table.Cell() .Background(Colors.Grey.Lighten2).Element(CellStyle).Text("DATE / TIME") .Bold(); table.Cell().Element(CellStyle).Text(""); // Empty cell for data entry }); column.Spacing(3); // Survey Findings column.Item() .PaddingTop(10) // Adds space above the text .PaddingBottom(10) .Text("SURVEY FINDING:") .Bold().FontSize(12); column.Item() .PaddingBottom(10) .Text("Tar Ball: [☐] YES [☐] NO").FontSize(10); column.Item() .PaddingBottom(10) .Text("If YES, Tar Ball falls under the classification of:").FontSize(10); column.Item() .PaddingBottom(10) .Text("[☐] Sand [☐] Non-sandy [☐] Coquina").FontSize(10); column.Item() .PaddingBottom(10) .Text("*tick wherever applicable"); // Photos Section Title column.Item() .PaddingBottom(5) .Text("PHOTOGRAPHS OF SAMPLING") .AlignCenter() // Ensures horizontal centering .Bold() .FontSize(14); // Table for Photos with Existing Heights column.Item().Table(table => { column.Spacing(0); // No extra spacing between rows table.ColumnsDefinition(columns => { columns.RelativeColumn(1); // First column columns.RelativeColumn(1); // Second column }); // For pictures table.Cell().Element(CellStyle).Height(150); table.Cell().Element(CellStyle).Height(150); table.Cell().Element(CellStyle).Text("Figure 1: Left Side Coastal View").FontSize(12).AlignLeft(); table.Cell().Element(CellStyle).Text("Figure 2: Right Side Coastal View").FontSize(12).AlignLeft(); table.Cell().Element(CellStyle).Height(150); table.Cell().Element(CellStyle).Height(150); table.Cell().Element(CellStyle).Text("Figure 3: Drawing Vertical Lines").FontSize(12).AlignLeft(); table.Cell().Element(CellStyle).Text("Figure 4: Drawing Horizontal Lines (Racking)").FontSize(12).AlignLeft(); }); // Page Break column.Item().PageBreak(); // Additional Photos Section column.Item() .PaddingBottom(5) .AlignCenter(); // Ensures horizontal centering // Table for Additional Photos column.Item().Table(table => { column.Spacing(0); // No extra spacing between rows table.ColumnsDefinition(columns => { columns.RelativeColumn(1); // First column columns.RelativeColumn(1); // Second column }); // Row 1: Empty spaces for pictures table.Cell().Element(CellStyle).Height(150); table.Cell().Element(CellStyle).Height(150); // Row 2: Labels for the pictures table.Cell().Element(CellStyle).Text("Figure 5:").FontSize(12).AlignLeft(); table.Cell().Element(CellStyle).Text("Figure 6:").FontSize(12).AlignLeft(); // Row 3: Empty spaces for pictures table.Cell().Element(CellStyle).Height(150); table.Cell().Element(CellStyle).Height(150); // Row 4: Labels for the pictures table.Cell().Element(CellStyle).Text("Figure 7:").FontSize(12).AlignLeft(); table.Cell().Element(CellStyle).Text("Figure 8:").FontSize(12).AlignLeft(); }); // Note Section column.Item() .PaddingTop(10) .PaddingBottom(20) .Text("* If there are any event observe at the current station it is compulsory to add optional photo with description (figure 5 to figure 8)") .FontSize(10) .AlignLeft(); // Signature Section column.Item().Table(table => { //define how many columns the table has table.ColumnsDefinition(columns => { columns.RelativeColumn(2); // Label column columns.RelativeColumn(1); // Signature column columns.RelativeColumn(2); //empty columns.RelativeColumn(1); // Date column columns.RelativeColumn(1); //empty }); // Signature Rows table.Cell().RowSpan(2).Element(CellStyle).Text("REPORTED BY :").Bold().FontSize(12); table.Cell().Element(CellStyle).Text("Signature").FontSize(12); table.Cell().Element(CellStyle).Text("").FontSize(12); table.Cell().Element(CellStyle).Text("Date").FontSize(12); table.Cell().Element(CellStyle).Text("").FontSize(12); table.Cell().Element(CellStyle).Text("Designation").FontSize(12); table.Cell().ColumnSpan(3).Element(CellStyle).Text("").FontSize(12); table.Cell().RowSpan(2).Element(CellStyle).Text("CHECKED BY :").Bold().FontSize(12); table.Cell().Element(CellStyle).Text("Signature").FontSize(12); table.Cell().Element(CellStyle).Text("").FontSize(12); table.Cell().Element(CellStyle).Text("Date").FontSize(12); table.Cell().Element(CellStyle).Text("").FontSize(12); table.Cell().Element(CellStyle).Text("Designation").FontSize(12); table.Cell().ColumnSpan(3).Element(CellStyle).Text("").FontSize(12); table.Cell().RowSpan(2).Element(CellStyle).Text("VERIFIED BY :").Bold().FontSize(12); table.Cell().Element(CellStyle).Text("Signature").FontSize(12); table.Cell().Element(CellStyle).Text("").FontSize(12); table.Cell().Element(CellStyle).Text("Date").FontSize(12); table.Cell().Element(CellStyle).Text("").FontSize(12); table.Cell().Element(CellStyle).Text("Designation").FontSize(12); table.Cell().ColumnSpan(3).Element(CellStyle).Text("").FontSize(12); }); }); // Footer Section page.Footer().AlignCenter().Text(text => { text.Span("Page "); text.CurrentPageNumber(); text.Span(" of "); text.TotalPages(); }); static IContainer CellStyle(IContainer container) => container.Border(0.5f) .Padding(5); }); } }