[英]Generate PDF with puppeteer without save it
我有一个用heroku
托管的node.js
编写的API,我的前端应用程序是用Vue.js
编写的,它是在hostinger
。 我想知道是否可以使用puppeteer生成PDF文件并立即将其发送到前端客户端而不先将其保存到磁盘? 如果是的话,你能给我一些如何做的例子吗?
目前我的功能是这样的:
exports.gerarPDFAvaliacao = async (dadosAvaliacao) => {
try {
const compile = async (fileName, data) => {
const filePath = path.join(process.cwd(), 'src/templates/client/operation/', `${fileName}.hbs`);
const html = await fs.readFile(filePath, 'utf-8');
return await hbs.compile(html)(data);
}
const browser = await puppeteer.launch();
const page = await browser.newPage();
let content = await compile('avaliations', dadosAvaliacao);
await page.goto(`data:text/html,${content}`, { waitUntil: 'networkidle0' });
await page.emulateMedia('screen');
await page.pdf({
path: 'src/dist/pdf/' + dadosAvaliacao.arquivo + '.pdf',
format: 'A4',
printBackground: true
})
await browser.close();
return dadosAvaliacao.arquivo + '.pdf';
} catch (error) {
console.log('Errors => ', error);
}
};
根据官方文档 ,如果您不提供路径,则文件将不会保存到磁盘。
page.pdf(options):可能具有以下属性的选项对象:path将PDF保存到的文件路径。 如果path是相对路径,则相对于当前工作目录解析它。 如果未提供路径,则PDF将不会保存到磁盘。
这意味着它应该返回类似缓冲区或生成文件的二进制表示的内容。 您只需要将响应或管道返回到响应,具体取决于您使用的框架。
这只是将pdf输出到控制台:
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
console.log(await page.content());
const pdf = await page.pdf();
await browser.close();
console.log(pdf) // maybe do response(pdf).type('x-pdf')
编辑:这是一个使用express和puppeteer的完整示例,它直接在内存中返回pdf内容。 它运行在runkit上,所以我认为同样的限制适用(甚至可能更多)。 如果您导航到该示例所具有的公共端点,您可以看到浏览器如何检测到它是pdf文件并正确呈现它。
码
const puppeteer = require ('puppeteer');
const express = require('express');
var app = express(exports);
const browser = await puppeteer.launch();
const main = async () => {
const page = await browser.newPage();
await page.goto('https://example.com');
const pdf = await page.pdf();
return pdf;
}
app.get('/', async function (req, res) {
const pdf = await main();
res.contentType("application/pdf");
res.send(pdf);
});
app.listen(3000, function(){ console.log('Listening on 3000') });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.