Asp.Net MVC如何让视图生成PDF

我想打电话给控制器。 让控制器从模型中获取数据。 该视图然后运行并生成一个PDF。 我发现的唯一例子是Lou http://whereslou.com/2009/04/12/returning-pdfs-from-an-aspnet-mvc-action的一篇文章。 他的代码非常优雅。 该视图使用ITextSharp生成PDF。 唯一的缺点是他的例子使用Spark View Engine。 有没有办法与标准的Microsoft视图引擎做类似的事情?

我使用iTextSharp在MVC中生成dynamicPDF。 所有你需要做的是把你的PDF到一个Stream对象,然后你的ActionResult返回一个FileStreamResult。 我还设置了内容处理,以便用户可以下载它。

公共FileStreamResult PDFGenerator()
 {
    streamfileStream = GeneratePDF();

     HttpContext.Response.AddHeader(“内容处置”, 
     “attachment; filename = form.pdf”);

    返回新的FileStreamResult(fileStream,“application / pdf”);
 }

我也有代码,使我能够采取模板PDF,写文本和图像等(如果你想这样做)。

  • 注意:您必须将“stream”位置设置为0。
私人stream生成PDF()
 {
     //创build您的pdf并将其放入下面的stream... pdfvariables中
     //来自我用来将内容写入PDF文件的类

     MemoryStream ms = new MemoryStream();

     byte [] byteInfo = pdf.Output();
     ms.Write(byteInfo,0,byteInfo.Length);
     ms.Position = 0;

    返回ms;
 }

我们对这个问题的最终答案是使用Rotativa 。

它像其他一些解决scheme一样包装了WKhtmltopdf.exe,但它是迄今为止使用的最简单的方法

我去投了所有其他答案,也解决了这个问题,但这是我们用来解决上述问题所提出的问题。 这与其他答案不同。

这是一个Rotativa教程 。

安装完成后,这就是你所需要的

public ActionResult PrintInvoice(int invoiceId) { return new ActionAsPdf( "Invoice", new { invoiceId= invoiceId }) { FileName = "Invoice.pdf" }; } 

非常非常简单。

我也遇到过这个http://www.codeproject.com/Articles/260470/PDF-reporting-using-ASP-NET-MVC3 。 这很容易,而且很适合MVC。

然而,目前唯一的缺点是它不够灵活,你想有一个体面的布局,例如,你没有太多的控制表和单元格边界通过HTML。 它支持强制新页面,但你将不得不应用补丁iTextsharp。

在html中创build布局,然后打印成pdf是最快的方法。

Html到pdf转换由phantomjs , wkhtmltopdf或jsreport提供

jsreport提供了与asp.net mvc视图的直接集成,在这里你可以用属性标记控制器的动作,它将为你打印PDF而不是html。

更多关于这个博客文章

免责声明:我是jsreport的作者

这是一个古老的问题,但仍然是相关的,我想我只是分享我已经实施的运作良好。

  1. 安装NuGet软件包“周二皮子” – 基于WkHtmlToPdf的Pechkin库中的一个分支,它使用Webkit引擎将HTML页面转换为PDF。

  2. 写一个小助手来阅读一个视图并将其转换为一个HTMLstring(mvcContext是this.HttpContext)。 replace当然是可选的!

     public static string RenderViewToString(HttpContextBase mvcContext, string area, string controllerName, string viewName, object model) { var context = System.Web.HttpContext.Current; var contextBase = mvcContext; var routeData = new RouteData(); if (area == null) area = ""; routeData.DataTokens.Add("area", area); routeData.Values.Add("controller", controllerName); var controllerContext = new ControllerContext(contextBase, routeData, new EmptyController()); var razorViewEngine = new RazorViewEngine(); var razorViewResult = razorViewEngine.FindView(controllerContext, viewName, "", false); var writer = new StringWriter(); var viewContext = new ViewContext(controllerContext, razorViewResult.View, new ViewDataDictionary(model), new TempDataDictionary(), writer); razorViewResult.View.Render(viewContext, writer); string hostAddress = context.Request.Url.Scheme + "://" + context.Request.Url.Authority; return writer.ToString() .Replace("src=\"/", "src=\"" + hostAddress + "/") .Replace("<link href=\"/", "<link href=\"" + hostAddress + "/"); } class EmptyController : ControllerBase { protected override void ExecuteCore() { } } 

上面的辛勤工作是从这里: http : //wouterdekort.blogspot.co.uk/2012/10/rendering-aspnet-mvc-view-to-string-in.html?showComment=1414603363455#c7863520150405064571

  1. 创build一个MVC Action来生成文档

     public ActionResult DownloadPDF(long CentreID) { var model = GetModel() IPechkin converter = Factory.Create(); byte[] result = converter.Convert(Helpers.PDF.RenderViewToString(this.HttpContext, "area", "controller", "action", model); MemoryStream outputStream = new MemoryStream(); outputStream.Write(result, 0, result.Length); outputStream.Position = 0; return File(outputStream, "application/pdf", "filename.pdf"); } 

我只是使用wkhtmltopdf,在HTML中创build布局,然后,我将其转换为PDF。

简单,可定制,真棒,地狱:)