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।