Report Generation — PDF, Excel, CSV

লেসন ২৬ / ৫০

PDF — HTML to PDF

// wkhtmltopdf
wkhtmltopdf input.html output.pdf

// Puppeteer
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("/report/123");
await page.pdf({path:"r.pdf", format:"A4"});

Library-based PDF

iTextSharp/iText 7 (.NET, Java), QuestPDF (.NET fluent), jsPDF (browser), ReportLab (Python), FPDF/TCPDF/Dompdf (PHP)।

QuestPDF

Document.Create(c => {
  c.Page(p => {
    p.Header().Text("Orders").Bold();
    p.Content().Table(t => {
      t.Header(h => h.Cell().Text("ID"));
      foreach(var o in orders) t.Cell().Text(o.Id);
    });
  });
}).GeneratePdf("r.pdf");

Excel — EPPlus

using var pkg = new ExcelPackage();
var ws = pkg.Workbook.Worksheets.Add("Orders");
ws.Cells[1,1].Value = "ID";
ws.Cells["A1:C1"].Style.Font.Bold = true;
ws.Cells[i+2,3].Style.Numberformat.Format = "#,##0.00";
ws.Cells.AutoFitColumns();
pkg.SaveAs(new FileInfo("orders.xlsx"));

Others: NPOI, ClosedXML, Apache POI, openpyxl, SheetJS, PhpSpreadsheet।

CSV

// CsvHelper
csv.WriteRecords(orders);
// UTF-8 BOM for Bengali in Excel
File.WriteAllText("f.csv", "\uFEFF"+content, Encoding.UTF8);

Streaming Large ⭐

Response.ContentType = "text/csv";
await using var w = new StreamWriter(Response.Body);
await foreach(var o in _db.Orders.AsAsyncEnumerable()) {
  await w.WriteLineAsync($"{o.Id},{o.Name},{o.Total}");
}

Watermark

page.Background().AlignCenter().Rotate(-45)
    .Text("DRAFT").FontSize(120).FontColor("#22FF0000");

Scheduled Delivery

RecurringJob.AddOrUpdate("monthly",
  () => GenerateAndEmail(), Cron.Monthly);

Performance Tips

Background job, email download link (S3), cache, pre-compute aggregations, server-side template।