Convert PartialView Html to String for ITextSharp HtmlParser

后端 未结 1 1514
無奈伤痛
無奈伤痛 2021-01-03 05:54

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

相关标签:
1条回答
  • 2021-01-03 06:29

    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 讨论(0)
提交回复
热议问题