PDF генерация в JavaScript (Node.js): библиотеки и инструменты
Генерация PDF-документов — одна из частых задач в веб-разработке. Счета, отчёты, сертификаты, билеты — всё это удобно создавать на серверной стороне. В экосистеме Node.js существует несколько зрелых решений, каждое из которых подходит для определённых сценариев. В этой статье мы рассмотрим три основных подхода и популярные библиотеки для создания PDF на JavaScript.
Обзор популярных библиотек
Выбор инструмента зависит от сложности документа: простые текстовые отчёты, таблицы с данными или сложные макеты с HTML+CSS. Ниже представлены три ключевые библиотеки.
1. PDFKit — низкоуровневая работа с PDF
PDFKit — это самая популярная библиотека для создания PDF «с нуля». Она позволяет рисовать текст, линии, прямоугольники, изображения, используя координатную сетку. Идеально подходит для динамических документов с точным позиционированием.
Преимущества PDFKit:
- Полный контроль над каждым элементом страницы
- Не требует браузера или Puppeteer
- Поддержка встраивания шрифтов (TrueType, OpenType)
- Работает асинхронно с потоками (Stream API)
Пример простого документа:
const PDFDocument = require('pdfkit');
const fs = require('fs');
const doc = new PDFDocument();
doc.pipe(fs.createWriteStream('output.pdf'));
// Заголовок
doc.fontSize(25).text('Привет, PDFKit!', 100, 100);
// Обычный текст
doc.fontSize(12).text('Это простой PDF-документ, созданный на Node.js.', 100, 150);
// Рисуем линию
doc.moveTo(100, 200).lineTo(500, 200).stroke();
// Добавляем изображение
doc.image('logo.png', 100, 220, { width: 100 });
doc.end();
2. Puppeteer — генерация из HTML/CSS
Puppeteer — это библиотека для управления headless-браузером Chrome. Она позволяет загрузить HTML-страницу (или сгенерировать её на лету) и сохранить как PDF. Это лучший выбор, если у вас уже есть HTML-шаблоны или сложные CSS-стили.
Преимущества Puppeteer:
- Точное отображение CSS (flex, grid, шрифты)
- Поддержка JavaScript на странице (графики, таблицы)
- Возможность задать формат, поля, колонтитулы
- Идеален для отчётов и счетов
Пример генерации PDF из HTML:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
const html = `<!DOCTYPE html>
<html>
<head><style>
body { font-family: Arial; padding: 20px; }
h1 { color: #2c3e50; }
table { border-collapse: collapse; width: 100%; }
td, th { border: 1px solid #ccc; padding: 8px; }
</style></head>
<body>
<h1>Отчёт за месяц</h1>
<table>
<tr><th>Товар</th><th>Количество</th></tr>
<tr><td>Ноутбук</td><td>5</td></tr>
<tr><td>Мышь</td><td>10</td></tr>
</table>
</body></html>`;
await page.setContent(html);
await page.pdf({ path: 'report.pdf', format: 'A4', printBackground: true });
await browser.close();
console.log('PDF создан!');
})();
3. jsPDF — генерация на клиенте (и Node.js)
jsPDF изначально создавался для браузера, но имеет версию для Node.js. Он легковесен и хорошо подходит для простых документов. В Node.js используется через пакет jspdf с дополнительными зависимостями.
Преимущества jsPDF:
- Небольшой размер
- Поддержка Unicode и кириллицы (через загрузку шрифтов)
- Может работать как на клиенте, так и на сервере
Пример в Node.js:
const { jsPDF } = require('jspdf');
const doc = new jsPDF();
doc.text('Привет, jsPDF!', 10, 10);
doc.addPage();
doc.text('Это вторая страница.', 10, 10);
doc.save('document.pdf');