【问题标题】:How to generate PDF from HTML view after scripts and styles applied in ASP.NET MVC如何在 ASP.NET MVC 中应用脚本和样式后从 HTML 视图生成 PDF
【发布时间】:2015-01-07 22:44:10
【问题描述】:

我想生成我的视图的 HTML 以生成 PDF 文档。它在浏览器中打开时应用了样式和脚本。 我尝试了以下代码,但它只在脚本修改之前给出了视图的 html。 在脚本修改(如文本更改与浏览器相同)后,我需要获取视图的 HTML。

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();
        }
}

【问题讨论】:

  • 那么你应该注意到我对第一个(现已删除)问题的评论!
  • 是的,你告诉过 javascript 在服务器上运行。但是如果视图具有与视图绑定的角度指令和模板。以及如何从视图中生成 pdf。脚本运行后有没有办法生成html?
  • Razor 只会生成源代码,不会执行 客户端 脚本。我们使用名为 EO.pdf 的产品来生成 PDF,因为它模拟浏览器并在脚本运行后呈现。

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


【解决方案1】:

如果您希望用户下载渲染页面的 pdf,那么解决问题的最简单方法是

window.print(); 

在客户端它会提示用户保存当前页面的 pdf。 也可以通过链接样式自定义pdf的外观

<link rel="stylesheet" type="text/css" href="print.css" media="print">

print.css 在打印时应用于 html。

限制

  1. 您不能将文件存储在服务器端。
  2. 用户提示打印页面而不是手动保存页面。
  3. 页面必须在选项卡中呈现。

【讨论】:

  • 我认为这可能不是用户打开页面时会运行的答案,我不想让用户打开页面只是自动下载页面。
  • 我在回答的限制中也提到过。
  • @shan 将锚点放置在您要为其生成 pdf 的实际页面上,通过 css 关闭页面正文的可见性,以便用户无法看到页面并覆盖 print.css 中的正文样式因此页面内容可以是 pdf 格式,并在加载时在页面 window.print() 上添加脚本,而用户根本不知道该页面已打开。该解决方案非常快速和简单
【解决方案2】:

我发现并用于生成 javascript 和样式呈现视图或 html 页面的 PDF 的最佳工具是 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://wwwabc.com";

        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;
    }

【讨论】:

    【解决方案3】:

    我不妨发表我的评论作为答案......

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

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

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

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

    注意:我与 Essential Objects 没有任何关系。这纯粹是基于该产品的实际使用的意见。

    【讨论】:

    • 我找到了 wkHTMLtopdf ,它与 iTextSharp、spirenet 相比如何显示样式领先一步,但仍然不渲染脚本。任何免费图书馆都会很好。谢谢
    猜你喜欢
    • 2015-01-07
    • 2012-10-12
    • 2010-10-21
    • 1970-01-01
    • 2021-12-24
    • 2014-10-15
    • 2011-02-18
    • 2015-11-22
    • 1970-01-01
    相关资源
    最近更新 更多