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

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

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

Начать курс

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

Преимущества:

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