express.js-创建一个新的pdf并强制下载,而不将其保存在服务器上

ugl*_*ode 4 pdf-generation node.js express

我正在将express.js与pdfkit一起使用以生成pdf并将其强制下载给用户。为此,我使用了res.download属于express.js 的函数。我也可以pipe将pdf转换为res,但随后下载将无法开始。

好的,这是我的问题:是否可以通过某种方式在服务器上创建pdf并将其“存储在内存中”或类似的东西?当前,我必须定义一个创建pdf的特定位置,然后从该位置读取并提供给用户。基本上,我想“跳过”保存到磁盘和从磁盘读取的文件,但仍然为用户强制下载。

也许我在这里不理解某些概念,所以不胜感激!

这是代码:

router.get('/pdf/:id', function(req, res) {
    Order._getById(req.params.id).
    then(function(order) {
        if (order !== null) {
            var doc = new PDFDocument();
            var result = order.toJSON();

            var products = result.products;
            var user = result.user;
            var comments = result.comments;

            doc.registerFont('arial', path.join(__dirname, '../fonts', 'arial' , 'arial.ttf'));         

            for (var i in products) {
                var product = products[i];
                doc.font('arial').text(product.name);
                doc.image(path.join(__dirname,'../uploads','thumb', product.picture), {scale: 1.0});
                doc.font('arial').text(product.price + ' €');
            }

            var r = doc.pipe(fs.createWriteStream(path.join(__dirname, '../uploads', 'out.pdf')));
            doc.end();

            r.on('finish', function(){
                //the response is a "forced" download of a file I had to save on the disk
                res.download(path.join(__dirname, '../uploads', 'out.pdf'));
            });

        } else {
            res.json(false);
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

同样,如果我不保存文件,只需执行以下操作:doc.pipe(res);pdf将在新标签页中打开,而不是强制下载。

ugl*_*ode 5

我认为这就是答案...我可以pipe将结果仅发送给客户端,但是需要设置标题,即:

        res.writeHead(200, {
            'Content-Type': 'application/pdf',
            'Access-Control-Allow-Origin': '*',
            'Content-Disposition': 'attachment; filename=out.pdf'
        });
Run Code Online (Sandbox Code Playgroud)