Node.js 使用meteor wkhtmltopdf在页面上下载元素的PDF
我试图触发DOM中呈现的D3生成元素的服务器端,然后在响应中将最终PDF传递回客户端 简而言之,我正在做的是:Node.js 使用meteor wkhtmltopdf在页面上下载元素的PDF,node.js,meteor,wkhtmltopdf,Node.js,Meteor,Wkhtmltopdf,我试图触发DOM中呈现的D3生成元素的服务器端,然后在响应中将最终PDF传递回客户端 简而言之,我正在做的是: Meteor.methods({ downloadPdf: function(data, node) { var filename = data.slug + "-" + data.size, headers = { 'Content-Type': 'application/pdf', 'Content-Disposi
Meteor.methods({
downloadPdf: function(data, node) {
var filename = data.slug + "-" + data.size,
headers = {
'Content-Type': 'application/pdf',
'Content-Disposition': "attachment; filename=" + filename + ".pdf"
};
this.response.writeHead(200, headers);
var r = wkhtmltopdf(node).pipe(this.response);
return r;
}
});
我是这样称呼客户的:
Template.getPDF.events({
'click .pdf-export-button': function(e) {
var data = Router.current() && Router.current().data();
if (data) {
var node = d3.select(".pdf-export-preview").node().innerHTML;
Meteor.call("downloadPdf", data, node, function(err, result) {
// response goes here?
});
}
}
});
问题是,上面的代码在Meteor.call
回调上返回了一个500错误,我的终端告诉我这是:调用方法'downloadPdf'TypeError时异常:无法调用未定义的方法'writeHead'。似乎表明响应还没有准备好,或者类似的东西。我真的不知道如何解决这个问题。任何帮助都将不胜感激
另外,我找到的一个解决方案是,但这是一个问题,因为我需要能够将渲染的D3 SVG传递给wkhtmltopdf(以及PDF的一些配置文件)。Hm,进一步检查后,它看起来像是传递了节点,因为它导致了调用堆栈错误-因此我正在执行var node=D3.select(.PDF导出预览”).node().innerHTML代码>取而代之。但仍然不确定如何通过管道将呈现的PDF作为响应。越来越近了,但仍然出现一些奇怪的错误。编辑了这个问题来反映这一点。汤姆,你知道这一点吗?有同样的问题。我也不想通过服务器端路由器调用对呈现的PDF进行管道处理(我想发送一个只有经过身份验证时才可见的模板,这是一个问题,因为服务器端路由器不容易访问Meteor.user)。有什么进展吗?嘿@JonnyMD,我的错,已经有一段时间没有真正登录StackOverflow了。我最终使用Iron路由器路由,并将数据传递给服务器本身呈现的模板。这里的例子(这个项目现在是开源的):如果您仍然在寻求这方面的帮助,请告诉我!我很乐意看一看。