wkHtmlToPdf - Header and footer on all pages

1

I'm trying to generate a "report" using the Rotating, but I'm having difficulty for the header and footer to repeat on all pages:

This is the sketch of what I've done:

Controller

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using Rotativa;

namespace RotativaSample.Controllers.Home
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var customSwitches = new Dictionary<string, string>();
            customSwitches.Add("--print-media-type", string.Empty);
            customSwitches.Add("--allow", Url.Action(string.Empty, "Home", null, "http"));
            customSwitches.Add("--header-html", Url.Action("Header", "Home", null, "http"));
            customSwitches.Add("--header-spacing", "5");
            customSwitches.Add("--footer-html", Url.Action("Footer", "Home", null, "http"));
            customSwitches.Add("--footer-spacing", "5");
            customSwitches.Add("--margin-bottom", "15mm");
            customSwitches.Add("--margin-left", "10mm");
            customSwitches.Add("--margin-right", "10mm");
            customSwitches.Add("--margin-top", "15mm");

            var report = new ViewAsPdf("Content", null);
            report.CustomSwitches = String.Join(" ", customSwitches.Select(pair => pair.Key + " " + pair.Value));
            return report;
        }

        public ActionResult Header(PageModel model)
        {
            return View(model);
        }

        public ActionResult Footer(PageModel model)
        {
            return View(model);
        }
    }
}

Template

using System;

namespace RotativaSample.Models
{
    public class PageModel
    {
        public int page { get; set; }
        public int frompage { get; set; }
        public int topage { get; set; }
        public string webpage { get; set; }
        public string section { get; set; }
        public string subsection { get; set; }
        public string date { get; set; }
        public DateTime isodate { get; set; }
        public string time { get; set; }
        public string title { get; set; }
        public string doctitle { get; set; } 
        public int sitepage { get; set; }
        public int sitepages { get; set; }

        public DateTime datetime 
        { 
            get 
            { 
                return DateTime.Parse(date + " " + time);
            }
        }
    }
}

View Content

<!DOCTYPE HTML>
<html lang='en-US'>
    <head>
        <link href="@Href("~/Content/Home/content.css")" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <section>
            <div id="lipsum">
                <p>
                    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis eu facilisis nibh. Phasellus laoreet diam sed dolor accumsan, et laoreet urna aliquam. Pellentesque facilisis nisi id nibh efficitur, eget consequat dui maximus. Etiam lobortis mauris vitae eros pharetra hendrerit. Praesent scelerisque est sem, sed rhoncus nisl auctor id. Duis pulvinar, augue nec volutpat finibus, felis risus ullamcorper lectus, ac fringilla nisi leo eu velit. Aliquam finibus pellentesque ullamcorper. Morbi lacinia egestas ligula, sed rutrum eros interdum a. Vestibulum porttitor enim vel purus vestibulum, eget varius dui condimentum. Nullam a nibh at erat suscipit luctus. Nulla facilisi. Nulla facilisi. Fusce ultrices, lacus quis rutrum dapibus, nibh augue cursus augue, a pretium turpis augue ac ante.
                </p>
                <p>
                    Aenean in leo aliquam, imperdiet nunc ac, fringilla leo. Fusce lectus est, lacinia iaculis tempor non, consequat ac augue. Nulla eu ex nec lectus efficitur varius sit amet eu sem. Etiam eget aliquet nunc, sit amet mollis metus. Nullam pulvinar convallis elementum. Proin feugiat orci lorem, porttitor varius tellus eleifend vel. Quisque ullamcorper luctus fermentum. Curabitur at lacinia nulla. Etiam posuere blandit dictum. Nulla lobortis nulla justo, vel molestie arcu vulputate ut.
                </p>
                <p>
                    Nullam venenatis consectetur elementum. Aliquam mi leo, euismod et sem vel, lobortis finibus augue. Nam a mauris malesuada, faucibus nisl at, scelerisque leo. Nam eget justo arcu. Morbi id bibendum mi. Fusce rhoncus elit vel risus pulvinar ullamcorper faucibus tempor ligula. Sed placerat orci sit amet mauris elementum, sed accumsan nibh auctor. Sed sagittis felis ut placerat hendrerit. Aliquam non quam pharetra, lacinia ante a, tincidunt libero. Vivamus eu mi molestie, interdum leo a, lacinia ligula. Phasellus et tempus massa.
                </p>
                <p>
                    Aenean eget rhoncus tellus, quis commodo nisi. Etiam convallis orci aliquet porttitor lacinia. Quisque sit amet nunc vel ligula scelerisque tempus at ac ligula. Aenean semper consequat leo, et iaculis diam lobortis eget. Pellentesque dapibus ornare risus non consequat. Integer a placerat augue. Sed nec condimentum quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In lacinia consequat risus, id tempus ipsum fringilla quis. Phasellus dictum quam nec lorem volutpat, eu suscipit purus eleifend. Suspendisse nec laoreet mauris, a iaculis turpis. Phasellus ornare et lorem eget sollicitudin. Sed tortor purus, condimentum vitae pretium at, malesuada eu metus. Nam at scelerisque ligula, quis aliquet dui. Nunc augue mauris, cursus id interdum vel, malesuada tincidunt massa. Proin sit amet feugiat magna.
                </p>
                <p>
                    Aenean nunc justo, ultrices at vehicula at, lobortis vitae massa. Maecenas rutrum eros non leo porttitor, non auctor erat pharetra. Sed ac bibendum metus. Praesent euismod tortor ligula, ut lobortis lorem pulvinar eget. Ut ultricies aliquam sapien, et lacinia metus imperdiet non. Donec mattis libero ut est ullamcorper euismod. Etiam efficitur purus et lobortis porttitor. Morbi tristique euismod consectetur. Pellentesque vitae vulputate augue. Etiam justo leo, vehicula non neque nec, efficitur vulputate neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras auctor lorem orci, non hendrerit dolor aliquam quis. Integer quis lobortis ipsum.
                </p>
                <p>
                    Nam sed urna molestie, dignissim elit sed, tristique massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean sem augue, vulputate vehicula ligula eu, ultricies luctus mauris. Donec vitae efficitur sem, non tincidunt nulla. Morbi sit amet neque est. Curabitur rhoncus luctus interdum. Donec diam quam, consectetur condimentum faucibus a, lacinia et mauris. Maecenas ac tristique est, eget sagittis erat. Quisque tempor dapibus nulla, volutpat semper lectus pellentesque non. Nunc vestibulum libero in justo convallis pharetra. Vivamus rutrum ante sed arcu aliquet sollicitudin. Cras maximus lectus in aliquam rhoncus. Sed tempus elementum odio, tincidunt fermentum est convallis non.
                </p>
                <p>
                    Nulla vulputate ante at sapien posuere, sed ornare massa eleifend. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras porta tortor ac dolor accumsan, pharetra ultricies metus pharetra. Sed felis est, pharetra sollicitudin dolor sed, vulputate consectetur risus. Integer porta dapibus sapien. Nullam finibus ipsum in suscipit semper. Pellentesque tempus dolor eget augue tristique blandit. Vivamus non commodo sapien, ac molestie augue. Maecenas ultrices erat et orci ullamcorper tincidunt. Nulla finibus mattis sollicitudin. Integer egestas ante egestas dui rutrum sagittis.
                </p>
                <p>
                    Aliquam mi velit, convallis at arcu eget, scelerisque vulputate orci. Curabitur sit amet suscipit lorem. Suspendisse suscipit lorem non lacus viverra tristique. Donec eu velit a metus tincidunt finibus sit amet quis elit. Integer non neque eget lacus cursus elementum quis quis justo. Suspendisse interdum justo et purus viverra, eu condimentum felis malesuada. Nam vitae tellus sit amet metus blandit pellentesque. Mauris feugiat finibus pellentesque. Nam ac libero sit amet diam scelerisque fringilla eget ac augue. Pellentesque ac quam orci. Morbi cursus elit quis metus tincidunt efficitur nec ut sem. Nam sit amet arcu quam. Proin finibus nibh ut sem volutpat malesuada. Vivamus dignissim ex eget hendrerit suscipit.
                </p>
                <p>
                    Suspendisse at sem ac dui iaculis tempor. Maecenas gravida risus ultricies, gravida nulla non, malesuada turpis. Nullam varius nibh id ligula sagittis consectetur. Maecenas eu sagittis risus. Nulla accumsan tellus in lorem euismod pharetra. Donec scelerisque mauris ex, id mollis enim porttitor et. Integer dignissim lectus lacinia, consectetur lorem in, commodo neque. Pellentesque in finibus sem. Curabitur consectetur ante at mauris commodo consectetur. Integer dui ex, rhoncus ac congue vitae, convallis pharetra nisi. Aliquam erat volutpat. Cras dignissim quam volutpat nulla semper ultrices. Sed dictum diam urna, pulvinar rhoncus turpis molestie nec. In sollicitudin, sem facilisis iaculis dictum, sapien elit vehicula sem, eget scelerisque nisi orci at neque.
                </p>
                <p>
                    Quisque luctus sapien non felis convallis, vel sollicitudin est consectetur. Fusce volutpat metus volutpat, maximus orci eget, vehicula lacus. Pellentesque auctor pretium egestas. Aliquam suscipit, nisl eu interdum venenatis, urna ligula ornare nisi, non facilisis leo orci in augue. Duis neque erat, ornare sit amet congue eu, condimentum vitae nulla. Fusce dignissim tortor eget mattis faucibus. Donec efficitur at lacus tempor placerat. Vestibulum porta, sem id sodales dignissim, mi erat pellentesque erat, non blandit erat ex at metus. Donec cursus eu purus non commodo. Etiam sit amet risus sed sapien gravida ornare. Morbi efficitur nulla vitae nibh maximus rhoncus.
                </p>
                <p>
                    Etiam sit amet nisi vitae nibh sodales hendrerit. Sed iaculis elementum augue non fermentum. Vivamus congue lorem vitae libero placerat, tincidunt malesuada nulla gravida. Maecenas lacinia scelerisque enim quis maximus. Maecenas commodo ligula id pretium hendrerit. In ultricies malesuada semper. Morbi consequat mi viverra felis convallis, vel hendrerit lectus venenatis. Nulla vulputate finibus nisl.
                </p>
                <p>
                    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ultricies laoreet nisl at scelerisque. Integer volutpat lobortis lobortis. Nulla porttitor maximus nulla non pulvinar. Praesent ultricies accumsan tempus. Aliquam at tristique risus. Aliquam mi eros, ultricies vel lectus nec, mollis posuere augue. Aliquam sollicitudin vel orci in eleifend. Phasellus volutpat nulla sed ipsum rutrum, et ullamcorper dui posuere. Etiam a dui sed felis dictum tempus vel at lectus. Vestibulum ut consequat mi.
                </p>
                <p>
                    Aenean efficitur ipsum a magna sodales lacinia. Integer ornare, diam non tempor cursus, nibh lorem facilisis orci, non suscipit urna risus nec est. Vivamus odio ipsum, ornare sed augue fermentum, ultricies rutrum lorem. Nulla tristique pretium purus et mattis. Proin pretium a turpis at sagittis. Duis est massa, eleifend vel leo a, iaculis feugiat orci. Duis nec libero sapien. Pellentesque nec placerat justo. Maecenas lorem lorem, suscipit in condimentum eget, dictum ut metus. Nullam et volutpat est.
                </p>
                <p>
                    In commodo enim in sem viverra venenatis. Morbi vestibulum, leo in vulputate suscipit, mi nisl mollis enim, ac suscipit nisi neque sed turpis. Integer tempus urna at purus eleifend iaculis. Phasellus leo leo, facilisis eget scelerisque ac, gravida sit amet purus. Suspendisse consequat augue eget leo bibendum faucibus. Duis molestie nibh dolor, non commodo tellus sollicitudin at. Mauris mattis justo non convallis egestas. Integer id tempus nisi. Aliquam ut maximus diam. Praesent hendrerit lacus sit amet diam auctor sodales.
                </p>
                <p>
                    Nullam pellentesque mauris in felis imperdiet sollicitudin eu ac nunc. Vestibulum euismod consectetur purus sed commodo. Fusce bibendum vehicula ipsum a dictum. Nullam quis nunc sem. Quisque urna velit, vulputate ultrices cursus quis, sollicitudin vel felis. Curabitur elementum, velit non efficitur pellentesque, nulla ex volutpat nunc, feugiat porttitor augue dui eu tortor. Ut mollis nisl a lacinia mollis. Nam feugiat efficitur lectus, vel faucibus lorem viverra sed. Proin venenatis accumsan ante eget pretium. Curabitur in turpis fermentum, semper purus tempus, lacinia massa. Aliquam sollicitudin mauris nec sapien vehicula lobortis.
                </p>
                <p>
                    Phasellus odio erat, fringilla et justo et, rutrum maximus lectus. Pellentesque ut pellentesque nisl, nec auctor nunc. Quisque ultricies vitae neque vel consectetur. Mauris ac est massa. Pellentesque nibh sapien, tincidunt id scelerisque sit amet, tempor volutpat massa. Curabitur ut nibh lacus. Morbi semper sagittis dolor, vel luctus augue vestibulum in. Sed facilisis bibendum dolor non tristique. Ut ac quam dignissim, facilisis dolor et, vehicula quam. Sed consequat blandit euismod.
                </p>
                <p>
                    Phasellus interdum nisl sed odio tempus, non sollicitudin neque mattis. Aenean faucibus orci leo. Etiam in suscipit velit. Vestibulum dictum libero sed elit pellentesque efficitur. Nam vitae arcu suscipit, consequat sem quis, laoreet nunc. Sed varius semper est, eget congue eros tempus sed. Nulla ut mattis tellus, ac facilisis libero. Vestibulum maximus pretium metus, vitae dapibus dui porta at. Nunc bibendum sit amet neque quis iaculis.
                </p>
                <p>
                    In hac habitasse platea dictumst. Donec egestas vel orci consequat pharetra. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce et tempus ligula, ultrices egestas erat. Ut eleifend, velit scelerisque vehicula accumsan, odio libero porta felis, vitae sollicitudin tellus arcu id lectus. Etiam id justo commodo, ultrices massa vel, faucibus lacus. Integer efficitur nibh eget mollis pretium.
                </p>
                <p>
                    Quisque luctus dui sit amet enim posuere, tristique egestas mauris hendrerit. Suspendisse tempor rutrum velit, sit amet lacinia odio. Maecenas imperdiet odio id enim pharetra, in feugiat erat laoreet. Aliquam laoreet mi a tellus finibus, sed sollicitudin elit lacinia. Fusce sit amet luctus enim, non rhoncus ligula. Vestibulum congue, mi ut dictum dapibus, lorem lectus elementum dolor, in pellentesque nunc turpis vitae dui. Sed venenatis urna at ipsum venenatis, iaculis pulvinar lorem laoreet. In nisi libero, accumsan dapibus vehicula nec, venenatis a nisi. Suspendisse et libero dignissim, malesuada tellus vel, ullamcorper neque. Aliquam blandit in lacus sed viverra.
                </p>
                <p>
                    Vivamus accumsan mattis velit, non pellentesque ipsum feugiat at. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nulla id ex id felis mollis vestibulum. Vestibulum quis massa non tellus auctor ultricies id pharetra sem. Phasellus mattis molestie justo hendrerit mattis. Sed id neque dui. Cras commodo massa eu egestas tristique. Nullam lobortis finibus condimentum. In lacinia neque a sem accumsan tempor. Donec mollis dolor in ligula scelerisque ornare. Pellentesque sem ligula, congue sit amet faucibus vitae, sodales et enim.
                </p>
            </div>
        </section>
    </body>
</html>

View Header

@model RotativaSample.Models.PageModel
<!DOCTYPE HTML>
<html lang='en-US'>
    <head>
        <link href="@Href("~/Content/Home/header.css")" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <header>
            My Header - pagina @Model.page de @Model.topage
        </header>
    </body>
</html>

View Footer

@model RotativaSample.Models.PageModel
<!DOCTYPE HTML>
<html lang='en-US'>
    <head>
        <link href="@Href("~/Content/Home/footer.css")" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <footer>
            My Footer - pagina @Model.page de @Model.topage
        </footer>
    </body>
</html>

For each page generated in the PDF, actions Header and Footer are called (eg two pages generated, each action is called twice).

But Header and Footer randomly on each page ... time nothing appears, time all appear, time the header of the first page and the footer of the second and so on ...

p>

Follow the WkHtmlToPdf command documentation: link

PS: CSS files are empty.

    
asked by anonymous 28.12.2015 / 15:53

1 answer

2

I do not think Url.Action is the best option for header and footer. In its place, I would implement the following static method:

public static string RenderPartialViewToString(Controller controller, string viewName, object model)
{
    controller.ViewData.Model = model;
    using (StringWriter sw = new StringWriter())
    {
        ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
        ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
        viewResult.View.Render(viewContext, sw);

        return sw.ToString();
    }
}

And it would use like this:

customSwitches.Add("--header-html", MeuHelper.RenderPartialViewToString("Header", "Home", null));
customSwitches.Add("--footer-html", MeuHelper.RenderPartialViewToString("Footer", "Home", null));

Still, it is not 100% guaranteed to work because the one that calls wkhtmltopdf is Rotativa, whose scope of functionality is quite limited.

EDIT

Avoid passing layouts to Partials . They may be causing confusion:

@{
    Layout = null;
}
    
28.12.2015 / 16:17