Render a PDF from HTML Pages Behind a Login or Form with C# .NET

The best way to deal with logins is to avoid them if possible, and render html directly from a file or a string.

Login using Network Authentication

Most ASP.Net applications support network authentication which is more reliable than html form posting,

var uri = new Uri("http://localhost:51169/Invoice");

var urlToPdf = new HtmlToPdf


    PrintOptions = new PdfPrintOptions()


        MarginTop = 50,

        MarginBottom = 50,

        Header = new SimpleHeaderFooter()


            CenterText = "{pdf-title}",

            DrawDividerLine = true,

            FontSize = 16


        Footer = new SimpleHeaderFooter()


            LeftText = "{date} {time}",

            RightText = "Page {page} of {total-pages}",

            DrawDividerLine = true,

            FontSize = 14


        CssMediaType = PdfPrintOptions.PdfCssMediaType.Print


    // setting login credentials to bypass basic authentication

    LoginCredentials = new HttpLoginCredentials()


        NetworkUsername = "testUser",

        NetworkPassword = "testPassword"



var pdf = urlToPdf.RenderUrlAsPdf(uri);

pdf.SaveAs(Path.Combine(Directory.GetCurrentDirectory(), "UrlToPdfExample2.Pdf"));
Dim uri = New Uri("http://localhost:51169/Invoice")

Dim urlToPdf = New HtmlToPdf With {
	.PrintOptions = New PdfPrintOptions() With {
		.MarginTop = 50,
		.MarginBottom = 50,
		.Header = New SimpleHeaderFooter() With {
			.CenterText = "{pdf-title}",
			.DrawDividerLine = True,
			.FontSize = 16
		.Footer = New SimpleHeaderFooter() With {
			.LeftText = "{date} {time}",
			.RightText = "Page {page} of {total-pages}",
			.DrawDividerLine = True,
			.FontSize = 14
		.CssMediaType = PdfPrintOptions.PdfCssMediaType.Print
	.LoginCredentials = New HttpLoginCredentials() With {
		.NetworkUsername = "testUser",
		.NetworkPassword = "testPassword"

Dim pdf = urlToPdf.RenderUrlAsPdf(uri)

pdf.SaveAs(Path.Combine(Directory.GetCurrentDirectory(), "UrlToPdfExample2.Pdf"))
VB   C#

Login using an HTML Form

To log in by sending data to a HTML form may also be achieved using the HttpLoginCredentials class as in the previous example.

Instead of specifying a username and password, you may choose to send CustomPostVariables, LoginFormPostVariables etc

Please Consider:

  • The login data must be posted to the url specified in the HTML form's ACTION attribute. This should be set as the *LoginFormUrl* attribute of the HttpLoginCredentials. This may vary from the url you actually want to render as a PDF.
  • The data to be sent should represent every input and textarea in the HTML form. The name attributes define the name of each variable (not the id as is commonly misunderstood).
  • Some websites may active protect against this kind of machine login.


The following work around allows a dot net MVC view to be rendered programmatically to a string - which is very useful in avoiding MVC logins yet rendering a view faithfully.

public static string RenderPartialViewToString(this Controller controller, string viewPath, object model = null)




var context = controller.ControllerContext;

controller.ViewData.Model = model;

using (var sw = new StringWriter())


var viewResult = ViewEngines.Engines.FindPartialView(context, viewPath);

if (viewResult.View == null)


throw new Exception($"Partial view {viewPath} could not be found.");


var viewContext = new ViewContext(context, viewResult.View, context.Controller.ViewData,

context.Controller.TempData, sw);

viewResult.View.Render(viewContext, sw);

viewResult.ViewEngine.ReleaseView(context, viewResult.View);

return sw.GetStringBuilder().ToString();



catch (Exception ex)


return ex.Message;


<System.Runtime.CompilerServices.Extension> _
Public Function RenderPartialViewToString(ByVal controller As Controller, ByVal viewPath As String, Optional ByVal model As Object = Nothing) As String


Dim context = controller.ControllerContext

controller.ViewData.Model = model

Using sw = New StringWriter()

Dim viewResult = ViewEngines.Engines.FindPartialView(context, viewPath)

If viewResult.View Is Nothing Then

Throw New Exception($"Partial view {viewPath} could not be found.")

End If

Dim viewContext = New ViewContext(context, viewResult.View, context.Controller.ViewData, context.Controller.TempData, sw)

viewResult.View.Render(viewContext, sw)

viewResult.ViewEngine.ReleaseView(context, viewResult.View)

Return sw.GetStringBuilder().ToString()

End Using

Catch ex As Exception

Return ex.Message

End Try

End Function
VB   C#