Display dynamic header using Rotativa pdf in MVC

Herin picture Herin · Aug 31, 2015 · Viewed 10.3k times · Source

I wanted to print header data which are dynamic and will come from controller.

So how can I display that dynamic data in header using Rotativa pdf.

My header data include Name, Address, Contact info and other additional information, which are dynamic and generated from controller side.

I have created pdf with static header as below by using html page

string header = Server.MapPath("~/Static/NewFolder/PrintHeader.html");
 string footer = Server.MapPath("~/Static/NewFolder/PrintFooter.html");

 string customSwitches = string.Format("--header-html  \"{0}\" " +
                        "--header-spacing \"0\" " +
                        "--footer-html \"{1}\" " +
                        "--footer-spacing \"10\" " +
                        "--footer-font-size \"10\" " +
                        "--header-font-size \"10\" ", header, footer);

return new ViewAsPdf("SchedulePrintPdf", modelData)
                    {
                        CustomSwitches = customSwitches,
                        PageOrientation = Orientation.Portrait,
                        PageMargins = { Top = 20, Bottom = 22 },
                        SaveOnServerPath = filePath, FileName = Path.GetFileName(fileName)
                    };

This is working well with Static header.

Now I need the header text will go from this controller dynamically.

Answer

katho2404 picture katho2404 · Aug 31, 2015

I had a similar specification once and realized it with an extra View for Printing.

There you can get additional data from the controller and include a special CSS style. When you use bootstrap, consider that the resolution used for PDF-printing is very small, so you have to use the col-xs-* classes.

In my case the Print-View was called ResultPrint.cshtml and in the Controller I had this function:

    public ActionResult GeneratePDF(int id)
    {
        InputPrintModel model = db.InputPrintModel.Find(id);
        if (model == null)
        {
            return HttpNotFound();
        }

        try
        {
            return new ViewAsPdf("ResultPrint", model);
        }
        catch (Exception ex)
        {
            // Error Dialog + Logging
            return View("Result", model);
        }
    }

which was called in my Result.cshtml like this:

@Html.ActionLink("Generate PDF", "GeneratePDF", new { id = Model.Id })

EDIT

When you look at this answer https://stackoverflow.com/a/26544977/2660864 you can see, that you can use .cshtml files in your CustomActions (I did not test this code)

public ActionResult ViewPDF()
{
      string cusomtSwitches = string.Format("--print-media-type --allow {0} --footer-html {0} --footer-spacing -10",
            Url.Action("Footer", "Document", new { area = ""}, "https"));


     return new ViewAsPdf("MyPDF.cshtml", model)
                {
                    FileName = "MyPDF.pdf",
                    CustomSwitches = customSwitches
                };
}

[AllowAnonymous]
public ActionResult Footer()
{
    // get custom data for view
    return View(model);
}