How to Render a PDF from Html Pages Behind a Login or Form?

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 As var = New Uri("http://localhost:51169/Invoice")
Dim urlToPdf As var = New HtmlToPdf() {PrintOptions=newPdfPrintOptions(Unknown{MarginTop=50,MarginBottom=50,Header=newSimpleHeaderFooter(Unknown{CenterText={pdf-title},DrawDividerLine=true,FontSize=16Unknown,Footer=newSimpleHeaderFooter(Unknown{LeftText={date} {time},RightText=Page {page} of {total-pages},DrawDividerLine=true,FontSize=14Unknown,CssMediaType=PdfPrintOptions.PdfCssMediaType.PrintUnknown, LoginCredentials=newHttpLoginCredentials(Unknown{NetworkUsername=testUser,NetworkPassword=testPasswordUnknown}
Dim pdf As var = 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;


    Public Shared Function RenderPartialViewToString(this ByVal controller As Controller, ByVal viewPath As String, Optional ByVal model As Object = Nothing) As String
            Dim context = controller.ControllerContext
            controller.ViewData.Model = model
            Dim 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
        Catch ex As Exception
            Return ex.Message
        End Try
    End Function
VB   C#