Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert PartialView Html to String for ITextSharp HtmlParser

I've got a partial view, i'm trying to use ITextSharp to convert the html to pdf. How can I convert the html to string so I can use ItextSharps HtmlParser?

I've tried something like this with no luck...any ideas?:

 var contents = System.IO.File.ReadAllText(Url.Action("myPartial", "myController", new { id = 1 }, "http"));
like image 296
newbie_86 Avatar asked Feb 24 '23 09:02

newbie_86


1 Answers

I have created a special ViewResult class that you can return as the result of an Action.

You can see the code on bitbucket (look at the PdfFromHtmlResult class).

So what it basically does is:

  • Render the view through the Razor engine (or any other registered engine) to Html
  • Give the html to iTextSharp
  • return the pdf as the ViewResult (with correct mimetype, etc).

My ViewResult class looks like:

 public class PdfFromHtmlResult : ViewResult {

    public override void ExecuteResult(ControllerContext context) {
        if (context == null) {
            throw new ArgumentNullException("context");
        }
        if (string.IsNullOrEmpty(this.ViewName)) {
            this.ViewName = context.RouteData.GetRequiredString("action");
        }

        if (this.View == null) {
            this.View = this.FindView(context).View;
        }

        // First get the html from the Html view
        using (var writer = new StringWriter()) {
            var vwContext = new ViewContext(context, this.View, this.ViewData, this.TempData, writer);
            this.View.Render(vwContext, writer);

            // Convert to pdf

            var response = context.HttpContext.Response;

            using (var pdfStream = new MemoryStream()) {
                var pdfDoc = new Document(); 
                var pdfWriter = PdfWriter.GetInstance(pdfDoc, pdfStream);

                pdfDoc.Open();

                using (var htmlRdr = new StringReader(writer.ToString())) {

                    var parsed = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(htmlRdr, null);

                    foreach (var parsedElement in parsed) {
                        pdfDoc.Add(parsedElement);
                    }
                }

                pdfDoc.Close();

                response.ContentType = "application/pdf";
                response.AddHeader("Content-Disposition", this.ViewName + ".pdf");
                byte[] pdfBytes = pdfStream.ToArray();
                response.OutputStream.Write(pdfBytes, 0, pdfBytes.Length);
            }
        }
     }
 }

With the correct extension methods (see BitBucket), etc, the code in my controller is something like:

 public ActionResult MyPdf(int id) {
       var myModel = findDataWithID(id);

       // this assumes there is a MyPdf.cshtml/MyPdf.aspx as the view
       return this.PdfFromHtml(myModel);
 }

Note: Your method does not work, because you will retrieve the Html on the server, thereby you loose all cookies (=session information) that are stored on the client.

like image 87
GvS Avatar answered Mar 01 '23 09:03

GvS