Отображение верхних и нижних колонтитулов в PDF, сгенерированном Rotativa


Я пытаюсь указать верхние и нижние колонтитулы в PDF, сгенерированном библиотекой Rotativa. Как ответил автор здесь это должно быть возможно с помощью CSS (описано здесь ). Однако я не могу этого сделать.

У меня есть таблица стилей, загруженная в мета-тег:

<link href="print.css" rel="stylesheet" type="text/css" media="print" />

И в таблице стилей внизу:

@page {
    @top-left {
        content: "TOP SECRET";
        color: red
    }
    @bottom-right {
        content: counter(page);
        font-style: italic
    }
}

И затем генерирует PDF по:

public ActionResult ShowPdf()
{
     var model = new Model();
     return new ViewAsPdf("view.cshtml", model)
                {
                    FileName = "Report.pdf",
                    CustomSwitches = "--print-media-type"
                };
}

И затем ничего не появляется в верхнем и Нижнем колонтитулах PDF. Есть идеи?

4 6

4 ответа:

Я нашел документацию wkhtmltopdf, и там описано, как управлять колонтитулами.

В принципе, вы можете просто добавить --header-center "text" (или аналогичные переключатели) в список аргументов, и это все.

Чтобы использовать его с Rotativa было бы:

public ActionResult ShowPdf()
{
     var model = new Model();
     return new ViewAsPdf("view.cshtml", model)
                {
                    FileName = "Report.pdf",
                    CustomSwitches = "--print-media-type --header-center \"text\""
                };
}

(я не знаю, нужно ли --print-media-type.)

Если вы хотите отобразить представление вместо текста в верхнем/нижнем колонтитуле, то вы можете сделать это следующим образом:

public ActionResult ViewPDF()
{
      string customSwitches = 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()
{
    return View();
}

Не забудьте добавить атрибут [AllowAnonymous]в действие нижнего колонтитула, иначе Rotatina не сможет получить доступ к пути.

Вот как я это сделал (полностью):

public ActionResult PrintPDF(int? selectedSiteRotaId, int selectedSiteId)
{
    string footer = "--footer-center \"Printed on: " + DateTime.Now.Date.ToString("MM/dd/yyyy") + "  Page: [page]/[toPage]\"" + " --footer-line --footer-font-size \"9\" --footer-spacing 6 --footer-font-name \"calibri light\"";

    return new ActionAsPdf("RenderPDF", new { selectedSiteRotaId = selectedSiteRotaId, selectedSiteId = 7 }) 
    {
        FileName = "PDF_Output.pdf",
        PageOrientation = Orientation.Landscape,
        MinimumFontSize = 10, 
        //PageMargins  = new Margins(5,5,5,5),
        PageSize = Size.A3,
        CustomSwitches = footer
    };

    //var pdfResult = new ActionAsPdf("RenderPDF", new { selectedSiteRotaId = selectedSiteRotaId, selectedSiteId = 7 })
    //{
    //    FileName = "PDF_Output.pdf",
    //    PageOrientation = Orientation.Landscape,
    //    MinimumFontSize = 10
    //};

    //var binary = pdfResult.BuildPdf(this.ControllerContext);

    //return File(binary, "application/pdf");
}


public ActionResult RenderPDF(int? selectedSiteRotaId, int selectedSiteId)
{
    return RedirectToAction("Index", "PrintPDF", new { selectedSiteRotaId = selectedSiteRotaId, selectedSiteId = 7 });
}

Попробуйте это будет работать 100 %

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

}