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");
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");
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
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");
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");
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;
}
How Do I Handle Images in Markdown?
Images referenced in Markdown need accessible paths:
!Architecture Diagram
!Logo
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");
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...
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");
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());
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 |
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");
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");
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();
}
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)