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的作者
这是一个古老的问题,但仍然是相关的,我想我只是分享我已经实施的运作良好。
-
安装NuGet软件包“周二皮子” – 基于WkHtmlToPdf的Pechkin库中的一个分支,它使用Webkit引擎将HTML页面转换为PDF。
-
写一个小助手来阅读一个视图并将其转换为一个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
-
创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。
简单,可定制,真棒,地狱:)