PDF генерация в JavaScript (Node.js): обзор библиотек и инструментов
Создание PDF-документов — одна из частых задач в веб-разработке. Будь то генерация счетов, отчётов, сертификатов или просто экспорт данных, Node.js предлагает несколько мощных решений. В этой статье мы рассмотрим основные библиотеки для работы с PDF на серверной стороне JavaScript, их возможности и примеры использования.
Зачем генерировать PDF на сервере?
Генерация PDF на сервере (в Node.js) даёт ряд преимуществ:
- Единообразие — документ выглядит одинаково на всех устройствах
- Безопасность — данные не покидают сервер
- Автоматизация — можно создавать PDF по расписанию или при определённых событиях
- Поддержка сложной логики — доступ к базам данных, файловой системе и другим ресурсам
Основные библиотеки для генерации PDF в Node.js
1. PDFKit
PDFKit — самая популярная библиотека для создания PDF "с нуля". Она не требует внешних зависимостей и позволяет полностью контролировать содержимое документа.
Пример использования:
const PDFDocument = require('pdfkit');
const fs = require('fs');
const doc = new PDFDocument();
doc.pipe(fs.createWriteStream('output.pdf'));
// Добавляем контент
doc.fontSize(25).text('Привет, мир!', 100, 100);
doc.fontSize(12).text('Это PDF, созданный с помощью PDFKit.', 100, 150);
// Рисуем линию
doc.moveTo(100, 200).lineTo(500, 200).stroke();
// Завершаем документ
doc.end();
Возможности:
- Добавление текста с разными шрифтами и размерами
- Вставка изображений (JPEG, PNG)
- Рисование линий, прямоугольников и кругов
- Поддержка ссылок и закладок
- Создание многостраничных документов
2. Puppeteer
Puppeteer — это инструмент для управления браузером Chrome/Chromium. Он позволяет генерировать PDF из HTML-страниц, что удобно для сложных макетов.
Пример использования:
const puppeteer = require('puppeteer');
async function generatePDF() {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setContent('<h1>Заголовок</h1><p>Текст документа</p>');
await page.pdf({ path: 'page.pdf', format: 'A4' });
await browser.close();
}
generatePDF();
Особенности:
- Поддержка CSS, JavaScript и всех современных веб-технологий
- Идеально для конвертации HTML-шаблонов в PDF
- Возможность печати с заданными параметрами (формат, поля, масштаб)
- Требуется установка Chromium (~300 МБ)
3. jsPDF (с адаптацией для Node.js)
jsPDF — клиентская библиотека, но существуют обёртки для использования в Node.js (например, jspdf-autotable).
Пример (с использованием jspdf и html2canvas):
const { jsPDF } = require('jspdf');
const fs = require('fs');
const doc = new jsPDF();
doc.text('Привет из Node.js!', 10, 10);
doc.save('output.pdf');
Ограничения: jsPDF не поддерживает сложные макеты и требует дополнительных библиотек для работы с HTML.
4. pdfmake
pdfmake — библиотека, основанная на декларативном описании документа в формате JSON.
Пример:
const pdfmake = require('pdfmake');
const fs = require('fs');
const fonts = {
Roboto: {
normal: 'fonts/Roboto-Regular.ttf',
bold: 'fonts/Roboto-Medium.ttf'
}
};
const printer = new pdfmake(fonts);
const docDefinition = {
content: [
{ text: 'Заголовок', style: 'header' },
{ text: 'Основной текст с переносом строки\nНовая строка' }
],
styles: {
header: { fontSize: 18, bold: true }
}
};
const pdfDoc = printer.createPdfKitDocument(docDefinition);
pdfDoc.pipe(fs.createWriteStream('output.pdf'));
pdfDoc.end();
Преимущества:
- Простота создания таблиц и списков
- Поддержка стилей и шаблонов
- Встроенная поддержка колонтитулов