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

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

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

Начать курс

Генерация PDF отчётов на JavaScript (Node.js): Полное руководство

Создание PDF-документов — одна из самых востребованных задач в веб-разработке. Будь то выгрузка счетов, формирование аналитических отчётов или генерация сертификатов — без надёжного инструмента не обойтись. В экосистеме Node.js существует несколько мощных библиотек, которые позволяют решить эту задачу быстро и гибко. В этой статье мы разберём три основных подхода и покажем, как выбрать подходящий инструмент для вашего проекта на PythonLib.

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

Клиентская генерация (браузер) часто ограничена: пользователь может потерять данные при обновлении страницы, а мобильные устройства не всегда корректно обрабатывают сложные макеты. Серверный подход на Node.js даёт полный контроль над структурой документа, защищает коммерческую логику и позволяет интегрировать генерацию в пайплайны CI/CD.

Топ-3 библиотеки для работы с PDF в Node.js

1. PDFKit — низкоуровневая работа с контентом

PDFKit — это самая популярная библиотека для создания PDF с нуля. Она не требует установки дополнительных зависимостей (вроде Chromium) и позволяет контролировать каждый пиксель документа.

  • Плюсы: лёгкая (всего несколько мегабайт), полная свобода вёрстки, поддержка шрифтов, изображений, векторной графики.
  • Минусы: нужно писать много кода для сложных макетов, нет автоматического переноса текста.

Пример создания простого счёта:

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

const doc = new PDFDocument({ margin: 50 });

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

// Заголовок
doc.fontSize(25).text('Счёт №123', { align: 'center' });
doc.moveDown();

// Таблица
doc.fontSize(12).text('Товар: Консультация', { continued: true })
   .text('Цена: 5000 руб.', { align: 'right' });

doc.moveDown();
doc.text('Итого: 5000 руб.', { align: 'right' });

doc.end();

2. Puppeteer — генерация из HTML/CSS

Puppeteer запускает headless-браузер Chromium и преобразует HTML-страницу в PDF. Это идеальный выбор, если у вас уже есть шаблоны на HTML с CSS-стилями.

  • Плюсы: простая вёрстка через HTML, поддержка всех CSS-свойств (flex, grid, @media print), возможность добавлять колонтитулы.
  • Минусы: тяжёлая зависимость (~300 МБ Chromium), медленный запуск, не подходит для простых документов.

Пример конвертации HTML в PDF:

const puppeteer = require('puppeteer');

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

  await page.setContent(`<h1 style="color: blue;">Отчёт за март 2025</h1>
    <p>Общая выручка: <strong>1 200 000 руб.</strong></p>`);

  await page.pdf({
    path: 'report.pdf',
    format: 'A4',
    printBackground: true,
    margin: { top: '20px', bottom: '20px' }
  });

  await browser.close();
}

generateReport();

3. jsPDF — универсальный инструмент (клиент + сервер)

jsPDF — это библиотека, которая работает как в браузере, так и в Node.js. Она предоставляет высокоуровневые методы для создания таблиц, графиков и даже внедрения шрифтов.

  • Плюсы: простой API, встроенная поддержка таблиц (через плагин), малый вес.
  • Минусы: на сервере требует ручной настройки шрифтов (не все символы кириллицы есть по умолчанию).

Пример с таблицей:

const { jsPDF } = require("jspdf");
require("jspdf-autotable");

const doc = new jsPDF();

doc.text("Статистика продаж", 14, 20);

doc.autoTable({
  head: [['Месяц', 'Продажи', 'Прибыль']],
  body: [
    ['Январь', '100', '20 000'],
    ['Февраль', '150', '30 000'],
    ['Март', '200', '40 000']
  ],
  startY: 30
});

doc.save("table_report.pdf");

Какую библиотеку выбрать?

Ответ зависит от вашей задачи:

  • Если нужно генерировать простые текстовые документы (справки, квитанции) — используйте <

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