Преобразование XML-документа с помощью Apache FOP У нее есть так называемые «ввод» и «вывод». Один из самых значимых «выводов» — отчетность. На территории Российской Федерации формат обязательной отчетности регламентирован и описан в законодательстве. Именно поэтому он имеет такое большое значение для компаний, выпускающих программные продукты для использования в нашей стране. Программы, ориентированные на бизнес, просто обязаны генерировать горы бумаг, избавляя от этой напасти операторов.

Количество систем, системок и подсистем генерации отчетности очень велико, их лишь немногим меньше, чем самих программ для решения тех или иных проблем деловой активности. В ход идут различные техники и технологии и в конце концов нужный результат достигается за счет гибкости, масштабируемости или совместимости.

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

Что такое FOP и XSL-FO

В моем случае идеальное решение — продукт Apache FOP. Он свободен, и код его открыт. Лицензия Apache Software License позволяет использовать FOP в коммерческих продуктах и основывать на нем другие коммерческие разработки, не открывая после этого весь исходный код. Главное условие использования кода под лицензией Apache — информирование его получателя о том, что в продукте имеется код с этой лицензией.

Что же такое Apache FOP и почему его можно использовать для создания отчетности в коммерческом приложении? Это XSL-FO — процессор, который реализует часть стандарта XSL-FO (XSL Formating Objects) консорциума W3C. XSL-FO, в свою очередь, — часть XSL, набора технологий фонда, разработанных для преобразования и форматирования данных, представленных в XML. Другими частями пула технологий XSL являются XSL и XPath, предназначенные для преобразования XML-файлов и обращения к частям XML-документа.

Преобразование XML-документа с помощью Apache FOP

Стандарты обсудим немного позже. С лицензиями и технологиями все понятно. Однако что же все-таки будет главным фактором выбора Apache FOP в качестве сердца «генератора» отчетности? Во-первых, разделение данных и способов их отображения. Во-вторых, гибкость формата XML для передачи данных. В-третьих, доступность на рынке визуальных редакторов для работы с файлами преобразований XSL-FO. В-четвертых, функциональность Apache FOP, достаточная для реализации форм отчетности, принятых в нашей стране. Не могу сказать, что реализовать их просто, но это вполне возможно.

Немного о стандартах

Внешний вид документа, получаемого при запуске Apache FOP с ключом -awtПочему в процессе разработки следует ориентироваться именно на стандарты, а не на конкретные решения? Как правило, разработчики программного продукта недооценивают масштабы жизненного пути своего творения. Зато заказчик и эксплуататор этого решения знает: чем дольше он сможет использовать продукт, тем лучше возвращаются инвестиции, затраченные на его разработку или покупку. Вот и получается, что программы для мэйнфреймов все еще существуют в глубинах корпораций и древние разработки на языке программирования COBOL успешно справляются со своими обязанностями.

Мир, как известно, не стоит на месте, и любой продукт требует поддержки и развития. Вот здесь-то и начинаются проблемы в том случае, если разработчик был привязан к конкретной технологии. Она могла измениться и утратить совместимость со своей прошлой инкарнацией, а поставщик мог отказаться от ее развития и поддержки. Компания-разработчик иногда просто исчезает. Если же архитектура вашего продукта была построена в расчете на стандарт, то новых инвестиций в него не потребуется. Надо будет найти на рынке решение, более всего соответствующее стандарту, и использовать его. Возможно, что некоторая работа по модернизации программного кода все-таки понадобится, но она будет связана с инновацией и адаптацией к новому и прогрессивному, а не направлена на поиск решения под платформу, «такую же, как эта, но другую».

Лучше один раз увидеть

В нашем случае главная цель применения Apache FOP — создание красивого документа. Рассмотрение подготовки одного документа строгой формы отчетности может занять целую статью или даже серию статей. Здесь же мы ограничимся лишь наброском документа, который будет содержать шапку и список. Допустим, это некий прообраз счета, заказа или информационного письма. В шапке документа должно находиться наименование клиента, в теле документа — список товаров с основными атрибутами, а закончится документ подписью с указанием названия компании-поставщика.

Для того чтобы получить отчет с помощью FOP, потребуются сами данные и способ их представления. Данные передаются в формате XML, а преобразование — в виде XSLT-файла. После «наложения» преобразований на данные должен выйти корректный XSL-FO-документ. Он-то и будет переводиться в графическую форму.

Допустим, у нас есть следующие данные для построения отчета:

Fruit Co.

Labaz inc.

total=”2”>Яблоко

total=”2”>Груша

total=”12”>Тыква

Шапкой документа служит содержимое тега header, а деталями данного тестового отчета — то, что находится в теге rows. В данном примере мы используем минимум оформления, но суть этого небольшого отчета сохранится. Суммируются поля количества и общей стоимости.

Преобразование в виде xslt-файла может представлять собой примерно следующее:

xmlns:xsl=”http://www.w3.org/1999/XSL/

Transform”

xmlns:fo=”http://www.w3.org/1999/XSL/

Format”>

portrait”

page-height=”29.7cm” page-

width=”21.0cm” margin=”2cm”>

portrait”>

font-size=”12pt”>

Уважаемая компания

report/header/client”/> !

padding-bottom=”1cm”>Напоминаем вам, что были

заказаны следующие товары:

rows/row”>

select=”name”/> (стоимость единицы: $

of select=”@price”/>,

заказанное количество:

,

всего:

select=”@total”/>).

Всего

select=”sum(/report/rows/row/@quantity)”/> пред-

метов на сумму

$

report/rows/row/@total)”/>

padding-top=”1cm”>

Искренне ваши,

работники компании-поставщика

select=”/report/header/supplier”/>.

Из тега header XML-документа берется название поставщика и клиента, которые находятся в тегах supplier и client соответственно. Данные для списка содержатся в тегах row (запись или строка), которые группируются в теге rows. Каждая строка содержит информацию о названии товара (в теле тега), его цене (атрибут price) и заказанном количестве (атрибут quantity).

Внешний вид документа, получаемого при запуске Apache FOP с ключом -awt

Кроме PDF Apache FOP в разной степени поддерживает следующие форматы: PostScript, простой текст, MIF (формат Adobe FrameMaker), PCL, RTF или SVG. Однако для промышленного использования рекомендуется применять именно PDF, так как он является основным для Apache FOP и вся функциональность реализуется и тестируется в основном именно для него.

Полезные советы

Создавать файлы xsl-fo можно при помощи визуальных редакторов, например StyleVisionНапоследок приведу несколько советов, которые будут полезны при использовании и изучении Apache FOP. Прежде всего для составления русскоязычных документов потребуется набор кириллических шрифтов. Можно взять любой шрифт TrueType, которым вы располагаете, и добавить к нему метрику в XML–формате с помощью следующей команды:

java org.apache.fop.fonts.apps.TTFReader arial.ttd arial.xml

Причем сделать это надо для всех имеющихся начертаний данного шрифта. Потом потребуется создать файл с конфигурацией, описывающей такой шрифт. Этот файл может содержать разные параметры конфигурации, но для выбранных шрифтов в теге fonts следует добавить элементы font для каждого начертания:

Для того чтобы лучше понять, в чем состоит проблема при «падении» FOP, нужно запустить эту программу с ключом -d, т.е. разрешить вывод отладочной информации. Исключение в стандартном формате Java поможет вам найти проблемную строку в файле данных или преобразования.

Мне кажется, не стоит перекладывать какую-либо логику преобразования данных на FOP. Лучше выполнять весь объем вычислений непосредственно в базе данных или с помощью скрипта, который «выгружает» данные в XML-файл, в зависимости от того, где в вашей информационной системе реализована логика приложений.