使用puppeteer生成PDF而不保存

时间:2018-11-06 11:00:01

标签: node.js vue.js puppeteer

我有一个用node.js编写的API托管在heroku上,而我的前端应用程序是用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);
    }
};

1 个答案:

答案 0 :(得分:3)

根据official documentation,如果不提供路径,则文件不会保存到磁盘。

  

page.pdf(选项):    选项对象可能具有以下属性:   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') });