Создавайте PDF с помощью Node.js, Jade и Express

Я пытаюсь создать PDF-файл из одного из моих представлений.

Это представление визуализируется с использованием Jade и Express, загружает некоторые файлы Javascript, некоторые файлы CSS, расширяет некоторые представления Jade и запрашивает базу данных для заполнения различных графиков. Процесс рендеринга занимает около 7 секунд, потому что он не очень хорошо оптимизирован.

Кроме того, запрос GET для представления использует passport и connect-ensure-login для проверки того, что пользователь вошел в систему перед рендерингом, и передает некоторые переменные для использования Jade при рендеринге. Это код обработчика:

var express = require('express');
var router = express.Router();
var moment = require('moment');

router.get('/', require('connect-ensure-login').ensureLoggedIn(), function (req, res, next) {
    res.render('summary', {
        title: 'Summary',
        day: moment().format('D'),
        month: moment().locale('es').format('MMMM'),
        year: moment().format('YYYY')
    });
});

module.exports = router;

Это файл Jade, который необходимо преобразовать в PDF:

extends layout

block content

    .container-fluid

        #banner

        .chart#chart1
        .chart#chart2
        .chart#chart3

        script(type='text/javascript', src='/javascripts/summary.js')

И это расширенный файл Jade (макет):

doctype html

html
    head
        meta(charset='utf-8')
        meta(http-equiv='X-UA-Compatible', content='IE=edge')
        meta(http-equiv='content-type', content='text/html; charset=UTF-8')
        meta(content='width=device-width, initial-scale=1', name='viewport')
        title=title

        link(rel='stylesheet', type='text/css', href='/stylesheets/styles.css')

        script(type='text/javascript', src='/assets/jquery-3.1.1/jquery-3.1.1.min.js')
        script(type='text/javascript', src='/assets/bootstrap-3.3.7/js/bootstrap.min.js')

    body
        .page-wrapper
            block content

Как мне загрузить страницу, сделать снимок экрана и преобразовать его в PDF или отобразить в формате PDF из файла Jade?

Я слышал о PhantomJS, но не могу найти актуальную информацию.

Если бы кто-нибудь мог мне помочь, я был бы очень благодарен.


person naranjja    schedule 04.01.2017    source источник


Ответы (1)


Что вы можете сделать, так это использовать jade/pug для создания файла .html с нужными значениями, сохранить его в файловой системе (асинхронным способом), как только это будет сделано, используйте эту библиотеку:

https://www.npmjs.com/package/html-pdf

Чтобы прочитать (асинхронно) файл .html, который вы сохранили в файловой системе, и преобразовать его в pdf, и, наконец, передать его клиенту.

Возможно, вы можете использовать другую библиотеку, чтобы вместо записи в файловую систему передавать ее непосредственно в конвертер PDF, и это будет быстрее.

Если шаблон будет часто меняться, это нужно будет делать для каждого запроса, в противном случае вы можете кэшировать его и генерировать только в первый раз, затем определить, существует ли он уже, и направить его в ответ.

Надеюсь, поможет.

person JCLG    schedule 04.01.2017