Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以PDF格式呈现ASP.NET MVC视图_C#_.net_Asp.net Mvc_Pdf_Pdf Generation - Fatal编程技术网

C# 如何以PDF格式呈现ASP.NET MVC视图

C# 如何以PDF格式呈现ASP.NET MVC视图,c#,.net,asp.net-mvc,pdf,pdf-generation,C#,.net,Asp.net Mvc,Pdf,Pdf Generation,对于这个问题,我正在使用ExpertPDF的Html到PDF转换实用程序(尽管如果有足够的文档,我会向其他库开放) 简而言之,我有一个以特定方式格式化的视图,我希望将其呈现为PDF文档,用户可以将其保存到磁盘 到目前为止,我得到的是一个PrintService(它实现了一个IPrintService接口),这个实现有两个PrintToPDF()重载,一个只接受URL,另一个接受HTML字符串,这两个重载都返回一个字节[]。我只了解了第二个重载的细节,它需要HTML字符串 我希望从我的控制器执行以

对于这个问题,我正在使用ExpertPDF的Html到PDF转换实用程序(尽管如果有足够的文档,我会向其他库开放)

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

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

我希望从我的控制器执行以下操作:

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格式。我正在寻求帮助的是“SomeThingAtRendersMyViewAsString”。有没有快速获取视图字符串表示形式的方法?或者我应该坚持URL重载,并将URL传递给视图。。。还有其他想法吗


谢谢

您可以在OnResultExecuting期间点击响应,并用将结果HTML存储在MemoryStream中的内容替换Filter属性。然后,您可以在OnResultExecuted期间清除响应,并将其替换为PDF转换的结果。不过,我不确定这是否比仅仅从URL获取HTML要好

 public FileStreamResult Print(int id)
 {
     var model = _CustomRepository.Get(id);
     this.ConvertToPDF = true;
     return View( "HtmlView" );
 }

 public override OnResultExecuting( ResultExecutingContext context )
 {
      if (this.ConvertToPDF)
      {
          this.PDFStream = new MemoryStream();
          context.HttpContext.Response.Filter = new PDFStreamFilter( this.PDFStream );
      }
 }

 public override OnResultExecuted( ResultExecutedContext context )
 {
      if (this.ConvertToPDF)
      {
          context.HttpContext.Response.Clear();
          this.PDFStream.Seek( 0, SeekOrigin.Begin );
          Stream byteStream = _PrintService.PrintToPDF( this.PDFStream );
          StreamReader reader = new StreamReader( byteStream );
          context.HttpContext.Response.AddHeader( "content-disposition",
                 "attachment; filename=report.pdf" );
          context.HttpContext.Response.AddHeader( "content-type",
                 "application/pdf" );
          context.HttpContext.Response.Write( reader.ReadToEnd() );
      }
}

PDFStreamFilter需要重写“Write”方法并将数据发送到内存流。

这听起来像是我想将视图用作电子邮件模板时遇到的类似问题。我找到的获取视图字符串表示的最佳答案是:

我将我的解决方案打包在一个Nuget包中:Rotativa。它基于wkhtmltopdf

用法非常简单

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

public ActionResult PrintIndex()
{
    return new ActionAsPdf("Index", new { name = "Giorgio" }) { FileName = "Test.pdf" };
}
name=“Giorgio”是路由参数


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

我找到的最好的软件包是RazorPDF,它可以在NuGet.org上以包的形式提供,基于。在Azure网站上工作:


我看到了那个帖子。根据brightmix帖子上的评论,我最终使用了类似的解决方案。我很快就会发布解决方案。我已经找到了一个解决方案,可以减少代码,但您提供的答案是一个潜在的解决方案。拦截结果执行的好主意。。。我很快就会发布我的解决方案。曼尼什-你曾经在任何地方发布过你的解决方案吗??这将是非常有用的。这是迄今为止我遇到的最简单的asp.net mvc解决方案,非常感谢…这太棒了-谢谢!我会注意到,我必须指定表单身份验证cookie名称(否则将呈现登录页面),并将呈现器更改为使用打印媒体样式(FormsAuthenticationCookieName=“MyCookie”,CustomSwitches=“--打印媒体类型”)。很简单!Rotativa似乎无法使用MVC4。当我返回ActionAsPdf时,我看到屏幕上显示的是一个字符串,而不是PDF。在Azure Web角色中有效,但由于信任级别的限制,在Azure Web站点上不起作用。@guruprasadao,这是PDF上的登录页面