2009-04-22 134 views
68

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

+8

使用Spark视图引擎是一个缺点?我受伤了。 :) – loudej 2009-05-28 18:03:16

+0

检查了这一点,RazorPDF:http://www.nyveldt.com/blog/post/Introducing-RazorPDF – 2013-05-20 09:10:09

+0

关于如何在ASP.NET MVC与PhantomJS做到这一点的详细描述记录在这里:http:// zizhujy.com/blog/post/2014/07/29/Use-PhantomJS-To-Create-WebPage-to-PDF-Converter.aspx。在线示例应用博客文章的步骤在这里:http://zizhujy.com/en-US/PDFConverter。只要页面允许匿名访问,此功能就非常有用。 – 2014-10-29 09:56:59

回答

19

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

它封装了WKhtmltopdf.exe像一些其他的解决方案,但它是迄今为止最容易使用,我发现

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

这是Rotativa Tutorial

安装后它,这都是你需要

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

非常非常简单。

81

我使用iTextSharp在MVC中生成动态PDF。您只需将PDF放入Stream对象中,然后您的ActionResult就会返回一个FileStreamResult。我还设置了内容处置,以便用户可以下载它。

 
public FileStreamResult PDFGenerator() 
{ 
    Stream fileStream = GeneratePDF(); 

    HttpContext.Response.AddHeader("content-disposition", 
    "attachment; filename=form.pdf"); 

    return new FileStreamResult(fileStream, "application/pdf"); 
} 

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

  • 注意:您必须将流位置设置为0。
 
private Stream GeneratePDF() 
{ 
    //create your pdf and put it into the stream... pdf variable below 
    //comes from a class I use to write content to PDF files 

    MemoryStream ms = new MemoryStream(); 

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

    return ms; 
} 
+0

不错的代码。我想知道我们如何能做到这一点。 – MikeJ 2009-04-22 22:22:10

+0

正是我想找的 – 2009-07-13 09:29:48

5

我也碰到这个http://www.codeproject.com/Articles/260470/PDF-reporting-using-ASP-NET-MVC3来了。它非常简单快捷,并且与MVC非常吻合。

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

2

我刚使用wkhtmltopdf,在html中创建布局,然后将其转换为pdf。

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

5

创建HTML和打印布局后成pdf是最快的方法。

HTML到PDF转换是通过phantomjswkhtmltopdfjsreport

jsreport提供asp.net的MVC意见直接集成提供, 在那里你可以标记与属性控制器动作,它会打印PDF而不是HTML为您。

更多关于此blog post

免责声明:我jsreport

4

这是一个老问题的作家,而是一个仍然相关,我以为我只是分享我所实现的效果很好。

  1. 安装NuGet包TuesPechkin - 在Pechkin库叉基于WkHtmlToPdf一个使用Webkit引擎HTML页面转换为PDF。

  2. 编写一个小助手来读取视图并将其转换为HTML字符串(mvcContext是this.HttpContext)。替换当然是可选的!:

    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

  • 创建MVC行动生成文档

    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"); 
    } 
    
  • 0

    非常晚回复,但我发现下面的网址帮我把我的结果很快:

    (请确保您通过利用的NuGet包的参考iTextSharp的DLL)

    https://www.aspsnippets.com/Articles/Export-Grid-Html-Table-data-from-database-to-PDF-file-using-iTextSharp-in-ASPNet-MVC.aspx

    编辑 这是我用来使表看起来有点不同的代码(这是景观,以及:

    public string GetCssForPdf() 
         { 
          string css = ""; 
    
          css = "th, td" + 
            "{" + 
             "font-family:Arial; font-size:10px" + 
            "}"; 
    
          return css; 
         } 
    
    [HttpPost] 
         [ValidateInput(false)] 
         public FileResult Export(string GridHtml) 
         { 
          string webgridstyle = GetCssForPdf(); 
    
          string exportData = String.Format("<html><body>{0}{1}</body></html>", "<style>" + webgridstyle + "</style>", GridHtml); 
          var bytes = System.Text.Encoding.UTF8.GetBytes(exportData); 
    
          using (var input = new MemoryStream(bytes)) 
          { 
           var output = new MemoryStream(); 
           var document = new iTextSharp.text.Document(PageSize.A4, 50, 50, 50, 50); 
           var writer = PdfWriter.GetInstance(document, output); 
    
           document.SetPageSize(iTextSharp.text.PageSize.A4.Rotate()); 
           Font headerFont = FontFactory.GetFont("Verdana", 10); 
           Font rowfont = FontFactory.GetFont("Verdana", 10); 
    
           writer.CloseStream = false; 
           document.Open(); 
    
           var xmlWorker = iTextSharp.tool.xml.XMLWorkerHelper.GetInstance(); 
           xmlWorker.ParseXHtml(writer, document, input, System.Text.Encoding.UTF8); 
           document.Close(); 
           output.Position = 0; 
    
           return File(output, "application/pdf", "Pipeline_Report.pdf"); 
    
           //return new FileStreamResult(output, "application/pdf"); 
          } 
         } 
    

    希望这可以帮助别人。