C# MVC 使用 NReco.PdfGenerator 从视图生成 PDF

C# MVC generate PDF from View with NReco.PdfGenerator

我目前正在做一个项目,我需要创建一个可以导出为 pdf 的 "dashboard"。我想使用 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 文件中。但是什么都没有改变。我的图表没有 rendering/loading,缺少的 CSS 内容仍然不存在。

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

这里有没有人使用过 NReco,或者有人可以推荐适用于 .NET 4.0 的其他东西吗?

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

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

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