这是我呈现页面报告区域的解决方案。
简单的答案是,将我要渲染的页面部分的 html 内容发布回服务器,将其渲染为 PDF 并将其作为文件返回以供下载。
为此,我首先需要获取包含报告的页面部分的 html 内容。为此,我将报告的 div 的 id 设置为“report-content”,然后使用一些脚本来捕获该 html。
$(function () {
$("#btnSubmit").click(function () {
$("input[name='ReportContent']").val($("#report-content").html());
});
});
提交请求的表单有一个隐藏的“ReportContent”元素,其中存储了 html。
@using (Html.BeginForm("Export", "Home", FormMethod.Post))
{
<input type="hidden" name="ReportContent" />
<input type="submit" id="btnSubmit" value="Download PDF" />
}
在服务器端,我创建了一个使用 JsReport API 从 html 呈现 PDF 的方法。
protected async Task<IActionResult> RenderPDFAsync(string content)
{
var rs = new LocalReporting().UseBinary(JsReportBinary.GetBinary()).AsUtility().Create();
var report = await rs.RenderAsync(new RenderRequest()
{
Template = new Template()
{
Recipe = Recipe.ChromePdf,
Engine = Engine.None,
Content = content
}
});
return new FileStreamResult(report.Content, new Microsoft.Net.Http.Headers.MediaTypeHeaderValue("application/pdf"));
}
最后,我添加了用于呈现 PDF 并将文件结果返回到每个报告页面的帖子的处理程序。
public async Task<IActionResult> OnPostAsync()
{
return await RenderPDFAsync(Request.Form["ReportContent"].ToString());
}
我的代码比此处显示的验证要多一些,并且我的所有报告页面都有一个通用的 PageModel 派生基类,因此新报告唯一需要的就是添加 post handler 并将部分的 id 设置为包含在 PDF 中。我还打算将渲染移至服务,以便可以共享它,而不是在每次创建报表时重新创建。