Which package do you need?
Short answer: pick by what your users open. A final, portable file — PDF Reporting. A browser or an HTML pipeline — HTML Reporting. Microsoft Word — DOCX Reporting. All three share the same fluent mental model, and many teams ship more than one.
By requirement
| You need… | Pdf.Reporting | Html.Reporting | Docx.Reporting |
|---|---|---|---|
| A true PDF file, server-side | ✓ Best fitReal PDF 1.7 bytes, no browser or converter | —Needs a browser or HTML-to-PDF step | —Word can export, but that needs Word |
| A printable, PDF-style page in the browser | —PDFs need a viewer, not a web page | ✓ Best fitFixed pages; print/save to PDF from any browser | —Word can print, but layout lives in Word's engine |
| An editable deliverable | —Output is final-form PDF | —Output is final-form HTML | ✓ Best fitReal .docx users can revise and track changes in |
| Charts | ✓ Vector canvasDraw bars, lines, shapes with the Canvas API | —Bring your own SVG via raw HTML | ✓ NativeEditable Word charts: bar, line, pie, stacked |
| Barcodes & QR codes | ✓ Code 128 + QRVector barcodes and full ISO 18004 QR codes | ✓ Code 128 PNGGenerated in-library | ✓ Code 128 vectorCrisp at any zoom and print resolution |
| Filling an existing branded template | —Reusable IComponent templates, not file-based | — | ✓Placeholder & content-control replacement |
| Password protection / encryption | ✓ AES-256User/owner passwords, permission flags | — | ✓ Restrict EditingGuard rail, not encryption |
| Bookmarks & table of contents | ✓Auto TOC from headings, hierarchical outlines | — | ✓Captions and table of figures |
| Precise pagination control | ✓Two-pass layout, explicit page breaks, repeating headers | ✓Line-level splits, atomic row groups, layout warnings | —Word paginates when the document opens |
| Very large reports | ✓Deterministic code-first rendering, no browser engine | ✓Streaming, page-at-a-time async rendering | ✓Open XML packages are compact |
| Zero dependencies | ✓Pure managed C#, no native binaries | ✓Dependency-free core | ✓No Word, no COM — writes Open XML directly |
| .NET Framework support | —Targets .NET 8, 9, and 10 | ✓netstandard2.0 — .NET Framework 4.6.1+ | ✓netstandard2.0 — .NET Framework 4.6.1+ |
The same mental model
Whichever you choose, the skills transfer: create a document, describe pages and content with fluent builders, publish. Here is the same header-content-footer shape in all three:
TerraFluent.Pdf.Reporting
PdfDocument.Create(container =>
{
container.Page(page =>
{
page.Size(PageSize.A4);
page.Header().Text("Quarterly Report").Bold();
page.Footer().AlignCenter().Text(t =>
{
t.Span("Page "); t.CurrentPageNumber();
t.Span(" / "); t.TotalPages();
});
page.Content().Column(col =>
{
col.Item().H1("Executive Summary");
col.Item().Text("Revenue improved across every practice.");
});
});
}).PublishPdf("report.pdf");TerraFluent.Html.Reporting
var report = ReportDocument.Create(PageSize.A4)
.Header(h => h.AddText("Quarterly Report").Bold())
.Footer(f => f.AddPageNumber("Page {page} of {totalPages}"))
.Content(c =>
{
c.AddHeading("Executive Summary", HeadingLevel.H1);
c.AddParagraph("Revenue improved across every practice.");
})
.Build();
report.RenderHtmlDocument("report.html");TerraFluent.Docx.Reporting
Document.Create(doc =>
{
doc.Page(page =>
{
page.Size(PageSize.A4);
page.Header().Text("Quarterly Report", t => t.Bold());
page.Footer().Text(t =>
{
t.Span("Page "); t.CurrentPageNumber();
t.Span(" of "); t.TotalPages();
});
page.Content().H1("Executive Summary");
page.Content().Text("Revenue improved across every practice.");
});
}).PublishDocx("report.docx");Honest counter-signals
- Pick Html.Reporting even for PDF asks if your report must also live on a web page or in an email — one HTML output serves the browser, and printing covers the occasional PDF.
- Pick Docx.Reporting even for print if your organization's workflow reviews and signs documents in Word — fidelity to Word's own pagination matters more than pixel control.
- Pick Html.Reporting even for "editable" asks if edits are really data changes — regenerate the report instead of letting people hand-edit output.
- Converting existing HTML to PDF? Pdf.Reporting is code-first, not an HTML-to-PDF converter — if your source content is already HTML, an HTML-to-PDF converter is a better fit.
- Still on .NET Framework? Pdf.Reporting needs .NET 8+; Html.Reporting and Docx.Reporting run all the way back to .NET Framework 4.6.1 via netstandard2.0.
- Using more than one? They're independent packages with no shared dependency — adding another costs nothing but the package reference.
Common questions
Should I generate PDF, HTML, or DOCX reports in .NET?
Pick by what your users open. If they need a final, portable file, use TerraFluent.Pdf.Reporting for true PDFs. If they view in a browser or you want an HTML pipeline that prints to PDF, use TerraFluent.Html.Reporting. If they revise, comment, or track changes in Microsoft Word, use TerraFluent.Docx.Reporting. All three share the same fluent mental model.
Can I generate PDF files server-side without a browser?
Yes. TerraFluent.Pdf.Reporting writes true PDF 1.7 bytes directly from C# — pure managed code with zero dependencies, so it runs in Docker, Azure Functions, and AWS Lambda with no headless browser or converter in the loop.
Can I convert the HTML report output to a PDF file server-side?
TerraFluent.Html.Reporting produces print-perfect, self-contained HTML pages, so any HTML-to-PDF step you already trust (a browser print dialog or a server-side converter) turns them into PDF. If you want PDF bytes without any converter, use TerraFluent.Pdf.Reporting instead.
Can I use multiple TerraFluent packages in one project?
Yes. They are independent NuGet packages with no shared dependency — adding more than one costs nothing but the package references, and the fluent API skills transfer between them.
Still unsure? Look at the output.
The samples gallery shows real rendered documents from every library — five minutes there usually settles it.