PDF генерация в JavaScript (Node.js): полное руководство по библиотекам и инструментам
Генерация PDF-документов — одна из самых востребованных задач в веб-разработке. От создания счетов и отчетов до формирования сложных многостраничных документов — Node.js предлагает мощные инструменты для работы с PDF. В этой статье мы рассмотрим основные библиотеки и подходы к созданию PDF-файлов на серверной стороне JavaScript.
Зачем генерировать PDF на сервере?
Серверная генерация 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.moveTo(100, 150).lineTo(400, 150).stroke();
// Вставляем изображение
doc.image('logo.png', 100, 200, { width: 100 });
doc.end();
Плюсы: легковесный, быстрый, поддерживает Unicode и кириллицу, множество шрифтов.
Минусы: требует ручной настройки макета, нет встроенной поддержки HTML.
2. Puppeteer — генерация из HTML
Puppeteer — это библиотека для управления headless-браузером Chrome. Она позволяет конвертировать HTML-страницы в PDF с сохранением всех стилей и скриптов.
const puppeteer = require('puppeteer');
async function generatePDF() {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setContent('<h1 style="color: red;">Заголовок PDF</h1><p>Текст документа</p>');
await page.pdf({
path: 'output.pdf',
format: 'A4',
margin: { top: '20px', bottom: '20px' }
});
await browser.close();
}
generatePDF();
Плюсы: идеально для сложных HTML-макетов, поддерживает CSS, JavaScript, шрифты.
Минусы: тяжеловесный (требует Chromium), медленнее других библиотек.
3. pdf-lib — модификация существующих PDF
pdf-lib специализируется на редактировании существующих PDF-документов. Позволяет добавлять текст, изображения, заполнять формы.
const { PDFDocument } = require('pdf-lib');
const fs = require('fs');
async function editPDF() {
const existingPdfBytes = fs.readFileSync('template.pdf');
const pdfDoc = await PDFDocument.load(existingPdfBytes);
const pages = pdfDoc.getPages();
const firstPage = pages[0];
firstPage.drawText('Новый текст', {
x: 50,
y: 50,
size: 20,
color: rgb(0, 0, 0)
});
const pdfBytes = await pdfDoc.save();
fs.writeFileSync('modified.pdf', pdfBytes);
}
editPDF();
Плюсы: легковесный, не требует внешних зависимостей, отлично работает с формами.
Минусы: ограниченные возможности для создания сложных макетов с нуля.
4. jsPDF — клиент-серверное решение
jsPDF изначально создавалась для браузера, но работает и в Node.js. Подходит для простых документов.
const { jsPDF } = require("jspdf");
const doc = new jsPDF();
doc.text("Hello world!", 10, 10);
doc.save("output.pdf");
Плюсы: простой API, работает на клиенте и сервере.
Минусы: ограниченная поддержка кириллицы, меньше возможностей.
Сравнение библиотек
- pdfkit — лучший выбор для создания PDF с нуля с полным контролем
- Puppeteer — идеален для конвертации HTML в PDF
- pdf-lib — незаменим для редактирования существующих PDF
- jsPDF — простой вариант для базовых задач
Практический пример: создание счета
Рассмотрим созда
Также в библиотеке
UUID для JavaScript (Node.js): полное руководство с примерами
Генератор QR-кодов на Swift: Core Image, CIFilter и собственные решения