Generating PDFs programmatically opens up automation possibilities—invoices, reports, certificates, contracts—all created on-demand from your C# code. Here's how to create PDFs from scratch.
using IronPdf;
// Install via NuGet: Install-Package IronPdf
var renderer = new [ChromePdfRenderer](https://ironpdf.com/blog/videos/how-to-render-html-string-to-pdf-in-csharp-ironpdf/)();
var pdf = renderer.RenderHtmlAsPdf("<h1>My First PDF</h1><p>Created with C#</p>");
pdf.SaveAs("document.pdf");
Three lines. That's a complete PDF document created from HTML—the simplest approach to PDF generation.
What Are My Options for Creating PDFs?
PDF creation in C# falls into two categories:
HTML-to-PDF approach:
- Write HTML/CSS content
- Render to PDF via browser engine
- Full CSS support, web fonts, responsive layouts
- Best for reports, invoices, web-like documents
Low-level PDF API approach:
- Position elements manually (x, y coordinates)
- Draw text, shapes, images at specific locations
- More control, more code
- Best for forms, labels, precise layouts
IronPDF excels at HTML-to-PDF. Let's explore both approaches.
How Do I Create a PDF from HTML?
The most flexible method—use HTML and CSS you already know:
using IronPdf;
// Install via NuGet: Install-Package IronPdf
var renderer = new ChromePdfRenderer();
var html = @"
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: Arial, sans-serif; padding: 40px; }
h1 { color: #333; border-bottom: 2px solid #007bff; }
.info { background: #f5f5f5; padding: 20px; margin: 20px 0; }
</style>
</head>
<body>
<h1>Invoice #12345</h1>
<div class='info'>
<p><strong>Customer:</strong> John Smith</p>
<p><strong>Date:</strong> January 15, 2024</p>
<p><strong>Total:</strong> $299.00</p>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("invoice.pdf");
CSS works as expected—flexbox, grid, web fonts, backgrounds. If it renders in Chrome, it renders to PDF.
How Do I Create a Blank PDF and Add Content?
Start with empty pages and build up:
using IronPdf;
// Install via NuGet: Install-Package IronPdf
// Create blank PDF with specific page count
var pdf = new PdfDocument(3); // 3 blank pages
// Add content via stamping
var stamp = new HtmlStamp
{
Html = "<h1 style='text-align:center'>Page Title</h1>",
Top = 50
};
pdf.ApplyStamp(stamp, 0); // Apply to first page
pdf.SaveAs("blank-with-content.pdf");
Blank PDFs are useful when you need specific page dimensions or want full control over placement.
How Do I Add Multiple Pages?
Build multi-page documents:
using IronPdf;
// Install via NuGet: Install-Package IronPdf
var renderer = new ChromePdfRenderer();
var pages = new List<PdfDocument>();
// Create separate pages
var page1 = renderer.RenderHtmlAsPdf("<h1>Chapter 1</h1><p>Introduction...</p>");
var page2 = renderer.RenderHtmlAsPdf("<h1>Chapter 2</h1><p>Details...</p>");
var page3 = renderer.RenderHtmlAsPdf("<h1>Chapter 3</h1><p>Conclusion...</p>");
pages.Add(page1);
pages.Add(page2);
pages.Add(page3);
// Merge into single document
var book = PdfDocument.Merge(pages);
book.SaveAs("multi-chapter.pdf");
// Cleanup
foreach (var page in pages) page.Dispose();
Merge creates a single PDF from multiple sources.
How Do I Control Page Layout?
Set paper size, orientation, and margins:
using IronPdf;
// Install via NuGet: Install-Package IronPdf
var renderer = new ChromePdfRenderer();
// Paper size
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
// Or Letter, Legal, A3, custom...
// Orientation
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;
// Or Landscape
// Margins in millimeters
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 25;
renderer.RenderingOptions.MarginRight = 25;
var pdf = renderer.RenderHtmlAsPdf("<h1>Formatted Document</h1>");
pdf.SaveAs("formatted.pdf");
A4 and Letter are most common. Landscape works better for wide tables.
How Do I Add Headers and Footers?
Consistent headers/footers across all pages:
using IronPdf;
// Install via NuGet: Install-Package IronPdf
var renderer = new ChromePdfRenderer();
// Header
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align:center; font-size:12px; color:#666;'>
Company Name | Confidential
</div>",
DrawDividerLine = true,
MaxHeight = 25
};
// Footer with page numbers
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align:center; font-size:10px;'>
Page {page} of {total-pages} | Generated {date}
</div>",
DrawDividerLine = true,
MaxHeight = 20
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1><p>Content here...</p>");
pdf.SaveAs("with-headers-footers.pdf");
Placeholders: {page}, {total-pages}, {date}, {time} auto-populate.
How Do I Include Images?
Embed images in your PDFs:
using IronPdf;
// Install via NuGet: Install-Package IronPdf
var renderer = new ChromePdfRenderer();
// Local file path
var html = @"
<html>
<body>
<img src='file:///C:/images/logo.png' width='200' />
<h1>Company Report</h1>
</body>
</html>";
// Or base64 embedded
var imageBytes = File.ReadAllBytes("logo.png");
var base64 = Convert.ToBase64String(imageBytes);
var htmlWithBase64 = $@"
<html>
<body>
<img src='data:image/png;base64,{base64}' width='200' />
<h1>Company Report</h1>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(htmlWithBase64);
pdf.SaveAs("with-logo.pdf");
Base64 embedding keeps everything self-contained. File paths need proper formatting.
How Do I Create Tables?
HTML tables render perfectly:
using IronPdf;
// Install via NuGet: Install-Package IronPdf
var renderer = new ChromePdfRenderer();
var html = @"
<html>
<head>
<style>
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #ddd; padding: 12px; text-align: left; }
th { background: #007bff; color: white; }
tr:nth-child(even) { background: #f9f9f9; }
</style>
</head>
<body>
<h1>Sales Report</h1>
<table>
<tr><th>Product</th><th>Quantity</th><th>Revenue</th></tr>
<tr><td>Widget A</td><td>150</td><td>$4,500</td></tr>
<tr><td>Widget B</td><td>89</td><td>$2,670</td></tr>
<tr><td>Widget C</td><td>234</td><td>$7,020</td></tr>
</table>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("sales-report.pdf");
CSS styling works just like web development.
How Do I Generate Dynamic Content?
Build PDFs from data:
using IronPdf;
// Install via NuGet: Install-Package IronPdf
public byte[] GenerateInvoice(Invoice invoice)
{
var renderer = new ChromePdfRenderer();
var lineItems = string.Join("",
invoice.Items.Select(item => $@"
<tr>
<td>{item.Description}</td>
<td>{item.Quantity}</td>
<td>${item.UnitPrice:F2}</td>
<td>${item.Total:F2}</td>
</tr>"));
var html = $@"
<html>
<body>
<h1>Invoice #{invoice.Number}</h1>
<p>Date: {invoice.Date:MMMM dd, yyyy}</p>
<p>Customer: {invoice.CustomerName}</p>
<table>
<tr><th>Item</th><th>Qty</th><th>Price</th><th>Total</th></tr>
{lineItems}
</table>
<p><strong>Grand Total: ${invoice.Total:F2}</strong></p>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
return pdf.BinaryData;
}
String interpolation or template engines (Razor, Handlebars) work well for dynamic HTML.
How Do I Use CSS Frameworks?
Bootstrap and other frameworks work:
using IronPdf;
// Install via NuGet: Install-Package IronPdf
var renderer = new ChromePdfRenderer();
var html = @"
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body class='container mt-4'>
<div class='card'>
<div class='card-header bg-primary text-white'>
<h2>Status Report</h2>
</div>
<div class='card-body'>
<p class='lead'>All systems operational.</p>
<div class='progress'>
<div class='progress-bar' style='width: 75%'>75%</div>
</div>
</div>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("bootstrap-styled.pdf");
CDN-hosted CSS loads during rendering. Or embed CSS inline for offline use.
How Do I Handle Page Breaks?
Control where pages split:
using IronPdf;
// Install via NuGet: Install-Package IronPdf
var renderer = new ChromePdfRenderer();
var html = @"
<html>
<head>
<style>
.page-break { page-break-after: always; }
.no-break { page-break-inside: avoid; }
</style>
</head>
<body>
<div>
<h1>Section 1</h1>
<p>Content for section 1...</p>
</div>
<div class='page-break'></div>
<div class='no-break'>
<h1>Section 2</h1>
<p>This section stays together on one page.</p>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
CSS page-break properties control pagination just like print stylesheets.
How Do I Add Watermarks?
Stamp watermarks across pages:
using IronPdf;
// Install via NuGet: Install-Package IronPdf
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1>");
// Text watermark
var watermark = new HtmlStamp
{
Html = "<div style='font-size:60px; color:rgba(200,0,0,0.3); transform:rotate(-45deg);'>DRAFT</div>",
HorizontalAlignment = HtmlStampHorizontalAlignment.Center,
VerticalAlignment = HtmlStampVerticalAlignment.Middle
};
pdf.ApplyStamp(watermark);
pdf.SaveAs("watermarked.pdf");
Watermarks appear on all pages, behind the main content.
Quick Reference
| Task | Approach |
|---|---|
| Create from HTML | renderer.RenderHtmlAsPdf(html) |
| Set page size | RenderingOptions.PaperSize = PdfPaperSize.A4 |
| Add header | RenderingOptions.HtmlHeader = new HtmlHeaderFooter { ... } |
| Multiple pages | PdfDocument.Merge(pages) |
| Page numbers |
{page} of {total-pages} in header/footer |
| Page breaks |
page-break-after: always CSS |
Creating PDFs in C# is essentially web development—write HTML and CSS, render to PDF. The skills transfer directly.
For more creation options and examples, see the IronPDF creation documentation.
Written by Jacob Mellor, CTO at Iron Software. Jacob created IronPDF and leads a team of 50+ engineers building .NET document processing libraries.
Top comments (0)