表示 - Asp.Net MVC PDFを生成するビューを取得する方法




tuespechkin 使い方 (5)

私はコントローラ上でアクションを呼びたいと思います。 コントローラにモデルからデータを取得させます。 ビューが実行され、PDFが生成されます。 私が見つけた唯一の例は、Louの記事http://whereslou.com/2009/04/12/returning-pdfs-from-an-aspnet-mvc-action 。 彼のコードは非常にエレガントです。 ビューは、ITextSharpを使用してPDFを生成しています。 唯一の欠点は、彼の例がSpark View Engineを使用していることです。 標準のMicrosoftビューエンジンで同様のことを行う方法はありますか?


htmlでレイアウトを作成し、pdfに後で印刷するのが最も速い方法です。

pdfへのHtmlの変換はphantomjswkhtmltopdfまたはjsreportによって提供されます

jsreportはasp.net mvcビューとの直接的な統合を提供します。コントローラのアクションを属性でマークするだけでhtmlの代わりにpdfが出力されます。

このブログ記事の詳細

免責事項:私はjsreportの著者です


iTextSharpを使ってMVCで動的PDFを生成します。 PDFをStreamオブジェクトに入れ、ActionResultがFileStreamResultを返すだけです。 また、ユーザーがダウンロードできるようにコンテンツの配置を設定しました。

public FileStreamResult PDFGenerator()
{
    Stream fileStream = GeneratePDF();

    HttpContext.Response.AddHeader("content-disposition", 
    "attachment; filename=form.pdf");

    return new FileStreamResult(fileStream, "application/pdf");
}

私はテンプレートPDFを取ってテキストや画像を書き込むことができるコードも持っています。

  • 注:ストリームの位置を0に設定する必要があります。
private Stream GeneratePDF()
{
    //create your pdf and put it into the stream... pdf variable below
    //comes from a class I use to write content to PDF files

    MemoryStream ms = new MemoryStream();

    byte[] byteInfo = pdf.Output();
    ms.Write(byteInfo, 0, byteInfo.Length);
    ms.Position = 0;

    return ms;
}

これは古い質問ですが、依然として関連性があり、私が実装したことをうまく共有できると思っています。

  1. NuGetパッケージFirePechkinをインストールする - Webkitエンジンを使用してHTMLページをPDFに変換するWkHtmlToPdfに基づくPechkinライブラリのフォーク。

  2. ビューを読み込んでHTML文字列に変換するための小さなヘルパーを作成します(mvcContextはthis.HttpContext)。 交換はもちろんオプションです!:

    public static string RenderViewToString(HttpContextBase mvcContext, string area, string controllerName, string viewName, object model)
    {
        var context = System.Web.HttpContext.Current;
        var contextBase = mvcContext;
        var routeData = new RouteData();
        if (area == null) area = "";
    
        routeData.DataTokens.Add("area", area);
    
        routeData.Values.Add("controller", controllerName);
    
        var controllerContext = new ControllerContext(contextBase,
                                                routeData,
                                                new EmptyController());
    
        var razorViewEngine = new RazorViewEngine();
        var razorViewResult = razorViewEngine.FindView(controllerContext,
                                                    viewName,
                                                    "",
                                                false);
    
        var writer = new StringWriter();
        var viewContext = new ViewContext(controllerContext,
                                    razorViewResult.View,
                                    new ViewDataDictionary(model),
                                    new TempDataDictionary(),
                                    writer);
        razorViewResult.View.Render(viewContext, writer);
    
        string hostAddress = context.Request.Url.Scheme + "://" + context.Request.Url.Authority;
    
        return writer.ToString()
                     .Replace("src=\"/", "src=\"" + hostAddress + "/")
                     .Replace("<link href=\"/", "<link href=\"" + hostAddress + "/");                         
    }
    
    class EmptyController : ControllerBase
    {
        protected override void ExecuteCore() { }
    }
    

上記の作業はここからです: http://wouterdekort.blogspot.co.uk/2012/10/rendering-aspnet-mvc-view-to-string-in.html?showComment=1414603363455#c7863520150405064571 : http://wouterdekort.blogspot.co.uk/2012/10/rendering-aspnet-mvc-view-to-string-in.html?showComment=1414603363455#c7863520150405064571

  1. MVCアクションを作成してドキュメントを生成する

    public ActionResult DownloadPDF(long CentreID)
    {
        var model = GetModel()
    
        IPechkin converter = Factory.Create();
        byte[] result = converter.Convert(Helpers.PDF.RenderViewToString(this.HttpContext, "area", "controller", "action", model);
        MemoryStream outputStream = new MemoryStream();
        outputStream.Write(result, 0, result.Length);
        outputStream.Position = 0;
    
        return File(outputStream, "application/pdf", "filename.pdf");
    }
    

私はちょうどwkhtmltopdfを使ってhtmlでレイアウトを作成した後、pdfに変換します。

簡単、カスタマイズ可能、地獄のような素晴らしい:)


非常に遅く返信しましたが、私は次のURLが私の結果をすぐに得るのに役立つことが分かりました:

(Nugetパッケージを使用してiTextSharp DLLを参照するようにしてください)

https://www.aspsnippets.com/Articles/Export-Grid-Html-Table-data-from-database-to-PDF-file-using-iTextSharp-in-ASPNet-MVC.aspx

編集これは、テーブルを少し違ったものにするために使用したコードです(これもランドスケープです:

public string GetCssForPdf()
        {
            string css = "";

            css = "th, td" +
                   "{" +
                       "font-family:Arial; font-size:10px" +
                    "}";

            return css;
        }

[HttpPost]
        [ValidateInput(false)]
        public FileResult Export(string GridHtml)
        {
            string webgridstyle = GetCssForPdf();

            string exportData = String.Format("<html><body>{0}{1}</body></html>", "<style>" + webgridstyle + "</style>", GridHtml);
            var bytes = System.Text.Encoding.UTF8.GetBytes(exportData);

            using (var input = new MemoryStream(bytes))
            {
                var output = new MemoryStream();
                var document = new iTextSharp.text.Document(PageSize.A4, 50, 50, 50, 50);
                var writer = PdfWriter.GetInstance(document, output);

                document.SetPageSize(iTextSharp.text.PageSize.A4.Rotate());
                Font headerFont = FontFactory.GetFont("Verdana", 10);
                Font rowfont = FontFactory.GetFont("Verdana", 10);

                writer.CloseStream = false;
                document.Open();

                var xmlWorker = iTextSharp.tool.xml.XMLWorkerHelper.GetInstance();
                xmlWorker.ParseXHtml(writer, document, input, System.Text.Encoding.UTF8);
                document.Close();
                output.Position = 0;

                return File(output, "application/pdf", "Pipeline_Report.pdf");

                //return new FileStreamResult(output, "application/pdf");
            }
        }

これが他の人にも役立つことを願っています。







pdf