使用node-html-pdf模块下载生成的PDF

时间:2015-07-07 09:23:16

标签: javascript node.js pdf pdf-generation

我使用node-html-pdf模块从我创建的ejs模板生成PDF文件,在生成后,它会保存在我的服务器上。

现在这很完美,但我真正需要的是当我点击一个按钮时,它会生成PDF并下载文件,而不是保存它。

下面你可以看到我必须生成并保存文件的代码:

var html = null;

ejs.renderFile('./templates/participants.ejs', {users: req.body.users, course: req.body.course, organization: req.body.organization}, function (err, result) {
    if (result) {
        html = result;
    }
    else {
        res.end('An error occurred');
        console.log(err);
    }
});

pdf.create(html).toStream(function(err, stream){
    var file = 'c:' + stream.path; 
    // var file = full path to tmp file (added 'c:' because I'm testing locally right now)
    res.setHeader('Content-type', 'application/pdf');
    res.setHeader('Content-disposition', 'attachment; filename=' + file);
    res.download(file, req.body.course.name + '.pdf', function(err){
        if (err) {
           // Handle error, but keep in mind the response may be partially-sent
           // so check res.headersSent
        } else {
           // decrement a download credit, etc.
        }
    });
});

我想也许我可以.toStream.toBuffer而不是.toFile,但是我已经退出了这个并且在文档中它确实没有解释.toStream.toBuffer的工作原理(或确实如何)。我希望也许有人可以指出我正确的方向?或者至少告诉我这是否完全错误,我应该看看另一个解决方案。

更新

我现在已经尝试查看@ Remy的链接,但没有运气(没有任何反应,甚至没有错误,当我运行代码时),所以我用我的新代码(上面)更新了我的帖子。

我也试过@itaylorweb回答,但结果相同,没有任何反应。

3 个答案:

答案 0 :(得分:1)

我刚刚使用$query=explode('&',$_SERVER['QUERY_STRING']); $test_arr=array(); foreach($query as $key=>$value){ array_push($test_arr,explode('=',$value)); } $query_str=''; $count=count($test_arr); $i=0; foreach($test_arr as $value){ $query_str.=$value['1']; if($i==($count-1)){ continue; }else{ $query_str.='/'; } $i++; } $page_url=SITEURL.'/'.$query_str; 模块开发了一项功能。

以下是我的代码示例:

html-pdf

或者您可以像这样使用Stream:

pdf.create(html).toBuffer(function (err, buffer) {
    if (err) return res.send(err);
    res.type('pdf');
    res.end(buffer, 'binary');
});

希望它会对你有所帮助。

答案 1 :(得分:0)

查看node-html-pdf文档,您最有可能在下面使用: 您还可以设置响应标头:

res.setHeader('Content-type', 'application/pdf');

pdf.create(html).toStream(function(err, stream){
    stream.pipe(res);
});

答案 2 :(得分:-1)

我这样做https://stackoverflow.com/a/7288883/2045854https://stackoverflow.com/a/11944984/2045854

第1步:将您的PDF作为流阅读

第2步:将其传递给回复

此致

雷米