4

部分的なビューがあります。ITextSharpを使用してhtmlをpdfに変換しようとしています。ItextSharps HtmlParserを使用できるように、HTMLを文字列に変換するにはどうすればよいですか?

私は運がなくてこのようなことを試しました...何かアイデアはありますか?:

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

1 に答える 1

8

アクションの結果として返すことができる特別な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(=セッション情報)が失われます。

于 2011-08-05T08:50:53.093 に答える