【问题标题】:Create pdf with wkhtmltopdf and rendering javascript使用 wkhtmltopdf 创建 pdf 并渲染 javascript
【发布时间】:2011-10-20 10:50:01
【问题描述】:

我正在尝试创建模型窗口中的 javascript 图表的 PDF(我的图表是 .aspx 视图中的 javascript 和 css 的组合)。呈现的 PDF 文件中唯一的内容是窗口中的静态内容,实际的 javascript 图表不存在。

我创建 PDF 的调用如下:

public byte[] WKHtmlToPdf(string url)
    {
        var fileName = " - ";
        var wkhtmlDir = "C:\\Temp\\wkhtml";
        var wkhtml = "C:\\Temp\\wkhtml\\wkhtmltopdf.exe";
        var p = new Process();

        p.StartInfo.CreateNoWindow = true;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardError = true;
        p.StartInfo.RedirectStandardInput = true;
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.FileName = wkhtml;
        p.StartInfo.WorkingDirectory = wkhtmlDir;

        string switches = "";
        switches += "--print-media-type ";
        switches += "--margin-top 0mm --margin-bottom 0mm --margin-right 0mm --margin-left 0mm ";
        switches += "--page-size Letter ";
        p.StartInfo.Arguments = switches + " " + url + " " + fileName;
        p.Start();

        //read output
        byte[] buffer = new byte[32768];
        byte[] file;
        using (var ms = new MemoryStream())
        {
            while (true)
            {
                int read = p.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length);

                if (read <= 0)
                {
                    break;
                }
                ms.Write(buffer, 0, read);
            }
            file = ms.ToArray();
        }

        // wait or exit
        p.WaitForExit(60000);

        // read the exit code, close process
        int returnCode = p.ExitCode;
        p.Close();

        return returnCode == 0 ? file : null;
    }

关于如何获取 javascript 图表的任何想法?也许 .Net 版本会更合适,或者我必须将生成的页面保存到文件中并将其传递给工具。

谢谢。

【问题讨论】:

  • 我遇到了这个问题,并通过确保我使用的是 wkhtmltopdf 0.9.9 来解决它。 “gem install”版本(0.8.3)并没有削减它。

标签: javascript asp.net asp.net-mvc-3 extjs4 wkhtmltopdf


【解决方案1】:

我正在使用 wkhtmltopdf 0.9.9 和 pdfkit ruby​​ gem,并且遇到了类似的问题。

我通过将所有标签更改为使用绝对 URL 来修复它。似乎 wkhtmltopdf 不知道该页面是通过什么 url 访问的,因此没有加载相关资源。我不知道这是否是 pdfkit 或 wkhtmltopdf 的限制。

我的想法来自https://github.com/mileszs/wicked_pdf

【讨论】:

    【解决方案2】:

    在我们的项目中,我们做了一些类似的事情,并取得了成功。目前,我们将 wkhtmltopdf 0.9.9 与 Highcharts 结合使用。使用 jQuery flot,我们在稍作调整后也取得了成功。在我们的项目中,我们首先将视图渲染为一个字符串,然后使用它的标准输入将其传递给 wkhtml。然后我们捕获 wkhtml 的 stdout 并将其传回浏览器。

    您的 wkhtml 设置似乎是正确的,除了我们使用标准输入和标准输出。不知道这会不会有问题。

    如果您使用其中一张图表,我想我可以为您提供帮助。你用的是什么图表?

    最后一点:当使用不同于端口 80 的端口号时,Wkhtmltopdf 0.10rc2 似乎在从 localhost 加载外部资源 (js/css) 时出现一些问题。

    【讨论】:

    • 谢谢你“最后一点”,我目前正在寻找如何解决它:)
    • 让它工作,基本上我打开了一个隐藏的浏览器窗口禁用动画,保存图表的图像,然后创建一个带有内部图像的 html 字符串以呈现为 PDF。
    • 您提到将视图渲染为字符串?怎么做?我有一个 javascript 和动态趋势线图(来自 highchart)渲染。但图表本身并未显示在 pdf 中。有什么指点吗?
    【解决方案3】:

    看起来您正在尝试获取图表的输出,从标签判断是来自 Extjs 4 脚本。

    ext 脚本可能正在使用图表的某些动画,并且肯定会等待 javascript 事件执行并呈现图表。因此,在默认时间(200 毫秒)完成之前,它可能还没有完成。

    快速解决方法是将 javascript-delay 页面选项添加到命令行:

    wkhtmltopdf http://dev.sencha.com/deploy/ext-4.0.2a/examples/charts/Mixed.html --javascript-delay=2000 test.pdf 肯定可以在 *nix 上运行,类似的东西应该可以在 windows 上运行。

    【讨论】:

    • 谢谢,好主意。不幸的是,它对我没有任何改变。我认为这可能是图表显示的模型窗口,并且您的 extjs 假设是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 2015-09-02
    • 2013-12-25
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多