Asp.Net MVC如何获取生成PDF的视图

Eri*_*Cal 72 pdf asp.net-mvc

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

Dav*_*vid 83

我使用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,写文本和图像等(如果你想这样做).

  • 注意:您必须将Stream位置设置为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;
}

  • 我很想看到示例中的"pdf类"看起来是什么样的示例,或者获得有关如何实现它的一些提示? (5认同)
  • 由于[重复内容处理问题](https://bugzilla.mozilla.org/show_bug.cgi?id=681140),添加Content-Disposition标头在FireFox中不起作用.正确的解决方案是设置FireStreamResult对象的FileDownloadName属性. (3认同)
  • 代码项目文章,示例代码:http://www.codeproject.com/Articles/66948/Rendering-PDF-views-in-ASP-MVC-using-iTextSharp.aspx (2认同)

Eri*_*Cal 24

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

它像其他一些解决方案一样包装了WKhtmltopdf.exe,但到目前为止我发现它是最容易使用的

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

这是一个Rotativa教程.

安装后,这就是您的需要

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

非常非常简单.

  • 为什么downvote,我很困惑.这就是我们现在解决问题的方法,因此我更新了问题以使其保持最新状态.我不明白.如果我不明白为什么我得到了投票,我怎么能做得更好? (3认同)
  • 再次投票没有评论...这是我们用来解决问题的答案.我做了额外的努力回来并用更新的答案更新问题.我很困惑如何评价投票,除非你不喜欢rotativa. (3认同)

Jan*_*aha 6

在html中创建布局并在之后打印成pdf是最快的方法.

html into pdf转换由phantomjs,wkhtmltopdfjsreport提供

jsreport提供与asp.net mvc视图的直接集成,您可以在其中使用属性标记控制器操作,它将为您打印pdf而不是html.

更多关于此博客文章

免责声明:我是jsreport的作者


McG*_*Gaz 6

这是一个古老的问题,但仍然具有相关性,我认为我只是分享我已经实施的哪个效果很好.

  1. 安装NuGet包TuesPechkin - 基于WkHtmlToPdf的Pechkin库中的一个fork,它使用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() { }
    }
    
    Run Code Online (Sandbox Code Playgroud)

以上的辛勤工作来自:http://wouterdekort.blogspot.co.uk/2012/10/rendering-aspnet-mvc-view-to-string-in.html?showComment = 1414603363455 #c7863520150405064571

  1. 创建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");
    }
    
    Run Code Online (Sandbox Code Playgroud)


Sea*_*ong 5

我也遇到了这个http://www.codeproject.com/Articles/260470/PDF-reporting-using-ASP-NET-MVC3.它简单快捷,适合MVC.

然而,到目前为止唯一的缺点是它不是很灵活,你想要有一个像样的布局,例如,你没有很多控制表,和通过HTML的单元格边框.它有点支持强制新页面,但你必须在iTextsharp上应用补丁.