Генерация PDF отчётов на JavaScript (Node.js): библиотеки и примеры

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Генерация PDF отчётов на JavaScript (Node.js)

Создание PDF-документов — одна из самых востребованных задач в веб-разработке. Отчёты, счета, сертификаты, документация — всё это требует надёжного инструмента для генерации на серверной стороне. В экосистеме Node.js существует несколько мощных библиотек, позволяющих гибко формировать PDF-файлы. В этой статье мы подробно разберём три основных подхода: PDFKit (прямое программирование), Puppeteer (рендеринг HTML) и jsPDF (лёгкий вариант).

Зачем генерировать PDF на сервере?

  • Динамическое содержимое — данные из базы, расчёты, графики.
  • Безопасность — контроль доступа и версионирование.
  • Автоматизация — массовая рассылка отчётов по расписанию.
  • Единый формат — корректное отображение на всех устройствах.

1. PDFKit — полный контроль над документом

PDFKit — самая популярная библиотека для создания PDF «с нуля». Она не требует браузера и работает исключительно с JavaScript-объектами. Вы управляете каждым элементом: текст, изображения, векторная графика, шрифты.

Установка

npm install pdfkit

Пример: простой отчёт с таблицей

const PDFDocument = require('pdfkit');
const fs = require('fs');

const doc = new PDFDocument();

doc.pipe(fs.createWriteStream('report.pdf'));

// Заголовок
doc.fontSize(24).text('Ежемесячный отчёт', { align: 'center' });
doc.moveDown();

// Подзаголовок
doc.fontSize(14).text('Период: Январь 2025', { align: 'center' });
doc.moveDown(2);

// Таблица (имитация)
doc.fontSize(12).font('Helvetica-Bold');
doc.text('Товар', 50, 150);
doc.text('Количество', 250, 150);
doc.text('Цена', 400, 150);

doc.font('Helvetica');
const data = [
    { item: 'Ноутбуки', qty: 15, price: 75000 },
    { item: 'Мониторы', qty: 30, price: 25000 },
    { item: 'Клавиатуры', qty: 100, price: 1500 }
];

let y = 170;
data.forEach(row => {
    doc.text(row.item, 50, y);
    doc.text(String(row.qty), 250, y);
    doc.text(String(row.price), 400, y);
    y += 20;
});

// Итог
doc.moveDown();
doc.font('Helvetica-Bold');
doc.text(`Итого: ${data.reduce((sum, r) => sum + r.qty * r.price, 0)} руб.`, 50, y + 20);

doc.end();

Возможности PDFKit:

  • Векторная графика (линии, прямоугольники, круги).
  • Встраивание шрифтов (TrueType, OpenType).
  • Поддержка Unicode и кириллицы.
  • Создание ссылок и аннотаций.

2. Puppeteer — рендеринг HTML в PDF

Если у вас уже есть HTML-шаблон отчёта (например, на Bootstrap), Puppeteer — идеальный выбор. Он запускает headless-браузер Chrome и преобразует страницу в PDF с сохранением всех стилей, шрифтов и JavaScript-анимаций.

Установка

npm install puppeteer

Пример: конвертация HTML-шаблона

const puppeteer = require('puppeteer');

async function generatePDF() {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    // HTML с CSS
    const html = `
        <!DOCTYPE html>
        <html>
        <head>
            <style>
                body { font-family: Arial; padding: 40px; }
                h1 { color: #2c3e50; }
                table { width: 100%; border-collapse: collapse; }
                th, td { border: 1px solid #ccc; padding: 8px; }
            </style>
        </head>
        <body>
            <h1>Отчёт о продажах</h1>
            <table>
                <tr><th>Месяц</th><th>Сумма</th></tr>
                <tr><td>Январь</td><td>450 000 руб.</td></tr>
                <tr><td>Февраль</td><td>520 000 руб.</td></tr>                    

Рекомендаций