express.js - 创建一个新的 pdf 并强制下载,而不将其保存在服务器上
express.js - create a new pdf and force the download, without saving it on server
我正在使用 express.js 和 pdfkit 生成 pdf 并强制下载给用户。为此,我使用了属于 express.js 的 res.download
函数。我也可以 pipe
将 pdf 文件 res
,但是下载不会开始。
好的,那么我的问题是什么:是否可以以某种方式在服务器上创建 pdf 并将其存储 "in memory" 或类似的东西?目前,我必须定义创建 pdf 的特定位置,然后从该位置读取并将其提供给用户。基本上,我想 "skip" 保存到磁盘和从磁盘读取,但仍然强制用户下载。
也许我对这里的一些概念不理解,所以非常感谢任何一种解释!
代码如下:
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);
}
});
});
同样,如果我不保存文件而只是这样做:doc.pipe(res);
pdf 将在新选项卡中打开,而不是强制下载。
我想这就是答案...我可以直接pipe
结果给客户,但是headers需要设置,即:
res.writeHead(200, {
'Content-Type': 'application/pdf',
'Access-Control-Allow-Origin': '*',
'Content-Disposition': 'attachment; filename=out.pdf'
});
我正在使用 express.js 和 pdfkit 生成 pdf 并强制下载给用户。为此,我使用了属于 express.js 的 res.download
函数。我也可以 pipe
将 pdf 文件 res
,但是下载不会开始。
好的,那么我的问题是什么:是否可以以某种方式在服务器上创建 pdf 并将其存储 "in memory" 或类似的东西?目前,我必须定义创建 pdf 的特定位置,然后从该位置读取并将其提供给用户。基本上,我想 "skip" 保存到磁盘和从磁盘读取,但仍然强制用户下载。
也许我对这里的一些概念不理解,所以非常感谢任何一种解释!
代码如下:
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);
}
});
});
同样,如果我不保存文件而只是这样做:doc.pipe(res);
pdf 将在新选项卡中打开,而不是强制下载。
我想这就是答案...我可以直接pipe
结果给客户,但是headers需要设置,即:
res.writeHead(200, {
'Content-Type': 'application/pdf',
'Access-Control-Allow-Origin': '*',
'Content-Disposition': 'attachment; filename=out.pdf'
});