0

我目前正在做一个项目,我需要创建一个可以导出为 pdf 的“仪表板”。我想使用 Rotativa,但由于我们的应用程序使用 .NET 框架 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 的东西吗?

4

1 回答 1

1

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

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

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

于 2018-06-12T15:41:46.963 回答