在MVC中使用Rotativa pdf显示动态标头

时间:2015-08-31 08:06:55

标签: asp.net-mvc pdf wkhtmltopdf rotativa

我想打印动态的标题数据,它们来自控制器。

那么如何使用Rotativa pdf在标题中显示该动态数据。

我的标题数据包括名称,地址,联系信息和其他附加信息,这些信息是动态的,并从控制器端生成。

我使用html page

创建了带有静态标题的pdf,如下所示
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)
                    };

这适用于Static header。

现在我需要动态地从这个控制器发送标题文本。

1 个答案:

答案 0 :(得分:1)

我曾经有过类似的规范,并通过额外的打印视图实现了它。

在那里,您可以从控制器获取其他数据并包含特殊的CSS样式。 使用bootstrap时,请考虑用于PDF打印的分辨率非常小,因此必须使用col-xs-*类。

在我的情况下,Print-View被称为ResultPrint.cshtml,而在Controller中我有这个功能:

    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);
        }
    }

在我的Result.cshtml中调用,如下所示:

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

修改

当您查看此答案https://stackoverflow.com/a/26544977/2660864时,您可以看到,您可以在CustomActions中使用.cshtml文件(我没有测试此代码)

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);
}