【问题标题】:How do I generate a PDF of my MVC view after styles and scripts applied [duplicate]应用样式和脚本后如何生成 MVC 视图的 PDF [重复]
【发布时间】:2015-01-07 21:35:29
【问题描述】:

我想从包含样式和脚本的视图中打印 PDF 文档。应用脚本和样式后,我如何阅读整个视图的 html。 它应该在运行 javascript 、 JQuery 、 Angular 等脚本后返回 html。

示例是在页面加载 jquery ajax 发布并填充表格。以下是仅返回 HTML 在 javascript 函数之前在没有填充表格的情况下运行的代码。

 public string RenderRazorViewToString(string viewName, object model)
    {
        ViewData.Model = model;
        using (var sw = new StringWriter())
        {
            var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext,
                                                                     viewName);
            var viewContext = new ViewContext(ControllerContext, viewResult.View,
                                         ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);
            viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
            return sw.GetStringBuilder().ToString();
        }
    }

我想像浏览器页面 HTML 一样获得完整的 java 脚本渲染页面 html

【问题讨论】:

  • 我认为您对 asp.net mvc 的工作原理存在根本性的误解。我建议阅读一些介绍性教程、一本介绍性书籍,或观看 MSDN 上的一些免费介绍性视频。
  • Javascript 在客户端运行。在服务器将视图发送给客户端后,服务器不知道客户端在视图中可能发生了什么变化。
  • 我已经开发了几个项目。我需要打印带有引导表视图的 PDF 文件。这个函数只给出没有应用脚本的 HTML
  • 如果您尝试将页面副本呈现为 PDF 服务器端,这是一个非常不同的问题。我建议您以这种方式重新提出问题并提出问题。即,如何生成我的 MVC 视图的 PDF 副本,以便它包含 js 修改。
  • @philip 我已经编辑了问题并更改了标题。请看一下

标签: c# asp.net-mvc pdf-generation phantomjs wkhtmltopdf


【解决方案1】:

Razor/ASP.Net 只会生成源代码,不会执行客户端脚本。您需要使用模拟 Web 浏览器的工具将客户端脚本转换为呈现的 PDF。

这意味着它需要理解脚本和样式(即就像浏览器一样)。

那里有几种商业产品,但我个人使用 Essential Objects PDF 转换器将视图直接生成为 PDF。它有一个内置的 Javascript 引擎,所以看起来就像在浏览器中一样。

请注意,这些产品非常复杂(因为它们包含完整的浏览器渲染引擎),因此大多数都需要付费许可证(至少用于商业用途)。

来源: How to generate PDF from HTML view after scripts and styles applied in ASP.NET MVC

在渲染脚本和样式后生成 PDF

生成 javascript 和样式渲染视图或 html 页面的最佳工具是 phantomJS。

使用示例文件夹的 exe 根目录中的 rasterize.js 函数下载 .exe 文件并放入解决方案中。

以下代码生成 PDF 文件:

public ActionResult DownloadHighChartHtml()
    {
        string serverPath = Server.MapPath("~/phantomjs/");
        string filename = DateTime.Now.ToString("ddMMyyyy_hhmmss") + ".pdf";
        string Url = "http://stagebelweb.azurewebsites.net/race/16867";

        new Thread(new ParameterizedThreadStart(x =>
        {
            ExecuteCommand(string.Format("cd {0} & E: & phantomjs rasterize.js {1} {2} \"A4\"", serverPath, Url, filename));
                               //E: is the drive for server.mappath
        })).Start();

        var filePath = Path.Combine(Server.MapPath("~/phantomjs/"), filename);

        var stream = new MemoryStream();
        byte[] bytes = DoWhile(filePath);

        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", "attachment;filename=Image.pdf");
        Response.OutputStream.Write(bytes, 0, bytes.Length);
        Response.End();
        return RedirectToAction("HighChart");
    }



    private void ExecuteCommand(string Command)
    {
        try
        {
            ProcessStartInfo ProcessInfo;
            Process Process;

            ProcessInfo = new ProcessStartInfo("cmd.exe", "/K " + Command);

            ProcessInfo.CreateNoWindow = true;
            ProcessInfo.UseShellExecute = false;

            Process = Process.Start(ProcessInfo);
        }
        catch { }
    }


    private byte[] DoWhile(string filePath)
    {
        byte[] bytes = new byte[0];
        bool fail = true;

        while (fail)
        {
            try
            {
                using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                {
                    bytes = new byte[file.Length];
                    file.Read(bytes, 0, (int)file.Length);
                }

                fail = false;
            }
            catch
            {
                Thread.Sleep(1000);
            }
        }

        System.IO.File.Delete(filePath);
        return bytes;
    }

【讨论】:

    猜你喜欢
    • 2015-01-07
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2010-10-21
    • 2012-04-24
    • 2015-06-20
    • 2022-11-12
    • 1970-01-01
    相关资源
    最近更新 更多