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

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

XML — это формат хранения структурированных данных, а не визуального отображения. Чтобы получить из него читаемый PDF-документ, необходимо применить слой стилей или программную обработку. Самый надежный способ для сложных отчетов — использование XSL-FO, для быстрой верстки — промежуточная конвертация в HTML, а для полной кастомизации — генерация через код на Python, Java или C#.

Выбор метода зависит от сложности верстки и вашего технического стека. Ниже разобраны три основных подхода с примерами реализации.

Краткий ответ: Если вам нужно быстро и красиво — конвертируйте XML в HTML (через XSLT или скрипт), а затем HTML в PDF (через headless-браузер). Если требуется строгий печатный стандарт (книги, счета) — используйте XSL-FO.

Почему нельзя просто «сохранить как PDF»

Файл XML содержит только данные (теги, атрибуты, текст), но не знает, как они должны выглядеть. В нем нет информации о шрифтах, отступах, разрывах страниц или цвете фона. Поэтому процесс конвертации всегда состоит из двух этапов:

  1. Трансформация: Преобразование сырых данных в формат, понятный рендереру (например, добавление инструкций по верстке).
  2. Рендеринг: Создание бинарного PDF-файла на основе этих инструкций.

Способ 1: Промежуточная конвертация через HTML (Рекомендуемый)

Это самый популярный метод в современной веб-разработке. Он позволяет использовать привычные CSS-стили для оформления документа.

Алгоритм:

  1. XML трансформируется в HTML с помощью XSLT или серверного скрипта.
  2. Полученный HTML открывается в headless-браузере (Chrome, Puppeteer, Playwright) или специальном инструменте (WeasyPrint, wkhtmltopdf).
  3. Браузер «печатает» страницу в PDF.

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

  • Легкая настрой дизайна через CSS.
  • Поддержка современных шрифтов и графики.
  • Быстрая разработка прототипов.

Пример на Python (lxml + WeasyPrint)

from lxml import etree
from weasyprint import HTML

# 1. Парсинг XML и применение XSLT
xml_doc = etree.parse('data.xml')
xslt_doc = etree.parse('style.xsl')
transform = etree.XSLT(xslt_doc)
result_html = transform(xml_doc)

# 2. Конвертация HTML строки в PDF
html_string = str(result_html)
HTML(string=html_string).write_pdf('output.pdf')

Для лучшей поддержки кириллицы и сложных таблиц в Python рекомендуется использовать библиотеку WeasyPrint или Playwright, так как они лучше работают с современными стандартами CSS, чем устаревший wkhtmltopdf.

Способ 2: XSL-FO (Стандарт для печатной продукции)

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

Алгоритм:

  1. XML трансформируется в XSL-FO файл с помощью XSLT.
  2. Специальный процессор (например, Apache FOP) компилирует FO-файл в PDF.

Когда использовать

  • Требуется точный контроль над разрывами страниц.
  • Нужны сложные колонтитулы, нумерация страниц, оглавления.
  • Документ должен соответствовать стандартам архивации (PDF/A).

Инструменты

  • Apache FOP (Java) — самый популярный открытый процессор.
  • RenderX XEP — коммерческое решение с расширенной поддержкой.

Способ 3: Программная генерация (Библиотеки)

Если структура документа очень динамична или данные требуют сложной логики обработки перед выводом, проще генерировать PDF напрямую из кода, минуя промежуточные форматы разметки.

Сравнение библиотек по языкам

ЯзыкБиблиотекаОсобенности
PythonReportLab, FPDF2Полный контроль через код. Сложнее верстать таблицы, чем в HTML.
JavaiText 7, OpenPDFМощные инструменты для enterprise-решений. iText имеет строгую лицензию (AGPL).
C# / .NETQuestPDF, iTextSharpQuestPDF предлагает современный fluent-API и отличный рендеринг.
Node.jsPDFKit, PuppeteerPDFKit хорош для простых документов, Puppeteer — для сложных HTML-макетов.

Пошаговый план реализации

Чтобы избежать ошибок при внедрении конвертации, следуйте этому чек-листу:

  1. Анализ структуры XML. Определите, какие данные обязательны, а какие опциональны. Проверьте наличие вложенных списков или таблиц.
  2. Выбор инструмента.
    • Для веба и быстрых отчетов → HTML/CSS подход.
    • для строгой полиграфии → XSL-FO.
    • для сложной бизнес-логики → Кодовые библиотеки.
  3. Подготовка шаблона. Создайте XSLT-stylesheet или HTML-шаблон. Уделите внимание обработке пустых значений (null/empty nodes).
  4. Настройка шрифтов. Убедитесь, что используемые шрифты поддерживают кириллицу (если нужна) и встроены в PDF или доступны системе рендеринга.
  5. Тестирование на крайних случаях. Проверьте генерацию на файлах с очень длинными строками, большим количеством страниц и отсутствием данных.

Частая ошибка: Игнорирование кодировки. Убедитесь, что весь пайплайн (XML парсер → XSLT процессор → PDF рендерер) работает в UTF-8. Иначе русские символы превратятся в «кракозябры».

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

  • Потеря семантики. При конвертации в HTML забывают использовать теги <thead>, <th> для таблиц, из-за чего скринридеры и поисковые системы не могут правильно прочитать структуру документа.
  • Раздувание размера файла. Вставка изображений в высоком разрешении без сжатия может увеличить размер PDF с 100 КБ до 10 МБ. Используйте сжатие JPEG/PNG при вставке.
  • Некорректные разрывы страниц. Текст может обрезаться посередине строки или таблицы. В CSS используйте свойства break-inside: avoid; для блоков, которые нельзя разрывать.
  • Отсутствие метаданных. Готовый PDF должен содержать заголовок, автора и дату создания. Это важно для поиска и сортировки файлов.

FAQ

Можно ли конвертировать XML в PDF онлайн без программирования? Да, существуют онлайн-конвертеры, но они часто дают плохой результат, так как не знают, как именно нужно расположить данные. Для разовых задач можно открыть XML в браузере, применить простой CSS-стиль и распечатать страницу в PDF (Ctrl+P -> Save as PDF).

Что лучше: XSL-FO или HTML-to-PDF? HTML-to-PDF проще в поддержке и дизайне. XSL-FO дает более предсказуемый результат для многостраничных документов со сложной сеткой (например, книжная верстка).

Как сделать PDF доступным для поиска (Searchable PDF)? Используйте векторные шрифты, а не картинки текста. Большинство современных библиотек (iText, WeasyPrint, FOP) создают текстовый слой по умолчанию. Избегайте растеризации страниц в изображение.

Поддерживает ли PDF/A стандарт XML? PDF/A — это формат для долгосрочного архивирования. XML сам по себе не «встраивается» в PDF/A как видимый элемент, но данные из XML используются для генерации контента. При генерации убедитесь, что все шрифты встроены (embedded), а цветовые профили корректны, чтобы файл соответствовал стандарту PDF/A.