从Node / Express / Angular / PhantomJS导出带有图表的PDF报告

我在一个基于daftmonk的生成器(https://github.com/DaftMonk/generator-angular-fullstack)的平均堆栈中使用angularjs。我对angular/js/node(和stackoverflow)的几乎所有内容都很陌生,所以如果我需要重写我的问题,请随时指出!)是的。
我的目标是从包含六个图形、图像和文本的角度页面为用户生成一个多页pdf报告。
stackoverflow和google上有很多问题与此相关的潜在解决方案,但是仔细检查这些问题后,它们对我需要实现的目标没有帮助(或者我不知道如何在我的场景中使用它们)。
当前,当用户导航到“报告页”时,一个http请求从角度控制器发送到node/express,该控制器检查用户角色/组id、查询数据库、分析数据并将其发送回浏览器以呈现为图形(当前使用的是角度图表js和flot)。
用户选择图形类型,并可以从20+的可能列表中选择最多6个要显示的图形。这六个图表是需要导出到pdf报告(包含其他信息)的内容。我需要使这个(在合理的范围内)尽可能兼容浏览器(至少ie8+),尽管我目前的解决方案是ie10+,对于使用modernizer的旧浏览器禁用pdf导出。
从stackoverflow和google,可能的解决方案包括在node中使用phantomjs捕捉屏幕或使用客户端pdf呈现程序(例如jspdf)。除此之外,我的感觉是phantomjs将提供最大的灵活性/浏览器兼容性。另外,我需要根据用户角色生成多个不同的报告,因此在浏览器中拥有生成报告的所有代码是不可取的。但我完全被困在如何使用平均堆栈访问“客户看到的东西”上。phantomjs需要有效地作为客户机登录,并且可以访问客户机所做的六个图形选择。
根据我的研究,使用phantomjs需要创建一个html页面,以某种方式将客户端看到的/数据/图形选择传输到它,然后捕获这些内容并将其呈现为pdf,然后再发送回浏览器。一种方法可能是将所需信息传递回express(使用post?)然后呈现一个可以指向phantomjs的服务器端html页面,但我不知道如何实现(或者如果可能的话)。另一种可能是将客户机报告数据、选项等存储在数据库中,并设置一个任务来呈现pdf并在完成后将其发送回浏览器,但同样,我不知道如何实现这一点。
我在phantomjs中读过cookies,或者使用代码浏览登录页面,但这似乎是实现这一点的一种繁琐方法。可以在服务器端创建一个html文件,并注入chart.js(或另一个图表库)(以及angular?)以及phantomjs呈现为pdf所需的所有用户数据/图表选择?我想在某些方面我需要能够使用pdf生成器、图表库等服务器端来创建pdf。
关于如何实现这一点的任何建议(包括可能的代码示例)都将不胜感激。


最佳答案:

我想我和你有同样的问题(只是我在服务器端使用了laravel)。
我提出的想法是将angular chartjs生成的画布转换为图像(在画布元素上使用todataurl())

$('.theCanvas').each(function () {
           var canvas=this;
           img=JSON.stringify(canvas.toDataURL());

});

http://plnkr.co/edit/PkZiqYynzQXehbe6p1eH?p=preview
然后将图像发送到服务器以创建pdf,最后将创建的pdf的链接发送给用户。
在我的例子中,它们有很多包可以从服务器端的html生成pdf,我不知道node是否有工具。
我希望这能有帮助。