WeasyPrint

Kozea, сопровождает CourtBouillon · лицензия BSD-3-Clause

Делает PDF из HTML и CSS: счёт, КП или отчёт на листах A4 с номерами страниц, повтором шапки таблицы и вложенными файлами.

macOS · Windows · LinuxНа компьютере, на сервере и в контейнереБесплатно, BSD-3-Clause

✓ Проверено 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
Исходный код
github.com/Kozea/WeasyPrint
Лицензия
BSD-3-Clause
Версия
70.0 на 13.10.2026
Системы
macOS · Windows · Linux
Где работает
На компьютере, на сервере и в контейнере
Цена
Бесплатно
Проверка
Проверено 13.10

Установить агентом

Для Claude Code, Codex, Hermes и любого агента с терминалом
Установи программу «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 долларов, по странице покупки.

Бесплатные замены

  • Typst - Делает PDF из своей разметки. Шаблон пишут на языке Typst, HTML и CSS он не читает.
  • Pandoc - Переводит Markdown и другие форматы в PDF. Для этого ему нужен отдельный движок, по руководству Pandoc для HTML по умолчанию он зовёт weasyprint.

О чём помнить

  • Безопасность. Агент запускает 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
Объём
Установили и прогнали задачу на тестовых данных
Что именно сделали
  1. Одноразовый контейнер Ubuntu 24.04 без данных и ключей. Библиотеки поставили командой apt из документации для Ubuntu 20.04 и новее, поставился один пакет libharfbuzz-subset0, остальное в контейнере уже было.
  2. Создали отдельное окружение Python и поставили программу командой pip install weasyprint==70.0 за 16 секунд. weasyprint --version вывел «WeasyPrint version 70.0». Окружение заняло 81 971 851 байт.
  3. Скрипт прогона сам сделал тестовый счёт: invoice.json на 60 позиций, шаблон HTML, стили с листом A4, номером страницы и повтором шапки таблицы, картинку logo.png.
  4. Собрали invoice.pdf за 2,7 секунды. В нём две страницы, шапка таблицы на обеих, внизу «страница 1 из 2» и «2 из 2», итог 834000 совпал с суммой из JSON. Картинка и шрифты DejaVu встроены.
  5. Собрали файл с ключом --pdf-variant pdf/a-3b и вложенным invoice.json, в его метаданных стоит PDF/A-3B. Вложение извлекли командой pdfdetach, оно совпало с исходным файлом. Соответствие PDF/A сторонней программой не сверяли.
  6. С ключом --allowed-protocols file картинка по адресу https не скачалась, программа вывела ошибку, PDF собрала без неё, netwatch соединений не записал. Во время основной сборки соединений тоже не было.
  7. Отдельным прогоном сделали страницу, которая прикладывает к PDF тестовый файл с диска. Без ограничений файл оказался внутри PDF. С ключом --allowed-protocols https программа вывела ошибку, собрала PDF без вложений, текст страницы на месте.
  8. На несуществующем файле программа вернула код 1 и PDF не создала. Исходные файлы после работы не изменились по sha256. Каждый результат скрипт сверил сам и только после этого напечатал TASK_OK.
  9. Удалили окружение с программой и проверили, что команда weasyprint больше не находится. Контейнер после прогона удалён вместе со всеми тестовыми файлами.
ДатаВерсияОбъёмГдеИтог
13.10.202670.0задачаконтейнер, Linuxполучилось
13.10.202670.0задачаконтейнер, Linuxполучилось
13.10.202670.0задачаконтейнер, Linuxполучилось

«Проверено» ставим, только когда сами поставили программу и прогнали её на задаче. Сверка ссылок и вывод версии так не называются.

Похожие программы

Программу делают её авторы. Мы сверяем официальные источники и описываем, что ей нужно, но код остаётся чужим. Перед установкой посмотри план агента: что он поставит и что поменяет в системе.