Генерация 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>