DEV Community

IronSoftware
IronSoftware

Posted on

How to Convert URL to PDF in C# (.NET Guide)

Converting live web pages to PDF captures dynamic content—dashboards, reports, invoices—exactly as they appear in the browser. Here's how to do it in C# without spawning Chrome processes manually.

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.RenderUrlAsPdf("https://en.wikipedia.org/wiki/PDF");
pdf.SaveAs("wikipedia-article.pdf");
Enter fullscreen mode Exit fullscreen mode

The URL renders with full CSS, JavaScript execution, and web fonts—just like a real browser screenshot, but as a searchable PDF.

Why Convert URLs to PDF?

Real-world scenarios where URL-to-PDF shines:

  • Report snapshots — Capture BI dashboards at specific times
  • Invoice archival — Store hosted invoices as permanent records
  • Documentation — Convert online docs for offline access
  • Evidence collection — Legal/compliance snapshots of web content
  • Content distribution — Turn web articles into downloadable PDFs

The key advantage: you don't need to recreate the HTML. If it renders in a browser, it renders to PDF.

How Does It Work Under the Hood?

IronPDF embeds a Chromium engine. When you call RenderUrlAsPdf:

  1. Chrome navigates to the URL
  2. Page loads completely (DOM, CSS, images, JS)
  3. JavaScript executes (charts render, dynamic content loads)
  4. Chrome's print-to-PDF captures the rendered state
  5. You get a PDF with selectable text and vector graphics

No external Chrome installation required—it's bundled in the NuGet package.

How Do I Wait for Dynamic Content?

Modern pages load content asynchronously. Ensure everything renders:

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

var renderer = new ChromePdfRenderer();

// Wait for network idle (no requests for 500ms)
renderer.RenderingOptions.WaitFor.NetworkIdle(5000);

// Or wait for specific element to appear
renderer.RenderingOptions.WaitFor.HtmlElementById("chart-container", 10000);

// Or simple delay after page load
renderer.RenderingOptions.WaitFor.RenderDelay(3000);

var pdf = renderer.RenderUrlAsPdf("https://dashboard.example.com");
Enter fullscreen mode Exit fullscreen mode

Dynamic dashboards with Chart.js, D3, or React components need time to render. Don't rush it.

How Do I Handle Authentication?

Many URLs require login. Pass session cookies or credentials:

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

var renderer = new ChromePdfRenderer();

// Option 1: Pass session cookies
renderer.RenderingOptions.CustomCookies = new Dictionary<string, string>
{
    { ".AspNetCore.Identity.Application", "your-auth-cookie" },
    { "session_id", "abc123" }
};

// Option 2: Use HTTP basic auth
renderer.RenderingOptions.HttpLoginCredentials = new HttpLoginCredentials
{
    NetworkUsername = "username",
    NetworkPassword = "password"
};

var pdf = renderer.RenderUrlAsPdf("https://internal.company.com/reports");
Enter fullscreen mode Exit fullscreen mode

Without proper authentication, you'll get the login page instead of the protected content.

How Do I Control Page Layout?

Configure paper size, orientation, and margins:

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

var renderer = new ChromePdfRenderer();

// Page setup
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;

// Margins (in millimeters)
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 15;
renderer.RenderingOptions.MarginRight = 15;

// Print background colors/images
renderer.RenderingOptions.PrintHtmlBackgrounds = true;

var pdf = renderer.RenderUrlAsPdf("https://example.com/wide-report");
Enter fullscreen mode Exit fullscreen mode

Landscape works better for data tables. Portrait suits articles and forms.

How Do I Add Headers and Footers?

Overlay page numbers, dates, or branding:

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

var renderer = new ChromePdfRenderer();

// Header with logo and title
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='text-align: center; font-size: 12px;'>
            <span>Company Report</span> |
            <span>{date}</span>
        </div>",
    DrawDividerLine = true
};

// Footer with page numbers
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='text-align: center; font-size: 10px;'>
            Page {page} of {total-pages}
        </div>"
};

var pdf = renderer.RenderUrlAsPdf("https://example.com/report");
Enter fullscreen mode Exit fullscreen mode

Placeholders like {page}, {total-pages}, {date}, and {time} auto-populate.

How Do I Render Mobile or Responsive Views?

Set viewport width to trigger responsive breakpoints:

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

var renderer = new ChromePdfRenderer();

// Desktop view (default)
renderer.RenderingOptions.ViewPortWidth = 1920;

// Tablet view
// renderer.RenderingOptions.ViewPortWidth = 768;

// Mobile view
// renderer.RenderingOptions.ViewPortWidth = 375;

var pdf = renderer.RenderUrlAsPdf("https://responsive-site.com");
Enter fullscreen mode Exit fullscreen mode

Responsive sites adjust layout based on viewport. Control which version gets captured.

How Do I Handle JavaScript-Heavy Pages?

Enable and configure JavaScript execution:

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

var renderer = new ChromePdfRenderer();

// JavaScript is enabled by default
renderer.RenderingOptions.EnableJavaScript = true;

// Give JS time to execute
renderer.RenderingOptions.WaitFor.JavaScript("window.chartLoaded === true", 10000);

// Or wait for all AJAX to complete
renderer.RenderingOptions.WaitFor.NetworkIdle(3000);

var pdf = renderer.RenderUrlAsPdf("https://spa-dashboard.example.com");
Enter fullscreen mode Exit fullscreen mode

Single-page apps (React, Vue, Angular) need JavaScript. Without it, you get empty shells.

How Do I Scale Content to Fit?

Zoom in or out to control content density:

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

var renderer = new ChromePdfRenderer();

// Zoom out to fit more content per page
renderer.RenderingOptions.Zoom = 75; // 75%

// Or zoom in for larger text
// renderer.RenderingOptions.Zoom = 125; // 125%

var pdf = renderer.RenderUrlAsPdf("https://dense-data-table.com");
Enter fullscreen mode Exit fullscreen mode

Wide tables or dense dashboards often need zoom adjustment to fit on paper.

How Do I Convert Multiple URLs?

Batch convert and optionally merge:

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

var renderer = new ChromePdfRenderer();
var urls = new[]
{
    "https://example.com/chapter-1",
    "https://example.com/chapter-2",
    "https://example.com/chapter-3"
};

var pdfs = new List<PdfDocument>();
foreach (var url in urls)
{
    pdfs.Add(renderer.RenderUrlAsPdf(url));
}

// Merge into single PDF
var merged = PdfDocument.Merge(pdfs);
merged.SaveAs("complete-book.pdf");

// Cleanup
foreach (var pdf in pdfs) pdf.Dispose();
Enter fullscreen mode Exit fullscreen mode

Or save each separately for individual distribution.

How Do I Handle SSL Certificate Errors?

For development environments with self-signed certs:

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

var renderer = new ChromePdfRenderer();

// Accept self-signed certificates (development only!)
renderer.RenderingOptions.AcceptSslCertificate = true;

var pdf = renderer.RenderUrlAsPdf("https://localhost:5001/dev-report");
Enter fullscreen mode Exit fullscreen mode

Only use this in development. Production should have valid certificates.

How Do I Capture Specific Page Sections?

Target part of a page using CSS selectors:

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

var renderer = new ChromePdfRenderer();

// Apply custom CSS to hide unwanted elements
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

// Inject CSS to hide headers, footers, navigation
renderer.RenderingOptions.CustomCssUrl = "https://example.com/print-styles.css";

var pdf = renderer.RenderUrlAsPdf("https://example.com/article");
Enter fullscreen mode Exit fullscreen mode

Alternatively, many sites have print stylesheets that automatically clean up the layout.

What About Async Operations?

Use async for better performance in web apps:

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

public async Task<byte[]> ConvertUrlToPdfAsync(string url)
{
    var renderer = new ChromePdfRenderer();

    renderer.RenderingOptions.WaitFor.NetworkIdle(2000);

    var pdf = await renderer.RenderUrlAsPdfAsync(url);
    return pdf.BinaryData;
}
Enter fullscreen mode Exit fullscreen mode

Don't block your web server's threads waiting for PDF generation.

Quick Reference

Task Code
Basic conversion renderer.RenderUrlAsPdf(url)
Wait for load WaitFor.NetworkIdle(5000)
Set cookies CustomCookies = new Dictionary<string, string> { ... }
Landscape mode PaperOrientation = PdfPaperOrientation.Landscape
Add page numbers HtmlFooter.HtmlFragment = "Page {page} of {total-pages}"
Mobile viewport ViewPortWidth = 375

URL-to-PDF conversion turns any web page into a portable document. The browser does the rendering work—you just capture the result.

For advanced configuration options, see the IronPDF URL rendering 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)