Открыть сервис

Apache FOP

Apache FOP (сокращение от Formatting Objects Processor) — это свободное программное обеспечение с открытым исходным кодом, предназначенное для преобразования документов, описанных на языке XSL-FO (Extensible Stylesheet Language Formatting Objects), в различные выходные форматы, прежде всего в Portable Document Format (PDF). Проект является частью экосистемы Apache Software Foundation и входит в состав подпроекта Apache XML Graphics.

История

Разработка Apache FOP началась в 1999 году как независимый проект, созданный Джеймсом Таубером. Изначально проект был ориентирован на создание PDF-документов из XML-данных с использованием XSL-FO, который в то время был развивающейся спецификацией W3C. В 2000 году проект был передан в инкубатор Apache Software Foundation, а в 2001 году стал официальным подпроектом Apache XML Graphics.

Ключевые вехи в истории проекта:

  • Версия 0.20.5 (2004 год): Первая стабильная версия, поддерживающая базовые возможности XSL-FO.
  • Версия 0.95 (2007 год): Значительное улучшение поддержки сложных макетов, таблиц и изображений.
  • Версия 1.0 (2010 год): Первый крупный релиз, получивший статус «стабильного продукта». Включал поддержку большинства спецификаций XSL-FO 1.0 и частичную поддержку XSL-FO 1.1.
  • Версия 1.1 (2012 год): Расширение поддержки XSL-FO 1.1, включая улучшенную работу с многостраничными документами, закладками и метаданными.
  • Версия 2.0 (2015 год): Внедрение поддержки SVG (Scalable Vector Graphics), улучшенная обработка шрифтов (включая встраивание шрифтов TrueType/OpenType) и оптимизация производительности.
  • Версия 2.1 (2016 год): Последний стабильный релиз на момент начала 2020-х годов. Включал исправления ошибок и улучшенную совместимость с современными форматами PDF (например, PDF/A-1a, PDF/A-1b, PDF/X-3).

Несмотря на то, что спецификация XSL-FO 1.1 была окончательно утверждена W3C в 2006 году, развитие Apache FOP продолжалось, и проект остаётся одним из немногих активно поддерживаемых инструментов для работы с XSL-FO. В 2020-х годах разработка замедлилась, но проект сохраняет статус активного в репозитории Apache.

Архитектура и принцип работы

Apache FOP представляет собой Java-приложение, работающее по принципу конвейера обработки данных. Основные этапы преобразования:

  1. Чтение и парсинг XSL-FO: На вход подаётся XML-документ, содержащий разметку XSL-FO. FOP использует SAX-парсер (Simple API for XML) для последовательного чтения и интерпретации элементов форматирования.
  2. Построение дерева объектов: Из интерпретированных элементов формируется внутреннее представление документа — дерево объектов форматирования (FO Tree). Каждый узел дерева соответствует определённому элементу XSL-FO (например, fo:block, fo:table, fo:inline).
  3. Разметка страниц: На основе свойств, заданных в элементах fo:simple-page-master и fo:page-sequence, FOP вычисляет макет страниц: размеры, поля, колонтитулы, области содержимого.
  4. Форматирование содержимого: Для каждого элемента вычисляются его размеры, положение на странице, стили (шрифты, цвета, отступы). Обрабатываются переносы строк, разрывы страниц, выравнивание и другие типографские правила.
  5. Генерация выходного формата: Результат форматирования передаётся в модуль рендеринга, который создаёт файл в целевом формате. Для PDF используется собственная библиотека генерации PDF, реализованная на Java.

Поддерживаемые форматы

Apache FOP поддерживает несколько выходных форматов, каждый из которых имеет свои особенности и области применения:

  • PDF (Portable Document Format): Основной и наиболее полно реализованный формат. Поддерживаются стандарты PDF 1.4–1.7, а также подмножества PDF/A (архивное хранение) и PDF/X (полиграфия).
  • PostScript (PS): Формат, используемый в полиграфии и на старых печатных устройствах. Поддержка ограничена по сравнению с PDF.
  • PCL (Printer Command Language): Язык управления принтерами Hewlett-Packard. Подходит для печати на совместимых устройствах.
  • AFP (Advanced Function Presentation): Формат, используемый в корпоративных системах печати (IBM). Поддерживается в экспериментальном режиме.
  • SVG (Scalable Vector Graphics): Векторный формат для веб-графики. Позволяет визуализировать XSL-FO как векторное изображение.
  • XML (внутреннее представление): Вывод в виде XML-дерева, полезен для отладки.
  • TXT (Plain Text): Простой текст без форматирования. Используется для извлечения текстового содержимого.

Основные возможности

Поддержка XSL-FO

Apache FOP реализует большую часть спецификаций XSL-FO 1.0 и XSL-FO 1.1. Ключевые поддерживаемые элементы и свойства:

  • Макеты страниц: fo:simple-page-master, fo:page-sequence-master, fo:region-body, fo:region-before, fo:region-after, fo:region-start, fo:region-end.
  • Блочные элементы: fo:block, fo:block-container, fo:list-block, fo:table, fo:table-row, fo:table-cell.
  • Строчные элементы: fo:inline, fo:character, fo:leader, fo:page-number, fo:page-number-citation.
  • Графика и изображения: fo:external-graphic, fo:instream-foreign-object (для встраивания SVG).
  • Ссылки и закладки: fo:basic-link, fo:bookmark-tree, fo:bookmark.
  • Многоязычная поддержка: Переносы слов (с использованием словарей для русского, английского, немецкого, французского и других языков), поддержка Unicode, встраивание шрифтов.
  • Сложные макеты: Многоколоночная вёрстка, обтекание текстом, плавающие элементы, разрывы страниц и столбцов.

Шрифты

FOP поддерживает работу со шрифтами TrueType, OpenType, Type 1 и CID-шрифтами. Шрифты могут быть встроены в PDF-файл (полностью или частично) или использоваться как ссылки на системные шрифты. Для корректной работы с кириллицей и другими нелатинскими алфавитами требуется настройка конфигурации шрифтов.

PDF-метаданные

Поддерживается добавление метаданных в PDF-файл: заголовок, автор, тема, ключевые слова, а также пользовательские поля. Возможно создание PDF/A-совместимых документов с обязательным встраиванием шрифтов и метаданных.

Ограничения и недостатки

Несмотря на широкие возможности, Apache FOP имеет ряд ограничений, которые важно учитывать при выборе инструмента:

  • Неполная поддержка XSL-FO 1.1: Некоторые продвинутые возможности, такие как «floating» (плавающие элементы) в многостраничных макетах, реализованы не полностью.
  • Производительность: При обработке больших документов (сотни страниц) FOP может потреблять значительные объёмы оперативной памяти и работать медленнее, чем коммерческие аналоги (например, Antenna House Formatter или RenderX XEP).
  • Сложность настройки: Для корректной работы с нестандартными шрифтами, сложными макетами или специфическими требованиями к PDF требуется детальное конфигурирование.
  • Отсутствие поддержки CSS: FOP не поддерживает CSS для печати (CSS Paged Media), что отличает его от современных инструментов, таких как WeasyPrint или Prince XML.
  • Зависимость от Java: Для работы требуется установленная Java Runtime Environment (JRE), что может быть неудобно в некоторых окружениях.

Применение

Apache FOP используется в различных сценариях, где требуется автоматическая генерация документов из XML-данных:

  • Генерация отчётов: В корпоративных системах (ERP, CRM) для создания PDF-отчётов, счетов, накладных.
  • Публикация документации: В системах управления документами (CMS, DITA) для преобразования XML-документов в печатные PDF-файлы.
  • Электронные книги: Создание PDF-версий книг из структурированных XML-данных.
  • Полиграфия: Подготовка макетов для печати в форматах PDF/X и PostScript.
  • Научные публикации: Генерация PDF-версий статей и диссертаций из XML-разметки (например, в формате JATS).

Примеры использования

Простой пример XSL-FO

Ниже приведён минимальный пример XSL-FO-документа, который может быть обработан Apache FOP для создания PDF-файла с одной страницей, содержащей текст «Привет, мир!»:

``xml <?xml version="1.0" encoding="UTF-8"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">; <fo:layout-master-set> <fo:simple-page-master master-name="A4" page-width="210mm" page-height="297mm" margin="20mm"> <fo:region-body margin="0mm"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="A4"> <fo:flow flow-name="xsl-region-body"> <fo:block font-size="12pt" font-family="Arial"> Привет, мир! </fo:block> </fo:flow> </fo:page-sequence> </fo:root> ``

Команда для запуска

Для преобразования файла example.fo в output.pdf используется команда:

``bash fop -fo example.fo -pdf output.pdf ``

Альтернативы

На рынке существуют как коммерческие, так и открытые альтернативы Apache FOP:

  • RenderX XEP: Коммерческий процессор XSL-FO, отличающийся высокой производительностью и полной поддержкой спецификации.
  • Antenna House Formatter: Коммерческий продукт с широкой поддержкой форматов (PDF, SVG, XPS) и продвинутыми типографскими возможностями.
  • WeasyPrint: Бесплатный инструмент на Python, использующий CSS Paged Media, а не XSL-FO.
  • Prince XML: Коммерческий инструмент для преобразования HTML/CSS в PDF, поддерживающий CSS Paged Media.

Источники

  • Apache Software Foundation. «Apache FOP — User Documentation». Официальная документация проекта.
  • W3C. «Extensible Stylesheet Language (XSL) Version 1.1». Спецификация W3C, 2006.
  • James Tauber. «The History of Apache FOP». Личный блог разработчика, 2001.
  • Apache XML Graphics Project. «Apache FOP — Release Notes». Архив версий и изменений.
  • Сайт проекта Apache FOP: https://xmlgraphics.apache.org/fop/

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →