C#MVC使用NReco.PdfGenerator

时间:2018-06-12 09:17:49

标签: c# asp.net-mvc-4 pdf nreco

我目前正在开展一个项目,我需要创建一个“仪表板”,可以导出为pdf。我想使用Rotativa,但由于我们的应用程序使用.NET framework 4.0,因此无法实现。所以我找到了NReco PdfGenerator。

现在这是我创建PDF结果的代码:

var ViewAsString = RenderViewAsString("~/Views/QMetrics/StandardDashboard.cshtml", viewModel);
var htmlToPdf = new NReco.PdfGenerator.HtmlToPdfConverter();
htmlToPdf.PageWidth = 1600;
htmlToPdf.PageHeight = 900;
var pdfBytes = htmlToPdf.GeneratePdf(ViewAsString);
FileResult FileResult = new FileContentResult(pdfBytes, "application/pdf");
FileResult.FileDownloadName = "Dashboard-" + viewModel.ProjectName + "-" + 
DateTime.Now.ToString() + "-.pdf";
return FileResult;

它成功创建了PDF页面,其中包含来自后端的所有内容(项目信息等),但页面看起来非常难看。在原始页面上,我有2列,在PDF页面上,它将所有内容放在一列中。我尝试了几种不同的页面大小,我也将布局更改为无响应但没有任何改变。

我的第一个建议是在创建PDF时不包含引用的CSS和JS文件,因此我复制了外部文件(bootstrap,Chart.js)中的所有内容并将其直接粘贴到.cshtml文件中。但没有任何改变。我的图表没有渲染/加载,缺少的CSS内容仍然不存在。

在NReco PDFGenerator网站上,他们说它支持复杂的CSS代码和javascript代码,所以我真的不明白为什么这不起作用。

有没有人在这里体验过NReco,或者有人推荐一些适用于.NET 4.0的东西吗?

1 个答案:

答案 0 :(得分:1)

NReco PdfGenerator内部使用wkhtmltopdf工具,因此您可以检查它及其选项。

关于2列:如果你不使用flex / grid布局,一切都应该可以正常工作。可能你需要禁用wkhtmltopdf智能收缩逻辑(默认启用)并定义网页'窗口'大小明确(使用" - viewport-size 1600"选项)。

关于CSS和图表:你需要检查wkhtmltopdf是否可以访问CSS文件,最简单的方法是从命令行运行wkhtmltopdf.exe并检查控制台日志输出(或者,处理PdfGenerator' s& #34; LogReceived" C#中的事件。对于Chart.js,确保图表容器div具有显式宽度(不是%),并且没有js错误(您可以通过指定&#34来获取它们; - debug-javascript"选项)。如果你的js代码使用' bind'方法你必须包含polyfill作为wkhtmltopdf中使用的WebKit引擎版本不支持' bind'。