Генерация 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");
Какую библиотеку выбрать?
Ответ зависит от вашей задачи:
- Если нужно генерировать простые текстовые документы (справки, квитанции) — используйте <