Любая информационная система призвана обрабатывать информацию. У нее есть так называемые «ввод» и «вывод». Один из самых значимых «выводов» — отчетность. На территории Российской Федерации формат обязательной отчетности регламентирован и описан в законодательстве. Именно поэтому он имеет такое большое значение для компаний, выпускающих программные продукты для использования в нашей стране. Программы, ориентированные на бизнес, просто обязаны генерировать горы бумаг, избавляя от этой напасти операторов.
Количество систем, системок и подсистем генерации отчетности очень велико, их лишь немногим меньше, чем самих программ для решения тех или иных проблем деловой активности. В ход идут различные техники и технологии и в конце концов нужный результат достигается за счет гибкости, масштабируемости или совместимости.
На мой взгляд, наиболее целесообразно включать в продукт решение, поддерживающее стандарты и, кроме того, являющееся стабильным и зрелым. Также важно, чтобы исходный код был открытым, а продукт — свободным. И еще необходимо иметь представление о том, насколько лицензия включаемого программного компонента совместима с той лицензией, под которой вы «публикуете» свое детище.
Что такое 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, достаточная для реализации форм отчетности, принятых в нашей стране. Не могу сказать, что реализовать их просто, но это вполне возможно.
Немного о стандартах
Почему в процессе разработки следует ориентироваться именно на стандарты, а не на конкретные решения? Как правило, разработчики программного продукта недооценивают масштабы жизненного пути своего творения. Зато заказчик и эксплуататор этого решения знает: чем дольше он сможет использовать продукт, тем лучше возвращаются инвестиции, затраченные на его разработку или покупку. Вот и получается, что программы для мэйнфреймов все еще существуют в глубинах корпораций и древние разработки на языке программирования COBOL успешно справляются со своими обязанностями.
Мир, как известно, не стоит на месте, и любой продукт требует поддержки и развития. Вот здесь-то и начинаются проблемы в том случае, если разработчик был привязан к конкретной технологии. Она могла измениться и утратить совместимость со своей прошлой инкарнацией, а поставщик мог отказаться от ее развития и поддержки. Компания-разработчик иногда просто исчезает. Если же архитектура вашего продукта была построена в расчете на стандарт, то новых инвестиций в него не потребуется. Надо будет найти на рынке решение, более всего соответствующее стандарту, и использовать его. Возможно, что некоторая работа по модернизации программного кода все-таки понадобится, но она будет связана с инновацией и адаптацией к новому и прогрессивному, а не направлена на поиск решения под платформу, «такую же, как эта, но другую».
Лучше один раз увидеть
В нашем случае главная цель применения Apache FOP — создание красивого документа. Рассмотрение подготовки одного документа строгой формы отчетности может занять целую статью или даже серию статей. Здесь же мы ограничимся лишь наброском документа, который будет содержать шапку и список. Допустим, это некий прообраз счета, заказа или информационного письма. В шапке документа должно находиться наименование клиента, в теле документа — список товаров с основными атрибутами, а закончится документ подписью с указанием названия компании-поставщика.
Для того чтобы получить отчет с помощью FOP, потребуются сами данные и способ их представления. Данные передаются в формате XML, а преобразование — в виде XSLT-файла. После «наложения» преобразований на данные должен выйти корректный XSL-FO-документ. Он-то и будет переводиться в графическую форму.
Допустим, у нас есть следующие данные для построения отчета:
<report>
<header>
<supplier>Fruit Co.</supplier>
<client>Labaz inc.</client>
</header>
<rows>
<row price=”1” quantity=”2”
total=”2”><name>Яблоко</name></row>
<row price=”2” quantity=”1”
total=”2”><name>Груша</name></row>
<row price=”3” quantity=”4”
total=”12”><name>Тыква</name></row>
</rows>
</report>
Шапкой документа служит содержимое тега header, а деталями данного тестового отчета — то, что находится в теге rows. В данном примере мы используем минимум оформления, но суть этого небольшого отчета сохранится. Суммируются поля количества и общей стоимости.
Преобразование в виде xslt-файла может представлять собой примерно следующее:
<?xml version=”1.0” encoding=”utf-8”?>
<xsl:stylesheet version=”1.0”
xmlns:xsl=”http://www.w3.org/1999/XSL/
Transform”
xmlns:fo=”http://www.w3.org/1999/XSL/
Format”>
<xsl:output method=”xml” indent=”yes”/>
<xsl:template match=”/”>
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name=”A4-
portrait”
page-height=”29.7cm” page-
width=”21.0cm” margin=”2cm”>
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference=”A4-
portrait”>
<fo:flow flow-name=”xsl-region-body”
font-size=”12pt”>
<fo:block font-size=”16pt”>
Уважаемая компания <xsl:value-of select=”/
report/header/client”/> !
</fo:block>
<fo:block padding-top=”1cm”
padding-bottom=”1cm”>Напоминаем вам, что были
заказаны следующие товары:</fo:block>
<xsl:for-each select=”/report/
rows/row”>
<fo:block>
<xsl:value-of
select=”name”/> (стоимость единицы: $<xsl:value-
of select=”@price”/>,
заказанное количество:
<xsl:value-of select=”@quantity”/>,
всего: <xsl:value-of
select=”@total”/>).
</fo:block>
</xsl:for-each>
<fo:block>Всего <xsl:value-of
select=”sum(/report/rows/row/@quantity)”/> пред-
метов на сумму
$<xsl:value-of select=”sum(/
report/rows/row/@total)”/> </fo:block>
<fo:block font-size=”14pt”
padding-top=”1cm”>
Искренне ваши,
работники компании-поставщика <xsl:value-of
select=”/report/header/supplier”/>.
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
Из тега header XML-документа берется название поставщика и клиента, которые находятся в тегах supplier и client соответственно. Данные для списка содержатся в тегах row (запись или строка), которые группируются в теге rows. Каждая строка содержит информацию о названии товара (в теле тега), его цене (атрибут price) и заказанном количестве (атрибут quantity).
Внешний вид документа, получаемого при запуске Apache FOP с ключом -awt
Кроме PDF Apache FOP в разной степени поддерживает следующие форматы: PostScript, простой текст, MIF (формат Adobe FrameMaker), PCL, RTF или SVG. Однако для промышленного использования рекомендуется применять именно PDF, так как он является основным для Apache FOP и вся функциональность реализуется и тестируется в основном именно для него.
Полезные советы
Напоследок приведу несколько советов, которые будут полезны при использовании и изучении Apache FOP. Прежде всего для составления русскоязычных документов потребуется набор кириллических шрифтов. Можно взять любой шрифт TrueType, которым вы располагаете, и добавить к нему метрику в XML–формате с помощью следующей команды:
java org.apache.fop.fonts.apps.TTFReader arial.ttd arial.xml
Причем сделать это надо для всех имеющихся начертаний данного шрифта. Потом потребуется создать файл с конфигурацией, описывающей такой шрифт. Этот файл может содержать разные параметры конфигурации, но для выбранных шрифтов в теге fonts следует добавить элементы font для каждого начертания:
<font metrics-file=”Arev.xml” kerning=”yes” embed-file=”/usr/share/fonts/TTF/Arev/Arev.ttf”> <font-triplet name=”Arev Sans” style=”normal” weight=”normal”/></font>
Для того чтобы лучше понять, в чем состоит проблема при «падении» FOP, нужно запустить эту программу с ключом -d, т.е. разрешить вывод отладочной информации. Исключение в стандартном формате Java поможет вам найти проблемную строку в файле данных или преобразования.
Мне кажется, не стоит перекладывать какую-либо логику преобразования данных на FOP. Лучше выполнять весь объем вычислений непосредственно в базе данных или с помощью скрипта, который «выгружает» данные в XML-файл, в зависимости от того, где в вашей информационной системе реализована логика приложений.
Комментарии:
Для того, чтобы оставить комментарий авторизуйтесь или зарегистрируйтесь.