【问题标题】:Convert PartialView Html to String for ITextSharp HtmlParser将 PartialView Html 转换为 ITextSharp HtmlParser 的字符串
【发布时间】:2011-08-05 08:41:55
【问题描述】:

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

我尝试过这样的事情,但没有运气...有什么想法吗?:

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

【问题讨论】:

    标签: asp.net-mvc-3 pdf itextsharp mvchtmlstring


    【解决方案1】:

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

    您可以在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, 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(=会话信息)。

    【讨论】:

    • 这是否适用于不是使用 Razor 引擎创建的视图?
    • 我没有在没有 razor 的情况下进行测试,但我也没有参考 Razor。我希望 ViewContext 足够智能,可以在需要时使用另一个渲染器。
    • 好的,我试一试...我在这 2 行中遇到编译错误“无法将 iTextSharp.text.pdf.PdfWriter 隐式转换为 System.IDisposable”:使用 ( var pdfDoc = new Document()) 使用 (var pdfWriter = PdfWriter.GetInstance(pdfDoc, pdfStream))
    • 奇怪,也许你还有另一个 iTextSharp 版本?我将更改代码示例以不使用using,因为pdfDoc.Close 被显式调用,它们不是100% 需要的,只是更好。
    • 好的,太好了!最后一期:return this.PdfFromHtml(myModel);由于某种原因似乎不起作用:(它无法解析 PdfFromHtml,我有所有参考资料,使用 itextxharp 4.1.6,MyPdf 在我的情况下是 ascx 或部分视图......有什么想法吗?
    猜你喜欢
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多