2011-08-04 54 views
9

我试图创建一个我在模型窗口(我的图表是javascript和css在.aspx视图中的组合)的javascript图表的PDF。呈现的PDF文件中唯一的东西是来自窗口的静态内容,实际的javascript图表不在那里。用wkhtmltopdf创建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版本可能更合适,或者我必须将生成的页面保存到文件并将其传递到工具中。

谢谢。

+0

我有这个问题,并确保我使用wkhtmltopdf 0.9.9修复它。 “宝石安装”版本(0.8.3)并没有削减它。 – dfrankow

回答

9

在我们的项目中,我们做了一些相似的事情,并取得了成功。目前我们使用wkhtmltopdf 0.9.9和Highcharts。使用jQuery flot,我们在调整一下之后也获得了成功。在我们的项目中,我们首先将视图渲染为一个字符串,并使用stdin将其传递给wkhtml。然后,我们捕获wkhtml的stdout并将其传递回浏览器。

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

如果您使用其中一个图表,我想我可以帮助您。你使用什么图表?

最后一个音符:Wkhtmltopdf 0.10rc2似乎有一些问题,利用端口不同端口号时加载外部资源,从本地主机(JS/CSS)80.

+0

感谢你“最后一个笔记”,我正在搜索如何修复它:) – AgelessEssence

+1

得到它的工作,基本上我打开了一个隐藏的浏览器窗口禁用动画,保存图表的图像,然后创建一个图像的HTML字符串内部呈现为PDF。 –

+0

你已经提到过把视图渲染到字符串?怎么做?我有一个JavaScript和动态趋势线图(来自高图)呈现。但图表本身并未在pdf上显示。任何指针? – Dhamayanthi

6

它看起来像你试图得到一个图表的输出,由标签判断是从一个Extjs 4脚本。

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

速战速决将是JavaScript的延迟页面选项添加到命令行:

wkhtmltopdf http://dev.sencha.com/deploy/ext-4.0.2a/examples/charts/Mixed.html --javascript-delay=2000 test.pdf肯定会在* nix工作,类似的事情应该工作在Windows上。

+0

谢谢,好主意。不幸的是,它不会改变我的任何东西。我想这可能是图表显示的模型窗口,你的extjs假设是正确的。 –

1

我用wkhtmltopdf 0.9.9和pdfkit红宝石宝石,并有类似的问题。

我修改了所有标签以使用绝对地址。看起来wkhtmltopdf不知道该页面是通过哪个url访问的,所以相关的资源没有被加载。我不知道这是pdfkit还是wkhtmltopdf的限制。

我从https://github.com/mileszs/wicked_pdf得到了主意。