2015-06-11 5 views
2

Мне просто нужно визуализировать PDF с сайта в ASP.NET MVC. Я нашел quite interesting article about generating PDF from ASP.NET MVC. Я думаю, что это может быть сделано даже лучше, если страница отображается через ActionFilterAttribute. Моя идея такова:Как я могу заставить evoPDF работать как ActionFilterAttribute в ASP.NET MVC

[EnableCompression] 
[OutputCache(Duration=7200)] 
[EvoPDFFilter] 
public ActionResult DownloadAsPDF() 
{ 
    var model= GetModel(); 
    return View(model); //return just HTML and convert it by filter to PDF 
} 

public class EvoPDFFilterAttribute: ActionFilterAttribute 
{ 
    //some code should be here. Is this solution even possible? 
} 

Это возможно? Как выглядеть как EvoPDFFilterAttribute?

ответ

3

я, наконец, удалось это сделать :-)

using EvoPdf; 
using System.IO; 
using System.Web; 
using System.Web.Mvc; 


namespace MyProject.Helpers 
{ 
    /// <summary> 
    /// PDF filter based on code https://lostechies.com/jimmybogard/2014/02/04/rendering-asp-net-content-as-pdf/ 
    /// </summary> 
    public class EvoPDFFilterAttribute : ActionFilterAttribute 
    { 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      HttpRequestBase request = filterContext.HttpContext.Request; 
      HttpResponseBase response = filterContext.HttpContext.Response; 

      if (response.Filter == null)//RenderAction 
       return; 

      string acceptEncoding = request.Headers["Accept-Encoding"]; 
      if (acceptEncoding == null) 
       return; 


      response.ContentType = "application/pdf"; 
      var baseUrl = string.Format("{0}://{1}{2}/", request.Url.Scheme, request.Url.Authority, request.ApplicationPath.TrimEnd('/')); 
      response.Filter = new PdfFilter(response.Filter, baseUrl);   
     } 

     public class PdfFilter : Stream 
     { 
      private readonly Stream _oldFilter; 
      private readonly string _baseUrl; 
      private readonly MemoryStream _memStream; 

      public override bool CanSeek 
      { 
       get { return false; } 
      } 

      public override bool CanWrite 
      { 
       get { return true; } 
      } 

      public override bool CanRead 
      { 
       get { return false; } 
      } 

      public override long Position 
      { 
       get { return 0L; } 
       set { } 
      } 

      public override long Length 
      { 
       get { return 0L; } 
      } 

      public PdfFilter(Stream oldFilter, string baseUrl) 
      { 
       _oldFilter = oldFilter; 
       _baseUrl = baseUrl; 
       _memStream = new MemoryStream(); 
      } 

      public override int Read(byte[] buffer, int offset, int count) 
      { 
       return 0; 
      } 

      public override long Seek(long offset, SeekOrigin origin) 
      { 
       return 0L; 
      } 

      public override void SetLength(long value) 
      { 
      } 

      public override void Write(byte[] buffer, int offset, int count) 
      { 
       _memStream.Write(buffer, offset, count); 
      } 

      public override void Flush() 
      { 
      } 

      public override void Close() 
      { 
       var converter = new PdfConverter 
       { 
        MediaType = "print", 
       }; 
       converter.PdfDocumentOptions.LiveUrlsEnabled = false; 

       _memStream.Position = 0; 

       converter.SavePdfFromHtmlStreamToStream(_memStream, System.Text.Encoding.UTF8, _baseUrl, _oldFilter); 

       _oldFilter.Close(); 
      } 
     } 
    } 
}