当前位置: 首页 > 知识库问答 >
问题:

使用节点html PDF模块下载生成的PDF

丁慈
2023-03-14

我正在使用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个答案

姚棋
2023-03-14

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

步骤1:以流的形式阅读PDF

步骤2:通过管道将其发送到响应

当做

雷米

公西修文
2023-03-14

看看node-html-pdf文档,你最有可能在下面使用什么:你也可以设置你的响应头:

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

pdf.create(html).toStream(function(err, stream){
    stream.pipe(res);
});
邹坚壁
2023-03-14

我刚刚使用HTMLPDF模块开发了一个功能。

下面是我的代码示例:

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

或者你可以这样使用Stream:

pdf.create(html).toStream(function (err, stream) {
    if (err) return res.send(err);
    res.type('pdf');
    stream.pipe(res);
});

希望它能帮助你。

 类似资料:
  • 问题内容: 是否可以安装通过npm安装的节点模块,然后从casperjs脚本安装它? (我在node.js内看到了很多运行casper或phantom的帖子和工具,但这不是我想要的。) casperjs文档似乎说这是可能的,但只能使用手写玩具模块进行显示,而实际上并没有做任何事情。我要安装的实际模块是,但目前无法使任何模块正常工作,即使是内置模块也是如此。简单的例子: 给我: (我可以从中看到im

  • 最近我开始使用node。js。当我在我的一个项目中完成一个需求时,我面临一个问题,我应该能够将一些数据动态写入csv文件,并让它作为弹出窗口提示用户下载(如我们通常看到的,带有保存和取消选项)。在谷歌搜索了一段时间后,我决定使用csv npm模块https://github.com/wdavidw/node-csv-parser.我能够将数据写入文件并使用此模块进行保存。我想提示一个弹出窗口来保存

  • 问题内容: 我正在尝试使其工作,但似乎无法在SO的任何地方找到解决方案。尝试编译此单文件应用程序时: 使用命令“ tsc app.ts –module’commonjs’”,我得到以下错误(不使用– module标志给我一个额外的错误,告诉我我需要它来编译外部模块): 问题答案: TypeScript需要知道它存在。 为节点安装类型definitinos: 旧答案 遵循这两个步骤 从此处下载文件:

  • 我使用的是TypeScript(1.6),节点位于--harmony标志下,因此我希望将es6模块语法转换到commonJS。 据我所知,我不能用Typescript1.6来做这件事。如果我将目标设置为es6,将模块设置为commonjs,我会得到一个TypeScript错误- 当目标为“ES6”或更高版本时,无法将模块编译为“commonjs”、“amd”、“system”或“umd”。 为什么

  • 从'@角/核'导入{Inject table};从'rxjs/行为主体'导入{行为主体}; @可注入({providedIn:'root'})导出类数据服务{ 私人目标=新行为主体([“初始目标]);goal=this.goals.asObservable(); 构造函数(){} } 我无法运行,因为工具提示中出现如下错误:[ts]模块“c:/Users/Admin/free_project/co

  • 问题内容: 最近,我开始使用node.js。在我的一个项目中完成一项需求时,我面临一个问题,即我应该能够动态地向csv文件中写入一些数据,并让它作为弹出窗口提示用户下载(使用保存和取消选项- 与我们通常一样)看到)。谷歌搜索一段时间后,我决定使用csv npm模块https://github.com/wdavidw/node-csv- parser 。我能够将数据写入文件并使用此模块保存。我想提示