开发者

Convert PartialView Html to String for ITextSharp HtmlParser

开发者 https://www.devze.com 2023-03-26 06:34 出处:网络
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 Ite开发者_如何学运维xtSharps 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 Ite开发者_如何学运维xtSharps 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"));


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消