Полное руководство по созданию PDF-файлов с помощью Puppeteer: от простых документов до сложных отчетов

Puppeteer — это библиотека для Node.js, которая автоматизирует работу с браузерами Chrome или Chromium, делая её мощным инструментом для создания PDF-документов. Независимо от того, создаёте ли вы простые документы или сложные отчёты, Puppeteer предлагает такие функции, как встроенная поддержка PDF, настройка макетов и интеграция с автоматизацией для упрощения процесса.
Основные возможности Puppeteer для генерации PDF:

- Простая настройка: Используйте Headless-браузер на основе Puppeteer и начните создавать PDF-документы с помощью всего нескольких строк кода.
- Настраиваемые макеты: Изменяйте размер страницы, ориентацию, поля и многое другое.
- Динамический контент: Рендерите страницы с большим количеством JavaScript, применяйте пользовательские стили и добавляйте заголовки, нижние колонтитулы и номера страниц.
- Производительность: Быстрее, чем альтернативы, такие как Selenium, для создания PDF.
- Масштабируемость: Подходит для генерации большого количества PDF-документов, даже для тысяч документов в день.
Почему это полезно:
Puppeteer идеально подходит для автоматизации рабочих процессов, создания отчётов или экспорта веб-контента. От бизнесов, создающих брендированные документы, до разработчиков, работающих с визуализацией данных, Puppeteer упрощает процесс и обеспечивает высокое качество результатов.
Если вы готовы начать, эта статья проведёт вас через настройку, кастомизацию и расширенные функции, такие как обработка больших отчётов и устранение распространённых проблем.
Базовая настройка PDF с помощью Puppeteer
Чтобы начать работу с Puppeteer для создания PDF-документов, необходимо правильно его настроить и понять основные параметры конфигурации. Вот краткое руководство, которое поможет вам начать.
Создание вашего первого PDF
Для генерации простого PDF-документа из веб-страницы создайте файл app.js со следующим кодом:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://www.freecodecamp.org/', {
waitUntil: 'networkidle0'
});
await page.pdf({
path: 'example.pdf',
format: 'Letter'
});
await browser.close();
})();
Этот скрипт описывает основной рабочий процесс: запуск браузера, открытие страницы, переход по URL, генерация PDF и закрытие браузера.
Настройки страницы и макета
Puppeteer позволяет настраивать различные параметры для создания PDF. Ниже приведены ключевые параметры, которые можно изменить:
| Параметр | Описание | Пример значения |
|---|---|---|
| Формат | Размер бумаги | 'Letter', 'A4', 'Legal' |
| Ширина | Пользовательская ширина | '8.5in', '215.9mm' |
| Высота | Пользовательская высота | '11in', '279.4mm' |
| Ориентация | Ориентация страницы | true/false |
| Поля | Поля страницы | { top: '1in', right: '1in', bottom: '1in', left: '1in' } |
При генерации PDF из веб-страниц используйте параметр waitUntil: 'networkidle0'. Это гарантирует, что вся сетевая активность завершена перед созданием PDF.
Для пользовательского HTML-контента вы можете создавать PDF-документы с использованием локальных файлов. Это особенно полезно для шаблонных документов или пакетной обработки. Обновите функцию page.goto() следующим образом:
await page.goto(`file://${absolutePath}`, {
waitUntil: 'networkidle0'
});
Поскольку Puppeteer использует движок рендеринга Chrome, любые CSS-стили или форматирование, поддерживаемые Chrome, будут точно отображаться в ваших PDF-документах. Для более сложных задач вы можете изучить расширенные методы форматирования для создания детализированных PDF-отчётов.
Опции форматирования PDF
Puppeteer предоставляет множество опций для настройки ваших PDF-документов. Ознакомьтесь с разделами ниже, чтобы узнать, как настроить заголовки, управлять макетом страницы и сохранять дизайн согласованным.
Заголовки и нижние колонтитулы
Вы можете добавить заголовки и нижние колонтитулы, изменив параметры PDF с помощью HTML-шаблонов. Вот пример:
await page.pdf({
displayHeaderFooter: true,
headerTemplate: `<div style="font-size: 10px; padding: 10px; width: 100%; text-align: center;">
<span class="title"></span> | Сгенерировано <span class="date"></span>
</div>`,
footerTemplate: `<div style="font-size: 10px; padding: 10px; width: 100%; text-align: center;">
Страница <span class="pageNumber"></span> из <span class="totalPages"></span>
</div>`,
margin: { top: '1.25in', bottom: '1in' }
});
Вот динамические классы, которые вы можете использовать:
- date: Добавляет текущую метку времени.
- title: Отображает заголовок документа.
- url: Показывает URL страницы.
- pageNumber: Вставляет номер текущей страницы.
- totalPages: Указывает общее количество страниц.
Управление разрывами страниц и макетом
Для управления разрывами страниц и обеспечения плавного потока контента используйте CSS-правила, такие как:
.no-break {
page-break-inside: avoid;
}
<!-- -->
.force-break {
page-break-after: always;
}
Вы также можете настроить параметры бумаги непосредственно в опциях PDF:
| Параметр | Опции | Пример |
|---|---|---|
| Формат | Letter, A4, Legal | format: 'Letter' |
| Размеры | Пользовательская ширина/высота | width: '8.5in', height: '11in' |
| Ориентация | Портрет/Ландшафт | landscape: true |
| Поля | Пользовательские отступы | margin: { top: '1in', bottom: '1in' } |
Шрифты и визуальные элементы
Настройте шрифты и визуальные элементы в соответствии с вашим брендингом:
- Пользовательские веб-шрифты:
@font-face {
font-family: 'CustomFont';
src: url('path/to/font.woff2') format('woff2');
}- Включение фоновых цветов и изображений:
await page.pdf({ printBackground: true });
body {
-webkit-print-color-adjust: exact;
<!-- --> background-color: #f5f5f5;
<!-- -->}- Настройка шрифтов для Linux или AWS Lambda:
export FONTCONFIG_FILE=/path/to/fonts.confЭти опции позволяют создавать профессионально выглядящие PDF-документы.
Создание сложных PDF-отчётов
Создание продвинутых PDF-отчётов требует внимания к деталям, особенно когда речь идёт о визуализации данных, дизайне макета и производительности. Улучшая базовые методы форматирования, вы можете создавать профессиональные документы, которые выделяются.
Таблицы и диаграммы данных
Улучшите свои отчёты с помощью динамической визуализации, объединив Puppeteer, D3.js и Handlebars. Вот пример настройки для интеграции диаграмм данных:
const template = Handlebars.compile(`
<div class="report-container">
{{> dataTable}}
<div id="chart"></div>
</div>
`);
// Конфигурация диаграммы D3.js
const chartConfig = {
container: '#chart',
data: salesData,
width: 800,
height: 400
};
Чтобы ваш PDF выглядел профессионально, настройте параметры вывода следующим образом:
await page.pdf({
printBackground: true,
format: 'Letter',
margin: {
top: '0.75in',
right: '0.5in',
bottom: '0.75in',
left: '0.5in'
}
<!-- -->});
"D3.js — это библиотека JavaScript для работы с документами на основе данных. D3 помогает оживить данные с помощью HTML, SVG и CSS."
После добавления визуализации организуйте отчёт с содержанием и номерами страниц.
Содержание и нумерация страниц
Следуйте этим шагам, чтобы добавить оглавление и обеспечить точную нумерацию страниц:
- Создание начального PDF: Создайте первую версию PDF с заголовками и нижними колонтитулами:
const mainPdf = await page.pdf({
format: 'Letter',
displayHeaderFooter: true
});- Извлечение номеров страниц: Извлеките номера страниц и динамически создайте оглавление:
const pageMapping = await extractPageNumbers(mainPdf);
const tocHtml = generateTocHtml(pageMapping);- Объединение финального документа: Объедините оглавление с основным документом:
const finalPdf = await mergePdfs([tocPdf, mainPdf]);Для больших документов потребуются дополнительные шаги для поддержания производительности.
Обработка больших отчётов
Эффективная обработка объёмных отчётов требует определённых оптимизаций. Вот несколько эффективных техник:
| Техника | Преимущество |
|---|---|
| Использование временных файлов | Снижает использование памяти на 20% |
| Ограничение ядер CPU | Ускоряет обработку, балансируя задачи |
Например, в апреле 2024 года компания Carriyo генерировала 10 000 PDF-документов ежедневно с 95-м процентилем задержки в 365 мс на AWS Lambda. Вот как можно применить обработку временных файлов:
// Оптимизация обработки файлов
const tempFile = await saveTempHtml(content);
await page.goto(`file://${tempFile}`, {
waitUntil: 'networkidle0',
timeout: 30000
});
"Используя временные файлы для обхода ограничений протокола, мы улучшили производительность и надёжность." — Данинду де Сильва
Если вы столкнулись с проблемами при навигации, убедитесь, что ошибки логируются, и перезагрузите страницу:
try {
await page.goto(url, {
waitUntil: 'networkidle0',
timeout: 30000
});
} catch (error) {
console.error('Ошибка навигации:', error);
await page.reload();
}
Эти методы гарантируют, что генерация больших отчётов остаётся надёжной и эффективной.
Распространённые проблемы и решения
Решение распространённых проблем — ключ к обеспечению бесперебойной работы ваших автоматизированных процессов генерации PDF. Следующие решения основаны на базовых настройках, рассмотренных ранее.
Совместимость с браузерами
В третьем квартале 2023 года команда разработчиков Acme Corp устранила ошибки "Не удалось запустить Chrome" на серверах Ubuntu, установив необходимые зависимости. Это снизило количество ошибок на 95% и сэкономило 10 часов в неделю на отладку.
Для проблем с запуском Chrome на Windows используйте следующую конфигурацию:
const browser = await puppeteer.launch({
ignoreDefaultArgs: ['--disable-extensions'],
args: ['--disable-features=HttpsFirstBalancedModeAutoEnable']
});Руководство по устранению ошибок
Вот как эффективно устранять распространённые ошибки:
| Тип ошибки | Решение | Эффект |
|---|---|---|
| Модуль не найден | Обновите Node.js до версии 14+ | Устраняет конфликты зависимостей |
| Тайм-аут навигации | Установите пользовательские тайм-ауты | Предотвращает преждевременные сбои скриптов |
| Проблемы с песочницей | Настройте разрешения | Обеспечивает безопасное выполнение |
Например, для обработки тайм-аутов навигации можно использовать следующую логику повторных попыток:
const navigateWithRetry = async (page, url) => {
try {
await page.goto(url, {
waitUntil: 'networkidle0',
timeout: 30000
});
} catch (error) {
console.error('Ошибка навигации:', error);
await page.reload();
}
<!-- -->};
После устранения ошибок можно сосредоточиться на улучшении скорости для повышения эффективности рабочих процессов.
Оптимизация скорости
После устранения ошибок следующим шагом является ускорение генерации PDF. Например, Carriyo генерирует 10 000 PDF-документов ежедневно с 95-м процентилем задержки в 365 мс на AWS Lambda.
Вот пример кода для оптимизации производительности путём локального обслуживания статических ресурсов:
await page.setRequestInterception(true);
page.on('request', request => {
if (request.resourceType() === 'font' || request.resourceType() === 'image') {
request.respond({
body: localFileContent,
headers: { 'Cache-Control': 'public, max-age=31536000' }
});
<!-- --> }
<!-- -->});
Для крупномасштабных операций рассмотрите следующие стратегии:
- Управление ресурсами: Держите экземпляры браузера "тёплыми" на серверных платформах, чтобы избежать холодных стартов, которые увеличивают задержку.
- Конфигурация системы: На 4-ядерной системе ограничьте одновременную генерацию PDF тремя процессами для повышения стабильности.
- Оптимизация сети: Используйте API перехвата сети Puppeteer для локального обслуживания статических ресурсов.
"Используя временные файлы для обхода ограничений протокола, мы улучшили производительность и надёжность." — Данинду де Сильва
Использование Puppeteer с Нодулем
Нодуль упрощает использование Puppeteer для генерации PDF, предлагая масштабируемый и экономически эффективный способ автоматизации рабочих процессов с документами.
Как работает Нодуль
Нодуль объединяет возможности Puppeteer для создания PDF с такими инструментами, как визуальный конструктор рабочих процессов, генерация кода с использованием ИИ и условная логика. Платформа также поддерживает широкий спектр NPM-пакетов. Нодуль использует кредитную систему на основе времени, что помогает эффективно управлять затратами на автоматизацию PDF.
Расширяя базовые функции Puppeteer, Нодуль упрощает сложные рабочие процессы с PDF с помощью удобного интерфейса, разработанного для масштабируемости.
Вот ключевые функции для автоматизации PDF:
- Интеграция с Headless-браузером
- Генерация пользовательского кода с помощью ИИ
- Визуальный конструктор рабочих процессов для настройки логики PDF
- Поддержка условных ветвлений в рабочих процессах
Настройка Puppeteer в Нодуле
Чтобы использовать Puppeteer для генерации PDF в Нодуле, выполните базовую настройку:
const puppeteer = require('puppeteer');
async function generatePDF(url) {
const browser = await puppeteer.launch({
headless: true,
args: ['--disable-dev-shm-usage']
});
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'networkidle0' });
const pdf = await page.pdf({ format: 'A4' });
await browser.close();
return pdf;
}
Для безопасной генерации документов храните конфиденциальную информацию, такую как учётные данные, в переменных окружения:
await page.type('#email', process.env.PDF_USER);
await page.type('#password', process.env.PDF_PASSWORD);
Эта настройка обеспечивает безопасный и эффективный рабочий процесс для генерации PDF.
Сравнение платформ автоматизации
При выборе платформы для автоматизации PDF вот как Нодуль сравнивается с традиционными инструментами:
| Функция | Нодуль | Традиционные инструменты автоматизации |
|---|---|---|
| Модель ценообразования | Кредиты на основе времени, начиная с $5/месяц | Лицензирование на документ или пользователя |
| Ограничения рабочих процессов | 20–неограниченно | Часто ограничено количеством одновременных выполнений |
| Поддержка NPM-пакетов | Более 1 миллиона пакетов | Обычно ограничено платформенными модулями |
| История выполнения | Хранение от 1 до 60 дней | Часто ограничено базовым логированием |
Для корпоративного использования премиум-план Нодуля ($297/месяц) поддерживает до 1,5 миллионов запусков сценариев и хранит историю выполнения до 60 дней. Это делает его отличным выбором для бизнесов с высокими потребностями в генерации PDF.
Платформа также упрощает задачи, такие как изменение стилей страницы перед созданием PDF. Например, вы можете скрыть определённые элементы с помощью этого фрагмента кода:
await page.addStyleTag({
content: '.nav { display: none } .navbar { border: 0px } #print-button { display: none }'
});
Эта гибкость помогает упростить даже самые сложные рабочие процессы с PDF.
Заключение
Основные моменты
Puppeteer — это мощный инструмент для генерации PDF, будь то простые документы или сложные отчёты. Его способность работать с современными веб-технологиями и предоставлять точный контроль над выводом PDF делает его отличным выбором для крупномасштабных задач.
Например, в апреле 2024 года Carriyo успешно использовала Puppeteer для генерации 10 000 PDF-документов ежедневно для этикеток доставки на AWS Lambda. Они достигли 95-го процентиля задержки в 365 мс при стоимости $7,68 за 430 000 вызовов.
Вот ключевые функции и их практические преимущества:
| Функция | Преимущество | Реальное применение |
|---|---|---|
| Headless-браузер | Позволяет рендерить на стороне сервера с современными веб-возможностями | Обрабатывает динамический контент, JavaScript и CSS с точностью |
| Оптимизация ресурсов | Кэширует ресурсы и отключает неиспользуемые функции для повышения производительности | Улучшает эффективность при генерации PDF |
| Обработка ошибок | Включает механизмы повторных попыток и контроль тайм-аутов | Обеспечивает надёжность в производственных средах |
| Масштабируемость | Поддерживает генерацию большого объёма PDF | Доказанная производительность при высоких нагрузках |
Советы для начала работы
Чтобы максимально эффективно использовать Puppeteer, рассмотрите следующие шаги для успешного внедрения:
- Оптимизация производительности: Используйте настройку
userDataDirдля кэширования ресурсов и отключения неиспользуемых функций, чтобы ускорить генерацию PDF. - Управление ресурсами: Генерируйте PDF на стороне сервера, чтобы снизить нагрузку на клиентские устройства, особенно для задач с большим объёмом.
- Обработка ошибок: Реализуйте надёжные стратегии обработки ошибок с тайм-аутами и механизмами повторных попыток для стабильности в производственных средах.
Для ещё более плавного опыта вы можете интегрировать Puppeteer с платформами, такими как Нодуль, чтобы упростить рабочие процессы, сохраняя при этом высокую производительность.