猿问

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

我目前正在做一个项目,我需要创建一个可以导出为 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 的东西吗?


慕斯王
浏览 190回答 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 引擎版本不支持“绑定”。
随时随地看视频慕课网APP
我要回答