WeasyPrint
Kozea, сопровождает CourtBouillon · лицензия BSD-3-Clause
Делает PDF из HTML и CSS: счёт, КП или отчёт на листах A4 с номерами страниц, повтором шапки таблицы и вложенными файлами.
✓ Проверено 13.10.2026: Ubuntu 24.04 (x86_64) в одноразовом контейнере Docker на сервере, от root: Python 3.12.3 из образа, библиотеки Pango 1.52.1 из apt, WeasyPrint 70.0 из PyPI в отдельном окружении, poppler-utils из apt для проверки PDF. Что именно проверяли
Какую задачу решает
Делает PDF из страницы HTML и стилей CSS. Счёт, коммерческое предложение или отчёт верстают как веб-страницу, а программа раскладывает её по листам A4 с полями, номерами страниц и повтором шапки таблицы.
- Собирает PDF из файла HTML или из адреса страницы, свой файл стилей можно добавить ключом -s.
- Длинную таблицу переносит на следующие листы и повторяет на каждом её шапку. Номер страницы и общее число страниц ставит в поле листа через правило CSS @page.
- Встраивает в PDF шрифты, которыми набран текст. В нашем прогоне DejaVu встроился частью, с нужными буквами.
- Прикладывает к PDF файлы ключом -a, например исходные данные счёта в JSON. Ключ --pdf-variant по справке собирает PDF/A и PDF/UA. Мы собрали файл с --pdf-variant pdf/a-3b, соответствие стандарту сторонней программой не сверяли.
- Ключ --allowed-protocols задаёт, по каким протоколам программа берёт картинки, стили и вложения, на которые ссылается страница. Сам файл HTML, переданный на вход, она читает всегда. В нашем прогоне ключ со значением file остановил картинку по https. Со значением https в PDF не попали картинка и вложения по file://.
Пример результата
Говоришь агенту
В папке invoice лежат invoice.html, style.css, logo.png и invoice.json со счётом на 60 позиций. Собери invoice.pdf на A4 с номерами страниц и повтором шапки таблицы, потом вариант с ключом --pdf-variant pdf/a-3b и вложенным invoice.json. Проверь, что итог в PDF совпал с суммой из JSON.
Что получится
Появятся invoice.pdf и invoice-pdfa.pdf. Мы прогнали этот сценарий на тестовом счёте: PDF вышел на две страницы, шапка таблицы есть на обеих, внизу листа стоит «страница 1 из 2» и «2 из 2», итог 834000 совпал с суммой из JSON. Из файла с ключом pdf/a-3b вложенный invoice.json извлёкся без изменений, исходные файлы после сборки остались прежними. Соответствие PDF/A сторонней программой мы не сверяли.
Паспорт
- Кто делает
- Kozea, сопровождает CourtBouillon
- Сайт
- weasyprint.org
- Исходный код
- github.com/Kozea/WeasyPrint
- Лицензия
- BSD-3-Clause
- Версия
- 70.0 на 13.10.2026
- Системы
- macOS · Windows · Linux
- Где работает
- На компьютере, на сервере и в контейнере
- Цена
- Бесплатно
- Проверка
- Проверено 13.10
Установить агентом
Установи программу «WeasyPrint». Работай по шагам и после каждого коротко говори, что сделал.
Что это за программа (каталог smyslokod.ru, официальные источники сверены 13.10.2026):
- официальный сайт: https://weasyprint.org/
- исходный код: https://github.com/Kozea/WeasyPrint
- инструкция по установке: https://doc.courtbouillon.org/weasyprint/stable/first_steps.html
- актуальная версия на 13.10.2026: 70.0
- лицензия: BSD-3-Clause
- для работы нужно (обязательно): Pango 1.44 или новее - программа рисует им текст. Формула Homebrew ставит его сама, для pip на Linux библиотеки ставят командой apt из документации, для готового файла Windows документация отдельной установки не требует
- для работы нужно (в отдельных случаях): Python 3.10 или новее - нужен, если ставить через pip. Homebrew ставит Python сам, готовому файлу для Windows он не нужен
- для работы нужно (очень желательно): Шрифты с нужными буквами - по документации без подходящего шрифта вместо букв в PDF выходят квадраты. В нашем контейнере кириллицу дал DejaVu
Правила:
1. Ничего не устанавливай и не меняй, пока я не скажу «да» на твой план.
2. Ставь только способами из этого промпта. Сторонние сборки, скрипты с форумов и из чужих репозиториев не бери.
3. Мои проекты не трогай: не меняй их файлы, виртуальные окружения и списки зависимостей (package.json, requirements.txt, pyproject.toml).
4. Если ставишь из PyPI (пакет weasyprint), то только в отдельное окружение: uv tool install или pipx. В окружение проекта и в системный Python не ставь.
5. Команды с sudo, правку профиля оболочки (~/.zshrc, ~/.bashrc) и переменной PATH делай только после моего отдельного «да» на каждую.
6. Не проси у меня пароли и ключи и не выводи их. Если нужен пароль администратора, дай команду, я выполню её сам.
7. Ставь программу через pip только в отдельное окружение ~/.local/share/weasyprint-venv, в окружение проекта и в Python самой системы не ставь. sudo apt для библиотек Pango - отдельным «да».
8. Чужой HTML собирай с ключом --allowed-protocols https, с ограничением времени и проверь вложения в готовом PDF командой pdfdetach -list. Мой шаблон собирай как есть.
9. PDF сохраняй под новым именем, чтобы не затереть готовый файл, и проверь число страниц и текст в нём.
Шаги:
0. Определи, где ты работаешь: мой компьютер, сервер или контейнер. Какая система и процессор, какие менеджеры пакетов есть (Homebrew, apt, winget, uv, pipx). Ставить нужно туда, где ты сам запускаешь команды.
- на компьютере: работает без окна и без браузера, PDF появляется в папке.
- на сервере: подходит для сборки счетов и отчётов на сервере. Для чужих HTML и CSS документация советует запускать программу от отдельного пользователя с ограничением памяти и времени.
- в контейнере: мы проверяли в контейнере Ubuntu 24.04 от root. Шрифты нужны внутри контейнера, у нас были DejaVu.
1. Проверь, не стоит ли программа уже: weasyprint --version ; which -a weasyprint ; ~/.local/share/weasyprint-venv/bin/weasyprint --version. Если стоит и запускается, ничего не ставь и переходи к шагу 5.
2. Проверь, что есть всё нужное для работы: Pango 1.44 или новее, Шрифты с нужными буквами. Чего нет, внеси в план отдельным пунктом. Проверь свободное место на диске: нужно В нашем прогоне отдельное окружение Python с программой и зависимостями заняло 81 971 851 байт (около 78 МиБ). Из apt поставился один пакет libharfbuzz-subset0 на 1112 kB, остальные библиотеки Pango в нашем контейнере уже были. Архив для Windows весит 31 510 667 байт. Сколько займёт установка через Homebrew, мы не мерили..
3. Составь план: каким одним способом из списка ниже будешь ставить, что появится на диске и сколько места займёт, что поменяется в системе и как потом удалить. Покажи план и жди моего «да».
Способы из официальных источников:
- macOS, Homebrew: brew install weasyprint (так советует документация, формула на 13.10.2026 ставит 70.0. Не проверяли)
- Windows, готовый файл с GitHub: Invoke-WebRequest -Uri https://github.com/Kozea/WeasyPrint/releases/download/v70.0/weasyprint-windows-onefile.zip -OutFile weasyprint.zip; Expand-Archive weasyprint.zip -DestinationPath $env:LOCALAPPDATA\weasyprint (архив 31 510 667 байт, sha256 1f62721d818f963c3eb82e92ba0851e31d0fc0550224e5eb4c073cb295bc4f3d, сверь его командой Get-FileHash weasyprint.zip до распаковки. Внутри onefile\weasyprint.exe. Мы скачали архив и сверили сумму, на Windows не запускали)
- Linux, pip в отдельном окружении: python3 -m venv ~/.local/share/weasyprint-venv && ~/.local/share/weasyprint-venv/bin/pip install weasyprint==70.0 (до этого библиотеки по документации: sudo apt install python3-pip python3-venv libpango-1.0-0 libharfbuzz0b libpangoft2-1.0-0 libharfbuzz-subset0 (python3-venv мы добавили для venv). В прогоне окружение лежало в /opt/weasyprint-venv, pip ставил с ключом --no-cache-dir и справился за 16 секунд. Окружение не добавляет команду в PATH: запускай ~/.local/share/weasyprint-venv/bin/weasyprint полным путём или добавь эту папку в PATH на время работы)
4. Установи по согласованному плану. Если что-то идёт не так, как в плане, остановись и спроси.
5. Проверь результат:
- weasyprint --version: программа запускается без ошибки;
- Сделай invoice.json со счётом на 60 позиций, шаблон invoice.html, style.css с @page A4, номером страницы и повтором шапки таблицы, картинку logo.png. Собери invoice.pdf и проверь число страниц, итог, номера страниц, шапку на каждой странице, картинку и встроенные шрифты. Потом сделай из того же шаблона файл с ключом --pdf-variant pdf/a-3b и вложенным invoice.json и извлеки вложение. Проверь, что с --allowed-protocols file картинка по https не скачивается. Отдельно сделай страницу с вложением файла с диска и убедись, что с --allowed-protocols https он в PDF не попал. Сверь контрольные суммы исходных файлов до и после. Делай это во временной папке и не трогай мои файлы.
export PATH=/opt/weasyprint-venv/bin:$PATH
weasyprint --version
cd invoice
weasyprint invoice.html invoice.pdf
pdfinfo invoice.pdf
pdftotext -layout invoice.pdf invoice.txt
pdfimages -list invoice.pdf
pdffonts invoice.pdf
weasyprint --pdf-variant pdf/a-3b -a invoice.json invoice.html invoice-pdfa.pdf
pdfdetach -saveall -o detached invoice-pdfa.pdf
weasyprint -v --allowed-protocols file remote.html remote.pdf
weasyprint missing.html missing.pdf
weasyprint untrusted.html open.pdf
weasyprint -v --allowed-protocols https untrusted.html safe.pdf
pdfdetach -list safe.pdf
- если ты работаешь в папке моего проекта, покажи git status: от установки в проекте не должно появиться изменений.
6. Итог одним сообщением: что установлено, какой версии и куда, сколько места заняло, что поменялось в системе и как всё удалить (macOS, Homebrew: brew uninstall weasyprint; Windows, готовый файл с GitHub: Remove-Item -Recurse -Force $env:LOCALAPPDATA\weasyprint; Linux, pip в отдельном окружении: rm -rf ~/.local/share/weasyprint-venv).
Если на любом шаге ошибка, не чини наугад: покажи текст ошибки и скажи, что, по-твоему, случилось. Частые проблемы: https://smyslokod.ru/cli/weasyprint#problemyПромпт собран из официальных инструкций, сверенных 13.10.2026. Агент сначала проверит, что уже стоит, покажет план с местом на диске и способом удаления и без твоего «да» ничего не поставит.
Как ставят вручную
Способы из официальных источников, у каждого ссылка на первоисточник.
macOS · Homebrew · источник
brew install weasyprint
так советует документация, формула на 13.10.2026 ставит 70.0. Не проверяли
Windows · готовый файл с GitHub · источник
Invoke-WebRequest -Uri https://github.com/Kozea/WeasyPrint/releases/download/v70.0/weasyprint-windows-onefile.zip -OutFile weasyprint.zip; Expand-Archive weasyprint.zip -DestinationPath $env:LOCALAPPDATA\weasyprint
архив 31 510 667 байт, sha256 1f62721d818f963c3eb82e92ba0851e31d0fc0550224e5eb4c073cb295bc4f3d, сверь его командой Get-FileHash weasyprint.zip до распаковки. Внутри onefile\weasyprint.exe. Мы скачали архив и сверили сумму, на Windows не запускали
Linux · pip в отдельном окружении · источник
python3 -m venv ~/.local/share/weasyprint-venv && ~/.local/share/weasyprint-venv/bin/pip install weasyprint==70.0
до этого библиотеки по документации: sudo apt install python3-pip python3-venv libpango-1.0-0 libharfbuzz0b libpangoft2-1.0-0 libharfbuzz-subset0 (python3-venv мы добавили для venv). В прогоне окружение лежало в /opt/weasyprint-venv, pip ставил с ключом --no-cache-dir и справился за 16 секунд. Окружение не добавляет команду в PATH: запускай ~/.local/share/weasyprint-venv/bin/weasyprint полным путём или добавь эту папку в PATH на время работы
Как удалить
- macOS, Homebrew:
brew uninstall weasyprint - Windows, готовый файл с GitHub:
Remove-Item -Recurse -Force $env:LOCALAPPDATA\weasyprint - Linux, pip в отдельном окружении:
rm -rf ~/.local/share/weasyprint-venv
Что нужно для работы
- Pango 1.44 или новее (обязательно) - программа рисует им текст. Формула Homebrew ставит его сама, для pip на Linux библиотеки ставят командой apt из документации, для готового файла Windows документация отдельной установки не требует
- Python 3.10 или новее (в отдельных случаях) - нужен, если ставить через pip. Homebrew ставит Python сам, готовому файлу для Windows он не нужен
- Шрифты с нужными буквами (очень желательно) - по документации без подходящего шрифта вместо букв в PDF выходят квадраты. В нашем контейнере кириллицу дал DejaVu
Системы
- macOS - документация советует Homebrew, формула ставит Pango и Python сама. На Mac мы не проверяли.
- Windows - готовый файл weasyprint.exe со страницы выпуска на GitHub, Python для него не нужен. По документации антивирусы иногда ошибочно считают его вредоносным. На Windows мы не проверяли.
- Linux - мы проверяли на Ubuntu 24.04: библиотеки Pango из apt и программа через pip в отдельном окружении, как в документации.
Где запускать
Ставить нужно туда, где работает агент: на твой компьютер, сервер или в контейнер.
- На компьютере - работает без окна и без браузера, PDF появляется в папке.
- На сервере - подходит для сборки счетов и отчётов на сервере. Для чужих HTML и CSS документация советует запускать программу от отдельного пользователя с ограничением памяти и времени.
- В контейнере - мы проверяли в контейнере Ubuntu 24.04 от root. Шрифты нужны внутри контейнера, у нас были DejaVu.
Сколько ресурсов нужно
- Место на диске
- В нашем прогоне отдельное окружение Python с программой и зависимостями заняло 81 971 851 байт (около 78 МиБ). Из apt поставился один пакет libharfbuzz-subset0 на 1112 kB, остальные библиотеки Pango в нашем контейнере уже были. Архив для Windows весит 31 510 667 байт. Сколько займёт установка через Homebrew, мы не мерили.
- Память
- Память мы не мерили. По документации длинные или специально составленные документы могут занять много памяти и времени.
- Видеокарта
- В нашем прогоне видеокарта не понадобилась.
- Сеть
- Для установки нужна сеть: apt ходил к archive.ubuntu.com и security.ubuntu.com, а также к deb.nodesource.com, этот источник Node.js прописан в образе песочницы. pip качал с pypi.org и files.pythonhosted.org. Внутри контейнера netwatch записал его DNS 127.0.0.11. Во время сборки PDF из локальных файлов netwatch соединений не записал. Если в HTML или CSS есть адреса https, программа их скачивает, по документации с ожиданием 10 секунд на ресурс.
Счёт на 60 позиций и две страницы собрался за 2,7 секунды вместе с запуском программы.
Лицензия и платные замены
Лицензия BSD-3-Clause. Свободная лицензия, текст лежит в репозитории и в архиве выпуска. Текст лицензии
Цена: Бесплатно. Программа бесплатная, лицензия BSD-3-Clause. Платную поддержку даёт CourtBouillon.
Платные замены
- Prince - Коммерческая программа YesLogic, тоже делает PDF из HTML и CSS. Лицензия на один компьютер стоит 495 долларов, серверная 3800 долларов, по странице покупки.
Бесплатные замены
О чём помнить
- Безопасность. Агент запускает weasyprint в терминале сам (exec). Программа читает файл HTML, стили и всё, на что они ссылаются: картинки, шрифты, вложения с диска по file:// и по относительным путям (read). По адресам https, http и ftp она сама скачивает ресурсы. PDF пишет с правами пользователя по пути, который задали вторым аргументом (write). Ключ -c создаёт папку кэша, после сборки удаляет из неё только свои файлы, а пустую папку убирает. Входа в аккаунты и ключей программа не просит.
- Чужой HTML опасен для твоих файлов: по документации через file:// и вложения (<link rel=attachment>, <a rel=attachment>) в PDF может попасть любой файл, который может прочитать пользователь. Мы это повторили: тестовая страница с <link rel=attachment> на файл с диска дала PDF с этим файлом внутри. С ключом --allowed-protocols https вложений не осталось, программа вывела ошибку и собрала PDF без них. Чужие страницы собирай с этим ключом или в контейнере, где нет твоих файлов, и проверяй список вложений командой pdfdetach -list.
- По документации специально составленные HTML и CSS могут собираться бесконечно, занять много памяти или дать огромный PDF. Для чужих страниц ставь ограничение времени, например timeout 60 перед командой.
- Пакет weasyprint в репозитории Ubuntu 24.04 версии 61.1, в нём нет исправлений безопасности 70.0. Документация в таком случае предлагает pip в отдельном окружении.
- Если вместо букв в PDF квадраты, в системе нет шрифта с этими буквами. Поставь шрифт обычным способом или подключи его в CSS через @font-face.
Частые проблемы
FileNotFoundError: [Errno 2] No such file or directory: 'missing.html'
Нет файла HTML по указанному пути. В прогоне программа вернула код 1 и PDF не создала. Проверь путь и запусти из папки с файлом или передай полный путь.
ERROR: Failed to load image at ... ValueError: URI uses disallowed protocol
Картинка лежит по адресу https, а ключ --allowed-protocols этот протокол не разрешает. В прогоне PDF собрался без картинки, код 0. Положи картинку рядом с HTML и сошлись на неё относительным путём или добавь https в список протоколов, если страница твоя.
В PDF квадраты вместо букв или пустые места
По документации в системе нет шрифта с нужными буквами. Поставь шрифт с кириллицей (например, DejaVu) или подключи файл шрифта через @font-face.
Проверка
✓ Проверено 13.10.2026: Ubuntu 24.04 (x86_64) в одноразовом контейнере Docker на сервере, от root: Python 3.12.3 из образа, библиотеки Pango 1.52.1 из apt, WeasyPrint 70.0 из PyPI в отдельном окружении, poppler-utils из apt для проверки PDF.
- Когда
- 13.10.2026
- Среда
- Ubuntu 24.04 (x86_64) в одноразовом контейнере Docker на сервере, от root: Python 3.12.3 из образа, библиотеки Pango 1.52.1 из apt, WeasyPrint 70.0 из PyPI в отдельном окружении, poppler-utils из apt для проверки PDF
- Объём
- Установили и прогнали задачу на тестовых данных
- Что именно сделали
- Одноразовый контейнер Ubuntu 24.04 без данных и ключей. Библиотеки поставили командой apt из документации для Ubuntu 20.04 и новее, поставился один пакет libharfbuzz-subset0, остальное в контейнере уже было.
- Создали отдельное окружение Python и поставили программу командой pip install weasyprint==70.0 за 16 секунд. weasyprint --version вывел «WeasyPrint version 70.0». Окружение заняло 81 971 851 байт.
- Скрипт прогона сам сделал тестовый счёт: invoice.json на 60 позиций, шаблон HTML, стили с листом A4, номером страницы и повтором шапки таблицы, картинку logo.png.
- Собрали invoice.pdf за 2,7 секунды. В нём две страницы, шапка таблицы на обеих, внизу «страница 1 из 2» и «2 из 2», итог 834000 совпал с суммой из JSON. Картинка и шрифты DejaVu встроены.
- Собрали файл с ключом --pdf-variant pdf/a-3b и вложенным invoice.json, в его метаданных стоит PDF/A-3B. Вложение извлекли командой pdfdetach, оно совпало с исходным файлом. Соответствие PDF/A сторонней программой не сверяли.
- С ключом --allowed-protocols file картинка по адресу https не скачалась, программа вывела ошибку, PDF собрала без неё, netwatch соединений не записал. Во время основной сборки соединений тоже не было.
- Отдельным прогоном сделали страницу, которая прикладывает к PDF тестовый файл с диска. Без ограничений файл оказался внутри PDF. С ключом --allowed-protocols https программа вывела ошибку, собрала PDF без вложений, текст страницы на месте.
- На несуществующем файле программа вернула код 1 и PDF не создала. Исходные файлы после работы не изменились по sha256. Каждый результат скрипт сверил сам и только после этого напечатал TASK_OK.
- Удалили окружение с программой и проверили, что команда weasyprint больше не находится. Контейнер после прогона удалён вместе со всеми тестовыми файлами.
| Дата | Версия | Объём | Где | Итог |
|---|---|---|---|---|
| 13.10.2026 | 70.0 | задача | контейнер, Linux | получилось |
| 13.10.2026 | 70.0 | задача | контейнер, Linux | получилось |
| 13.10.2026 | 70.0 | задача | контейнер, Linux | получилось |
«Проверено» ставим, только когда сами поставили программу и прогнали её на задаче. Сверка ссылок и вывод версии так не называются.
Похожие программы
- TypstСобирает PDF из текстовой разметки: счёт, КП, отчёт. Данные берёт из JSON или CSV и сама считает итоги по формулам шаблона.
- PandocПереводит документы из формата в формат: Markdown в Word и PDF, Word в Markdown. Агенту нужен, чтобы отдавать результат так, как его ждут люди.
- LibreOfficeПереводит Word, Excel и PowerPoint в PDF, CSV в Excel, Markdown в Word - без окон, одной командой. Агенту нужен, чтобы отдать договор, счёт или таблицу людям в PDF.
- qpdfСклеивает и режет PDF, поворачивает страницы, ставит и снимает пароль. Содержимое страниц сохраняет, текст и картинки остаются в файле.
Программу делают её авторы. Мы сверяем официальные источники и описываем, что ей нужно, но код остаётся чужим. Перед установкой посмотри план агента: что он поставит и что поменяет в системе.