繁体   English   中英

用puppeteer生成PDF而不保存它

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM