я, наконец, удалось это сделать :-)
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();
}
}
}
}