加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 将PartialView Html转换为ITextSharp HtmlPars

发布时间:2020-12-16 07:22:50 所属栏目:asp.Net 来源:网络整理
导读:我有一个局部视图,我正在尝试使用ITextSharp将html转换为pdf.如何将html转换为字符串,以便我可以使用ItextSharps HtmlParser? 我尝试过这样的事情没有运气……任何想法?: var contents = System.IO.File.ReadAllText(Url.Action("myPartial","myControlle
我有一个局部视图,我正在尝试使用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返回(使用正确的mimetype等).

我的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,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(=会话信息).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读