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