Создать PDF с кукловодом без сохранения - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть API, написанный с node.js, размещенный на heroku, а мое веб-приложение написано на Vue.js, оно на hostinger. Я хотел бы знать, возможно ли сгенерировать 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 голосов
/ 06 ноября 2018

Согласно официальной документации , если вы не укажете путь, файл не будет сохранен на диск.

page.pdf (параметры): Объект параметров, который может иметь следующие свойства: путь Путь к файлу для сохранения в формате PDF. Если путь является относительным путем, то он разрешается относительно текущего рабочего каталога. Если путь не указан, файл 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')

РЕДАКТИРОВАТЬ: Вот полный пример использования экспресс и кукловод, который возвращает содержимое 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') });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...