Как превратить HTML и XML в качественный PDF-документ

Иван Корнев·26.05.2026·5 мин

Для быстрой конвертации HTML в PDF достаточно функции «Печать» в браузере или сохранения страницы через Ctrl+P. Для XML требуется предварительная трансформация в HTML или XSL-FO с помощью XSLT-шаблонов. Выбор инструмента зависит от цели: для разовой печати подойдет браузер, для автоматизации — wkhtmltopdf или WeasyPrint, а для сложных отчетов из XML и типографской верстки — PrinceXML или Apache FOP.

PDF остается стандартом для фиксации макета документа. Однако путь к идеальному файлу различается для веб-страниц (HTML) и структурированных данных (XML). Ниже разобраны рабочие методы, инструменты и подводные камни для обоих сценариев.

Ключевое отличие: HTML уже содержит информацию о внешнем виде (CSS), поэтому его можно рендерить напрямую. XML хранит только данные и семантику, поэтому без шаблона преобразования (XSLT) он не может быть превращен в визуальный документ.

Конвертация HTML в PDF: от браузера до сервера

HTML-документы легко переносятся в PDF, так как браузеры изначально умеют их отображать. Главная задача здесь — сохранить верстку при переходе от экрана к листу бумаги.

1. Браузерная печать (Самый быстрый способ)

Подходит для разовых задач, сохранения статей или билетов.

  • Как сделать: Откройте страницу → Нажмите Ctrl+P (Windows/Linux) или Cmd+P (macOS) → Выберите «Сохранить как PDF».
  • Плюсы: Не нужно устанавливать ПО, видно результат сразу.
  • Минусы: Нельзя автоматизировать, качество зависит от движка браузера, часто теряются фоновые изображения.

2. Специализированные библиотеки и утилиты

Используются для массовой генерации документов (счета, акты, сертификаты).

  • wkhtmltopdf: Классическое решение на базе движка WebKit. Принимает HTML/CSS и отдает PDF.
    • Нюанс: Проект перешел в режим поддержки, но все еще широко используется. Требует установки X-сервера на Linux-серверах без графического интерфейса.
  • WeasyPrint: Современная альтернатива для Python-разработчиков. Отлично поддерживает современные стандарты CSS для печати (@media print).
    • Плюс: Легковесный, не требует тяжелого браузера в фоне.
  • PrinceXML: Коммерческий лидер качества. Идеально обрабатывает сложную типографику, разрывы страниц, оглавления и сноски.
    • Применение: Книги, техническая документация, юридические документы.

При верстке HTML под PDF обязательно используйте медиа-запрос @media print. Скрывайте навигацию, рекламные блоки и кнопки, а также задавайте явные размеры полей (margin) и разрывы страниц (page-break-inside: avoid для таблиц).

Конвертация XML в PDF: работа со структурированными данными

XML не имеет визуального представления. Чтобы получить PDF, нужно описать правило превращения данных в макет. Существует два основных подхода.

Подход А: XML → HTML → PDF

Самый понятный для веб-разработчиков путь.

  1. Пишется XSLT-шаблон, который превращает XML-данные в HTML-разметку.
  2. Полученный HTML обрабатывается любым конвертером из раздела выше (wkhtmltopdf, WeasyPrint, Puppeteer).

Когда использовать: Если вам нужна гибкость CSS и вы уже знаете HTML-верстку.

Подход Б: XML → XSL-FO → PDF (Профессиональный стандарт)

XSL-FO (Extensible Stylesheet Language Formatting Objects) — это язык разметки, созданный специально для печати.

  1. XSLT трансформирует XML в XSL-FO.
  2. Процессор (например, Apache FOP или RenderX XEP) компилирует FO-файл в PDF.

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

  • Точный контроль над каждой строкой и пикселем.
  • Нативная поддержка повторяющихся колонтитулов, нумерации страниц, сложных таблиц.
  • Независимость от браузерных движков и их капризов.

XSL-FO имеет высокий порог входа. Верстка на FO-языке сложнее, чем на CSS. Используйте этот метод только если требования к точности документа критически важны (банковские выписки, государственные реестры).

Сравнение инструментов: что выбрать?

Выбор зависит от объема задач и требований к качеству.

ИнструментВходной форматСложность настройкиКачество печатиДля чего лучше всего
Браузер (Chrome/Firefox)HTMLНизкаяСреднееРазовые сохранения, черновики
wkhtmltopdfHTML/CSSСредняяХорошееМассовая генерация простых документов
WeasyPrintHTML/CSSСредняяОчень хорошееОтчеты, инвойсы на Python/Django
Puppeteer / PlaywrightHTML/JSВысокаяОтличноеСтраницы с динамическим JS-контентом
Apache FOPXSL-FOВысокаяПрофессиональноеКорпоративные отчеты из XML, архивы
PrinceXMLHTML/CSSСредняяТипографскоеКниги, сложная верстка, премиум-документы

Стратегия для архивирования документов

Если PDF создается для долгосрочного хранения (архив бухгалтерии, медицинские карты, юридические акты), требования меняются. Здесь важна не красота, а воспроизводимость и самодостаточность.

  1. Встраивание шрифтов: Убедитесь, что все шрифты внедрены в PDF-файл. Если через 5 лет у вас не окажется шрифта Roboto, документ может «поехать» или стать нечитаемым.
  2. Отказ от внешних зависимостей: Изображения и стили должны быть внутри файла или ссылаться на надежные внутренние ресурсы, а не на внешние CDN, которые могут исчезнуть.
  3. Хранение исходников: Для архива мало хранить только PDF. Сохраняйте связку: Исходный XML/HTML + Шаблон преобразования (XSLT/CSS) + Версия конвертера. Это позволит перегенерировать документ в случае повреждения файла или смены стандартов.
  4. Стандарт PDF/A: Для официального архивирования используйте стандарт PDF/A (Archive). Большинство серьезных конвертеров (Prince, FOP, платные версии онлайн-сервисов) поддерживают экспорт в этот формат, который запрещает использование шифрования и внешних зависимостей.

PDF/A — это ISO-стандарт для долгосрочного хранения электронных документов. Он гарантирует, что файл можно будет открыть и прочитать через десятилетия независимо от развития технологий.

Частые ошибки при конвертации

  1. «Слепая» конвертация XML: Попытка скормить XML-файл конвертеру HTML без предварительной трансформации. Результат будет либо пустым, либо содержать только текстовые данные без тегов.
  2. Игнорирование разрывов страниц: Таблицы и блоки текста разрываются посередине строки.
    • Решение: Используйте CSS-свойство page-break-inside: avoid; для важных блоков.
  3. Проблемы с кодировкой: Кириллица превращается в «кракозябры».
    • Решение: Убедитесь, что исходный файл сохранен в UTF-8, и шрифты поддерживают кириллицу.
  4. Зависимость от JavaScript: Использование конвертеров, которые не исполняют JS (например, старые версии wkhtmltopdf), для страниц, где контент подгружается динамически.
    • Решение: Используйте headless-браузеры (Puppeteer, Playwright) для таких случаев.

FAQ

Можно ли конвертировать XML в PDF без программирования? Да, если использовать онлайн-конвертеры, которые поддерживают XSLT. Вы загружаете XML и XSL-шаблон, сервис возвращает PDF. Однако для регулярных задач это небезопасно и неудобно.

Что лучше для счета-фактуры: HTML или XSL-FO? Для счетов-фактур, где важна строгая сетка и соответствие законодательным формам, часто предпочитают XSL-FO (через Apache FOP). Если форма более свободная, проще сверстать HTML-шаблон и использовать WeasyPrint или PrinceXML.

Почему мой PDF весит слишком много? Частая причина — невстроенные, но растровые изображения высокого разрешения или дублирование шрифтов. Оптимизируйте картинки перед вставкой и проверяйте настройки субсетирования шрифтов в конвертере.

Как добавить сквозную нумерацию страниц? В HTML/CSS это делается через @page { @bottom-center { content: counter(page); } }. В XSL-FO используются специальные элементы <fo:page-number/> в статическом содержимом страницы.