Display dynamic header using Rotativa pdf in MVC

10,887

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);
}
Share:
10,887
Herin
Author by

Herin

Updated on June 24, 2022

Comments

  • Herin
    Herin almost 2 years

    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.