Thursday, 9 January 2014

MVC 4: How do I generate a pdf file from a view?

I looked at several possible solutions (including itextsharp) but there were always issues rendering the CSS correctly.

Fortunately, I found the following gem in codeplex:

I used the following code to generate the HTML from the view (sourced from here):

 public string RenderViewToString(Controller controller, string viewName, object viewData)
            var renderedView = new StringBuilder();
            using (var responseWriter = new StringWriter(renderedView))
                var fakeResponse = new HttpResponse(responseWriter);
                var fakeContext = new HttpContext(HttpContext.Current.Request, fakeResponse);
                var fakeControllerContext = new ControllerContext(new HttpContextWrapper(fakeContext), controller.ControllerContext.RouteData, controller.ControllerContext.Controller);

                var oldContext = HttpContext.Current;
                HttpContext.Current = fakeContext;

                using (var viewPage = new ViewPage())
                    var html = new HtmlHelper(CreateViewContext(responseWriter, fakeControllerContext), viewPage);
                    html.RenderPartial(viewName, viewData);
                    HttpContext.Current = oldContext;

            return renderedView.ToString();

and this to generate the byte array:

byte[] buffer = (new HtmlToPdfConverter()).GeneratePdf(htmlText);

and finally, this to generate the file:

 public class BinaryContentResult : ActionResult
        private readonly string contentType;
        private readonly byte[] contentBytes;

        public BinaryContentResult(byte[] contentBytes, string contentType)
            this.contentBytes = contentBytes;
            this.contentType = contentType;

        public override void ExecuteResult(ControllerContext context)
            var response = context.HttpContext.Response;
            response.ContentType = this.contentType;

            using (var stream = new MemoryStream(this.contentBytes))

No comments:

Post a comment