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