Используйте Puppeteer для создания PDF на стороне клиента - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь заставить Puppeteer загрузить файл в браузере. В настоящее время я сохраняю файл локально в Cloud9, но хочу нажать кнопку загрузки PDF и загрузить его в Chrome.

Я пытался сохранить page.pdf в переменную, но это не сработало. Я также попытался открыть локально сохраненный файл, но я не могу заставить это работать также.

var express = require("express");
var puppeteer = require("puppeteer");

module.exports = function pdf(url, req) {(async () => {
      var browser = await puppeteer.launch();
      var page = await browser.newPage();
      await page.goto('https://node-and-mysql-mbegg.c9users.io/clients/'+req.params.id+'/reports/monthlyreport/'+req.params.marketplace+'/'+req.params.month, {waitUntil: 'networkidle2'});
      await page.pdf({path: 'public/temp/Performance Report -'+req.params.month+'.pdf', format: 'A4', landscape: true, printBackground: true});

      await browser.close();
    })();
}

///Print PDF route
router.get("/clients/:id/reports/monthlyreport/:marketplace/:month/pdf", function(req, res) {
    var url = "/clients/"+req.params.id+"/reports/monthlyreport/"+req.params.marketplace+"/"+req.params.month
    pdf(url, req);
    res.contentType("application/pdf");
    res.send(pdf);;
});

Я знаю, что res.send (pdf) требует, чтобы page.pdf () был сохранен в переменной и возвращен. Я просто не удалил это из маршрута.

Что происходит, когда я сохраняю page.pdf () в переменную, я просто получаю пустой файл, а не PDF, и он выглядит просто как пустой буфер или что-то в этом роде. Я не знаю, что я делаю неправильно, чтобы не загружать файл в браузере Chrome.

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Хотя в функции pdf вы, кажется, ожидаете каждой из операций puppeteer, вы фактически не ожидаете вызова функции pdf в вашем экспресс-маршруте. Кроме того, функция pdf сейчас ничего не возвращает! Вам нужно будет внести следующие изменения в вашу программу:

  1. Функция pdf должна возвращать имя файла, в который был сохранен сгенерированный PDF. Хотя вы можете избавиться от IIFE, но это не обязательно, просто объявите внешнюю функцию как async.
  2. В функции маршрута программа должна ожидать возвращения имени файла при вызове pdf(...). Это может быть сделано с помощью Promise, или ждать. Если предпочтительным является ожидание, внешняя функция должна быть помечена как асинхронная.
  3. Функция sendFile, предоставляемая выражением для объектов response, должна использоваться для отправки сгенерированного файла PDF клиенту. Обратите внимание, что res.sendFile ожидает абсолютный путь к файлу.

Ниже приводится модифицированная версия вашей программы, которая реализует их.

const express = require("express");
const puppeteer = require("puppeteer");
const path = require('path');

module.exports = async function pdf(url, req) {
    const filename = `public/temp/Performance Report -${req.params.month}.pdf`;
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    await page.goto('https://node-and-mysql-mbegg.c9users.io/clients/'+req.params.id+'/reports/monthlyreport/'+req.params.marketplace+'/'+req.params.month, {waitUntil: 'networkidle2'});
    await page.pdf({path: filename, format: 'A4', landscape: true, printBackground: true});

    await browser.close();
    return filename;
}

///Print PDF route
router.get("/clients/:id/reports/monthlyreport/:marketplace/:month/pdf", async function(req, res) {
    var url = "/clients/"+req.params.id+"/reports/monthlyreport/"+req.params.marketplace+"/"+req.params.month

    const filename = await pdf(url, req);
    res.contentType("application/pdf");
    res.sendFile(path.join(__dirname, filename)); // if 'public/temp/...' path is not relative to cur dir, make relevant change here.
});
0 голосов
/ 27 мая 2019
///  Async/await
router.get("/clients/:id/reports/monthlyreport/:marketplace/:month/pdf", async function(req, res) {
    var url = "/clients/"+req.params.id+"/reports/monthlyreport/"+req.params.marketplace+"/"+req.params.month
    let pdfData = await pdf(url, req);
    res.contentType("application/pdf");
    res.send(pdfData);
});
///  promise
router.get("/clients/:id/reports/monthlyreport/:marketplace/:month/pdf", async function(req, res) {
    var url = "/clients/"+req.params.id+"/reports/monthlyreport/"+req.params.marketplace+"/"+req.params.month
    pdf(url, req).then((pdfData )=>{
        res.contentType("application/pdf");
        res.send(pdfData);
    });
});

Вы не ожидали завершения процесса. Вам также была отправлена ​​функция, а не ее результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...