Преобразовать HTML-код PartialView в строку для ITextSharp HtmlParser - PullRequest
4 голосов
/ 05 августа 2011

У меня есть частичное представление, я пытаюсь использовать ITextSharp для преобразования HTML в PDF.Как я могу преобразовать HTML в строку, чтобы я мог использовать ItextSharps HtmlParser?

Я пробовал что-то подобное без удачи ... есть идеи?:

 var contents = System.IO.File.ReadAllText(Url.Action("myPartial", "myController", new { id = 1 }, "http"));

1 Ответ

9 голосов
/ 05 августа 2011

Я создал специальный класс ViewResult, который вы можете вернуть в результате действия.

Вы можете увидеть код в bitbucket (посмотрите на класс PdfFromHtmlResult).

Итак, что он в основном делает:

  • Renderпросмотр через движок Razor (или любой другой зарегистрированный движок) в формате HTML
  • Передать html для iTextSharp
  • , вернуть pdf в виде ViewResult (с правильным mimetype и т. д.).1015 *

    Мой класс ViewResult выглядит следующим образом:

     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);
                }
            }
         }
     }
    

    При правильных методах расширения (см. BitBucket) и т. Д. Код в моем контроллере выглядит примерно так:

     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);
     }
    

    Примечание : Ваш метод не работает, потому что вы получите HTML на сервере, тем самым вы потеряете все куки (= информацию о сеансе), которые хранятся на клиенте.

...