DEV Community

IronSoftware
IronSoftware

Posted on

Create PDF in C# (A Simple .NET 10 Guide)

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");
Enter fullscreen mode Exit fullscreen mode

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");
Enter fullscreen mode Exit fullscreen mode

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");
Enter fullscreen mode Exit fullscreen mode

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();
Enter fullscreen mode Exit fullscreen mode

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");
Enter fullscreen mode Exit fullscreen mode

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");
Enter fullscreen mode Exit fullscreen mode

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");
Enter fullscreen mode Exit fullscreen mode

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");
Enter fullscreen mode Exit fullscreen mode

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;
}
Enter fullscreen mode Exit fullscreen mode

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");
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

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");
Enter fullscreen mode Exit fullscreen mode

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)