使用wkhtmltopdf和呈现javascript创建pdf

使用wkhtmltopdf和呈现javascript创建pdf,javascript,asp.net,asp.net-mvc-3,extjs4,wkhtmltopdf,Javascript,Asp.net,Asp.net Mvc 3,Extjs4,Wkhtmltopdf,我正在尝试创建一个模型窗口中的javascript图表的PDF(我的图表是.aspx视图中javascript和css的组合)。呈现的PDF文件中唯一的内容是来自窗口的静态内容,而实际的javascript图表不在那里 我创建PDF的要求如下: public byte[] WKHtmlToPdf(string url) { var fileName = " - "; var wkhtmlDir = "C:\\Temp\\wkhtml"; v

我正在尝试创建一个模型窗口中的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;
    }
public byte[]WKHtmlToPdf(字符串url)
{
var fileName=“-”;
var wkhtmlDir=“C:\\Temp\\wkhtml”;
var wkhtml=“C:\\Temp\\wkhtml\\wkhtmltopf.exe”;
var p=新流程();
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;
字符串开关=”;
开关+=“--打印介质类型”;
开关+=“--上边距0毫米--下边距0毫米--右边距0毫米--左边距0毫米”;
开关+=“--页面大小字母”;
p、 StartInfo.Arguments=switches+“”+url+“”+fileName;
p、 Start();
//读取输出
字节[]缓冲区=新字节[32768];
字节[]文件;
使用(var ms=new MemoryStream())
{
while(true)
{
int read=p.StandardOutput.BaseStream.read(缓冲区,0,缓冲区,长度);

如果(read看起来您正在尝试获取图表的输出,根据标签判断,它来自ExtJS4脚本

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

快速修复方法是将javascript延迟页面选项添加到命令行:


wkhtmltopdfhttp://dev.sencha.com/deploy/ext-4.0.2a/examples/charts/Mixed.html --javascript delay=2000 test.pdf
肯定会在*nix上运行,类似的事情也会在windows上运行。

在我们的项目中,我们做了一些类似的事情,并取得了成功。目前我们将wkhtmltopdf 0.9.9与结合使用。通过jQuery flot,我们取得了成功在我们的项目中,我们首先将视图呈现为一个字符串,并使用它的stdin将其传递给wkhtml。然后我们捕获wkhtml的stdout并将其传递回浏览器

您的wkhtml设置似乎是正确的,但我们使用的是stdin和stdout。不知道这是否会成为问题

如果你使用这些图表中的一个,我想我可以帮助你。你使用的是什么图表


最后一点注意:当使用与端口80不同的端口号时,Wkhtmltopdf 0.10rc2似乎在从本地主机加载外部资源(js/css)时遇到一些问题。

我使用的是Wkhtmltopdf 0.9.9和pdfkit ruby gem,并且存在类似的问题

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


我的想法来自。

谢谢,好主意。不幸的是,这对我来说没有任何改变。我想这可能是图表显示的模型窗口,并且您的extjs假设是正确的。谢谢您的“最后一个注意事项”,我正在搜索如何修复它:)基本上,我打开了一个隐藏的浏览器窗口,禁用了动画,保存了一个图表的图像,然后创建了一个html字符串,里面的图像将呈现为PDF。你提到过将视图呈现为字符串吗?怎么做?我有一个javascript和动态趋势线图(来自highchart)渲染。但是图表本身并没有显示在pdf上。有什么提示吗?我遇到了这个问题,并通过确保使用wkhtmltopdf 0.9.9解决了它。“gem安装”版本(0.8.3)没有解决它。