为ITextSharp HtmlParser转换PartialView Html为字符串



我有一个部分视图,我试图使用ITextSharp将html转换为pdf。我如何将html转换为字符串,这样我就可以使用ItextSharps HtmlParser?

我尝试过类似的事情,但没有运气…什么好主意吗?:

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

我已经创建了一个特殊的ViewResult类,您可以将其作为Action的结果返回。

您可以看到bitbucket上的代码(查看PdfFromHtmlResult类)。

它的作用是:

  • 通过Razor引擎(或任何其他已注册的引擎)渲染视图到Html
  • 把html给iTextSharp
  • 返回pdf作为ViewResult(具有正确的mime类型等)。

我的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,因此您丢失了存储在客户端上的所有cookie(=会话信息)。

相关内容

  • 没有找到相关文章

最新更新