DEV Community

IronSoftware
IronSoftware

Posted on

Markdown to PDF in C# (.NET Guide)

Markdown files are everywhere—README docs, technical specs, wiki pages. Converting them to PDF for distribution or archival takes just one method call.

using IronPdf;
// Install via NuGet: Install-Package IronPdf

var renderer = new [ChromePdfRenderer](https://ironpdf.com/blog/videos/how-to-render-webgl-sites-to-pdf-in-csharp-ironpdf/)();
var pdf = renderer.RenderMarkdownFileAsPdf("README.md");
pdf.SaveAs("README.pdf");
Enter fullscreen mode Exit fullscreen mode

Your Markdown renders with proper heading hierarchy, code blocks, lists, and links.

Why Convert Markdown to PDF?

Markdown is for writing. PDF is for sharing. Common scenarios:

  • Documentation delivery - Ship user manuals as PDFs, not .md files
  • Archival - PDF/A for long-term storage of technical docs
  • Printing - Controlled page breaks and formatting
  • Email attachments - PDFs work everywhere; Markdown doesn't

The challenge: Markdown has no native concept of pages, margins, or print layout. You need a conversion step.

How Do I Convert a Markdown File to PDF?

The simplest approach—point at a file, get a PDF:

using IronPdf;
// Install via NuGet: Install-Package IronPdf

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderMarkdownFileAsPdf(@"C:\docs\specification.md");
pdf.SaveAs("specification.pdf");
Enter fullscreen mode Exit fullscreen mode

The renderer parses Markdown syntax, converts it to styled HTML internally, then renders that HTML to PDF. You get proper formatting without writing any HTML.

How Do I Convert a Markdown String to PDF?

For Markdown stored in a database, API response, or generated dynamically:

using IronPdf;
// Install via NuGet: Install-Package IronPdf

var markdownContent = @"
# Project Overview

This document describes the **architecture** of our system.

## Components

- API Gateway
- Authentication Service
- Database Layer

## Code Example

Enter fullscreen mode Exit fullscreen mode


csharp
public class Example
{
public void Run() { }
}


For more details, see documentation.
";

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderMarkdownStringAsPdf(markdownContent);
pdf.SaveAs("project-overview.pdf");
Enter fullscreen mode Exit fullscreen mode

Headings become styled headers. Bold and italic work. Code blocks get monospace formatting.

How Do I Style the PDF Output?

Markdown itself has no styling. The converter applies default styles, but you can customize:

using IronPdf;
// Install via NuGet: Install-Package IronPdf

var renderer = new ChromePdfRenderer();

// Add custom CSS
renderer.RenderingOptions.CustomCssUrl = "https://yoursite.com/markdown-style.css";

// Or use a local stylesheet
renderer.RenderingOptions.CustomCssUrl = "file:///C:/styles/print.css";

var pdf = renderer.RenderMarkdownFileAsPdf("document.md");
pdf.SaveAs("styled-document.pdf");
Enter fullscreen mode Exit fullscreen mode

Your custom CSS controls fonts, colors, spacing, and code block formatting. A basic print stylesheet:

body {
    font-family: 'Georgia', serif;
    font-size: 12pt;
    line-height: 1.6;
    max-width: 8.5in;
    margin: 0 auto;
}

h1 { font-size: 24pt; margin-top: 0; }
h2 { font-size: 18pt; border-bottom: 1px solid #ccc; }

code {
    font-family: 'Consolas', monospace;
    background: #f5f5f5;
    padding: 2px 4px;
}

pre {
    background: #282c34;
    color: #abb2bf;
    padding: 16px;
    overflow-x: auto;
}
Enter fullscreen mode Exit fullscreen mode

How Do I Handle Images in Markdown?

Images referenced in Markdown need accessible paths:

!Architecture Diagram
!Logo
Enter fullscreen mode Exit fullscreen mode

For local images, set a base URL:

using IronPdf;
// Install via NuGet: Install-Package IronPdf

var renderer = new ChromePdfRenderer();

// Relative paths resolve from this location
renderer.RenderingOptions.BaseUrl = new Uri(@"C:\docs\");

var pdf = renderer.RenderMarkdownFileAsPdf(@"C:\docs\README.md");
pdf.SaveAs("README.pdf");
Enter fullscreen mode Exit fullscreen mode

Now !Diagram resolves to C:\docs\images\flow.png.

What Markdown Elements Are Supported?

Standard Markdown elements work well:

Element Support
Headings (#, ##, ###) Full
Bold, Italic Full
Links Full
Images Full
Ordered/Unordered Lists Full
Blockquotes Full
Horizontal Rules Full
Inline Code Full
Code Blocks Partial

Code blocks render but may not have syntax highlighting. For highlighted code, consider a two-step approach: convert Markdown to HTML with a library that supports highlighting (like Markdig with Prism), then render that HTML to PDF.

How Do I Add Page Breaks?

Markdown has no page break syntax. Inject them via HTML:

# Chapter 1

Content for chapter one...

<div style="page-break-after: always;"></div>

# Chapter 2

Content for chapter two...
Enter fullscreen mode Exit fullscreen mode

Most Markdown parsers pass through HTML elements. The PDF renderer picks up the CSS page-break directive.

How Do I Add Headers and Footers?

PDF-specific features like headers and footers come from rendering options:

using IronPdf;
// Install via NuGet: Install-Package IronPdf

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
    CenterText = "Company Documentation",
    FontSize = 10
};

renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
    LeftText = "{date}",
    RightText = "Page {page} of {total-pages}",
    FontSize = 9
};

var pdf = renderer.RenderMarkdownFileAsPdf("manual.md");
pdf.SaveAs("manual.pdf");
Enter fullscreen mode Exit fullscreen mode

The placeholders {page}, {total-pages}, and {date} are replaced during rendering.

How Do I Convert Multiple Markdown Files to One PDF?

Combine documentation files into a single document:

using IronPdf;
// Install via NuGet: Install-Package IronPdf

var files = new[] {
    "introduction.md",
    "installation.md",
    "configuration.md",
    "troubleshooting.md"
};

var renderer = new ChromePdfRenderer();
var pdfs = files.Select(f => renderer.RenderMarkdownFileAsPdf(f)).ToList();

// Merge all PDFs
var combined = PdfDocument.Merge(pdfs);
combined.SaveAs("complete-documentation.pdf");

// Clean up individual PDFs
pdfs.ForEach(p => p.Dispose());
Enter fullscreen mode Exit fullscreen mode

Each Markdown file becomes a section. Use page breaks between files for cleaner chapter separation.

How Do I Handle GitHub-Flavored Markdown?

GFM adds tables, task lists, and strikethrough. Basic tables work:

| Feature | Status |
|---------|--------|
| Login   | Done   |
| Signup  | WIP    |
Enter fullscreen mode Exit fullscreen mode

Task lists (- [ ] Item) may render as plain lists depending on the parser. Strikethrough (~~text~~) typically works.

For full GFM support, convert to HTML first using Markdig:

using Markdig;
using IronPdf;
// Install via NuGet: Install-Package IronPdf
// Install via NuGet: Install-Package Markdig

var markdown = File.ReadAllText("README.md");

// Markdig with GFM extensions
var pipeline = new MarkdownPipelineBuilder()
    .UseAdvancedExtensions()
    .Build();

var html = Markdown.ToHtml(markdown, pipeline);

// Wrap in HTML document for proper rendering
var fullHtml = $@"
    <html>
    <head>
        <link rel='stylesheet' href='github-markdown.css'>
    </head>
    <body class='markdown-body'>
        {html}
    </body>
    </html>";

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(fullHtml);
pdf.SaveAs("README.pdf");
Enter fullscreen mode Exit fullscreen mode

This gives you full control over Markdown parsing and styling.

How Do I Set Page Size and Margins?

Configure the PDF output dimensions:

using IronPdf;
// Install via NuGet: Install-Package IronPdf

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 25;
renderer.RenderingOptions.MarginBottom = 25;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;

var pdf = renderer.RenderMarkdownFileAsPdf("document.md");
pdf.SaveAs("a4-document.pdf");
Enter fullscreen mode Exit fullscreen mode

Margins are in millimeters. Common paper sizes include Letter, A4, Legal, and custom dimensions.

Quick Workflow for Documentation Sites

If you're converting an entire docs folder:

using IronPdf;
// Install via NuGet: Install-Package IronPdf

var docsFolder = @"C:\project\docs";
var outputFolder = @"C:\project\pdf-output";

var mdFiles = Directory.GetFiles(docsFolder, "*.md", SearchOption.AllDirectories);
var renderer = new ChromePdfRenderer();

foreach (var mdFile in mdFiles)
{
    var relativePath = Path.GetRelativePath(docsFolder, mdFile);
    var pdfPath = Path.Combine(outputFolder,
        Path.ChangeExtension(relativePath, ".pdf"));

    Directory.CreateDirectory(Path.GetDirectoryName(pdfPath));

    var pdf = renderer.RenderMarkdownFileAsPdf(mdFile);
    pdf.SaveAs(pdfPath);
    pdf.Dispose();
}
Enter fullscreen mode Exit fullscreen mode

This preserves your folder structure while converting every Markdown file to PDF.

Markdown to PDF conversion bridges the gap between developer-friendly writing and professional document distribution. One method call, styled output.

For the complete API reference, see the IronPDF Markdown 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)