c# - 如何以 PDF 格式呈现 ASP.NET MVC View

标签 c# .net asp.net-mvc pdf pdf-generation

我正在使用 ExpertPDF 的 Html-to-PDF 转换实用程序来解决这个问题(尽管如果有足够的文档,我愿意使用其他库)。

简而言之,我有一个以特定方式格式化的 View ,我想将其呈现为用户可以保存到磁盘的 PDF 文档。

到目前为止,我有一个 PrintService(它实现了一个 IPrintService 接口(interface)),这个实现有两个 PrintToPDF() 重载,一个只接受一个 URL,另一个接受一个 HTML 字符串,两者都返回一个字节[].我只计算出需要 HTML 字符串的第二个重载的细节。

我想通过我的 Controller 做的事情是这样的:

public FileStreamResult Print(int id)
{
    var model = _CustomRepository.Get(id);
    string renderedView = SomethingThatRendersMyViewAsAString(model);
    Stream byteStream = _PrintService.PrintToPdf(renderedView);
    HttpContext.Response.AddHeader("content-disposition", 
        "attachment; filename=report.pdf");
    return new FileStreamResult(byteStream, "application/pdf");  
}

理论上会在页面上呈现 PDF。这是我正在寻求帮助的“SomethingThatRendersMyViewAsAString”。有没有一种快速获取 View 的字符串表示形式的方法?或者我应该坚持使用 URL 重载并将 URL 传递给 View ...还有其他想法吗?

谢谢!

最佳答案

我将我的解决方案打包在一个 Nuget 包中:Rotativa http://nuget.org/packages/Rotativa .它基于 wkhtmltopdf。

使用非常简单。

有一个 Action 你想作为 Pdf,而不是 Html 页面。您可以定义一个返回 ActionAsPdf 类型的 ActionResult 的操作(RouteAsPdf 也可用)。 所以代码只是:

public ActionResult PrintIndex()
{
    return new ActionAsPdf("Index", new { name = "Giorgio" }) { FileName = "Test.pdf" };
}

将 name = "Giorgio"作为路由参数。

即使打印操作受到 Web 表单例份验证([Authorize] 属性)的保护,它也能正常工作

关于c# - 如何以 PDF 格式呈现 ASP.NET MVC View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1324597/

相关文章:

c# - 调用存储过程时尽量减少代码重复

c# - 关闭套接字,然后从 .net 中的同一端口重新打开它

asp.net-mvc - 动态设置必填字段

c# - 从 mvc 表单向数据库发布数据

c# - Xamarin PCL Android 应用程序在 Release模式下突然崩溃

c# - 从 Windows 窗体中删除控件并调整其他控件以适应

c# - wcf服务运行结果的良好实践

c# - 有哪些工具可用于测试多线程 .net 代码?

asp.net-mvc - 如何更改 .NET CORE 中的默认 ASP.NET Identity 表名称?

c# - 在c#中单击按钮时显示包含sql数据的消息框