PDF генерация в JavaScript (Node.js): библиотеки и инструменты

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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');                    

Рекомендаций