Технология формирования «тяжелых» отчетов в формате PDF, используя Apache FOP 2014 Миндияров Илья Гафурович Главный специалист по программному обеспечению Центра информационных технологий и консалтинга «ПАРУС»
назначение Apache FOP примеры разработки пользовательских отчетов пример развертывания Apache FOP как web- приложения Рассматриваемые задачи В архиве находятся файлы, используемые в презентации. Чтобы их открыть нужно: 1. Открыть PowerPoint 2. Открыть файл этой презентации 3. На текущем слайде 2 раза нажать кнопку мыши на иконке файла
Apache FOP это программа, которая переводит XML, написанный в формате XSL formatting objects (XSL-FO), в различные форматы: PDF, RTF, PCL, PS, PNG, TIFF. Используется для написания отчетов которые: Требуют сложного форматирования; Имеют большой объем страниц; Требуют высокой скорости выполнения. Примечание: про XSL-FO вы можете прочитать назначение Apache FOP
Apache FOP написан на Java и его можно вызывать из Java Servletов. Это позволяет, например, в сочетании с Apache HTTP Server и Apache Tomcat обслуживать запросы любого количества пользователей, лишь бы хватило вычислительной мощности серверов. Можно развернуть много Apache Tomcat, которые являются контейнерами Java Servlet. пример развертывания Apache FOP как web-приложения Apache HTTP Server Apache Tomcat Oracle RDBMS Клиент Парус 8
В презентации будет показано как развернуть 2 Apache Tomcat пример развертывания Apache FOP как web-приложения
Для использования Apache FOP из пользовательского отчета с типом Двоичные данные нужно вызывать процедуру GET_FOP_DOCUMENT2 Процедура GET_FOP_DOCUMENT2 по протоколу HTTP (через UTL_HTTP) передает содержание своих параметров web-серверу. На web-сервере параметры передаются в Java Servlet который запускает Apache FOP. Результаты работы Apache FOP возвращаются также по протоколу HTTP в GET_FOP_DOCUMENT2 Мы рекомендуем web-сервер не устанавливать на тот же компьютер, на котором работает база данных ORACLE. Если вы не хотите разворачивать web-сервер, то пользуйтесь GET_FOP_DOCUMENT из презентации pps Если у Вас есть предложения по улучшению работы GET_FOP_DOCUMENT и GET_FOP_DOCUMENT2 - сообщайте по адресу примеры разработки пользовательских отчетов
Существуют визуальные средства разработки отчетов в формате XSL-FO, например примеры разработки пользовательских отчетов
Для действительно сложных по форматированию и/или многостраничных отчетов предлагается сразу визуальными средствами не пользоваться. Сначала изучить формат XSL-FO, а только потом принимать решение. Причем, следует отметить, что скорость разработки в обычном XML-редакторе и программировании на PL/SQL довольно скоро становится соизмерима с разработкой отчетов для MS Excel. примеры разработки пользовательских отчетов
Преимущества XSL-FO как языка Не надо много раз прописывать значения атрибутов, некоторые значения наследуются … Код В ячейке таблицы слово Код будет выведено по центру горизонтально и вертикально шрифтом TimesNewRoman и размером 8pt примеры разработки пользовательских отчетов
Преимущества XSL-FO как языка Некоторые группы атрибутов имеют более короткие аналоги Можно сократить Можно еще примеры разработки пользовательских отчетов
Преимущества XSL-FO как языка Возможность задавать размеры в разных единицах измерения pc|px|pt|mm|cm|in|em Т.е. ширину колонки таблицы можно задать в сантиметрах Можно гибко управлять разрывами страниц так у меня реализована двухсторонняя печать – первая страница отчета всегда должна быть нечетная. Можно управлять как 2 элемента будут располагаться на странице Так блок подписей в конце отчета всегда будет на одной странице с последней записью главной таблицы отчета. Мы уже как-то отвыкли в отчетах от переносов слов, по правилам русского языка. Теперь можно снова вспомнить. примеры разработки пользовательских отчетов
Чего не хватает при работе с Apache FOP В таблицах нужно указывать ширину столбца Единственное утешение, что можно воспользоваться функцией Если во всех столбцах задавать proportional-column-width, то можно добиться нужной пропорциональной ширины. примеры разработки пользовательских отчетов
Чего не хватает при работе с Apache FOP Хотя в спецификации fo:table-row и указано, что высота строки может задаваться в % но Apache FOP это не поддерживает. Как хочется: примеры разработки пользовательских отчетов
Чего не хватает при работе с Apache FOP Как получается: Тогда как другой рендер XSL-FO - XEP ( ), если судить по форумам в интернете, умеет задавать высоту строки как 50% от высоты родительского элемента. примеры разработки пользовательских отчетов
Однако, у Apache FOP (как у программы ) есть особенность, которая снимает с разработчика практически все ограничения инструментария при написании отчета. Разработчик во время выполнения своей программы может послать Apache FOP запрос сгенерировать файл не в формате PDF, а в формате Apache FOP: Intermediate Format, который является еще одним форматом XML. В таком файле уже присутствуют низкоуровневые инструкции, как печатать документ. Главное найти нужный тэг g, это решается временным добавлением атрибута id примеры разработки пользовательских отчетов
Чтобы не анализировать содержимое всего IF файла выполняем XSLT- преобразование: cFOP_IF_XSLT clob := ' '; При написании своих XSLT не забывайте указывать xmlns:fop=" примеры разработки пользовательских отчетов
Обработка XSLT – выполняется на web-сервере, а разработчику вернется такой XML 71000/1000=71pt Таким образом мы сможем задать 50% от 71pt примеры разработки пользовательских отчетов
В отчете Т-12, вы можете видеть, что в одной строке отчета сразу 3 таблицы: дни, итоги, неявки. Apache FOP такой задачей справляется. Причем справляется быстро. примеры разработки пользовательских отчетов
В архиве второго слайда презентации возьмите файл UDO_P_OPRSPECS_PDF.prc – это пользовательский отчет с типом Двоичные данные, который просто печатает проводки. В параметре отчета указывается кол-во проводок, которые надо напечатать. примеры разработки пользовательских отчетов
Структура XSL-FO файла примерно следующая внутри корневого элемента находится один или несколько тэгов page-sequence …. …. …. ….. примеры разработки пользовательских отчетов
Если весь отчет состоит из единственного тэга page-sequence, то при выполнении огромного отчета у виртуальной машины java закончится память. Например, 512 мб, выделенных на Apache Tomcat,закончились после вывода проводок. При написании отчета, старайтесь программно закрывать и открывать тэг page-sequence, когда это возможно. Просто знайте, что Apache FOP дерево объектов строит сначала в оперативной памяти и поэтому быстро работает. А когда встречается page-sequence, он сохраняет объекты на диск. При формировании отчета UDO_P_OPRSPECS_PDF, через каждые 16 проводок начинается новая последовательность страниц. Отчет никаких полезных данных не выводит, это просто способ продемонстрировать, как за минут (зависит от вашего сервера) напечатать 6250 страниц. примеры разработки пользовательских отчетов
Установка в базе данных ORACLE Из архива второго слайда презентации выполните GET_FOP_DOCUMENT2. prc примеры разработки пользовательских отчетов
Это create or replace procedure GET_FOP_DOCUMENT2 ( xml in out nocopy blob, --blob с XSL-FO, --или XML-в произвольном формате, который будет преобразовываться файлом из параметра XSLT xslt in blob, --blob с XSLT-преобразованием параметра XML format in varchar2 default null, --MIME_PDF, MIME_RTF, MIME_FOP_IF (PDF,RTF или Apache FOP Intermediate Format) after_fop_if_xslt in blob default null, --blob с XSLT-преобразованием только для MIME_FOP_IF after_fop_if_xslt_model in varchar2 default null, --какой парсер использовать DOM или SAX при использовании after_fop_if_xslt output in out nocopy blob, --blob c результатом работы в форматах PDF, RTF, Apache FOP Intermediate Format или какой-то свой формат err in out nocopy blob --html c ошибками ) is --адрес http-запроса fopservlet varchar2(100) := ' timeout_in_seconds number:=60*60*10; --10 часов примеры разработки пользовательских отчетов
Поменяйте на адрес своего веб-сервера, который позже будет показано как создать fopservlet varchar2(100) := ' Если хотите поменяйте 60*60*10 на другое значение timeout_in_seconds number:=60*60*10; --10 часов Под пользователем SYS выполните BEGIN DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl => 'fop_access.xml', description => 'Permissions to access fop print server.', principal => 'PARUS', is_grant => TRUE, privilege => 'connect'); DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl => 'fop_access.xml', host => ' ', lower_port => 80, upper_port => 32000); END; Только сначала замените на адрес своего веб-сервера примеры разработки пользовательских отчетов
Теперь в своих пользовательских отчетах с типом Двоичные данные вы можете применять, например: GET_FOP_DOCUMENT2(xml => BRESULT, xslt => null, format => null, output => B_PDF, err => b_err); if dbms_lob.getlength(B_PDF) > 0 then insert into FILE_BUFFER (IDENT, FILENAME, bDATA) values (nprocess, '.pdf', B_PDF); else insert into FILE_BUFFER (IDENT, FILENAME, bDATA) values (nprocess, '.htm', b_err); end if; примеры разработки пользовательских отчетов
Притворимся сервером исключительно для красоты Узнаем свой ip-адрес командой ipconfig Исправляем файл C:\Windows\System32\drivers\etc\hosts Допишем строку пример развертывания Apache FOP как web-приложения
Из архива второго слайда презентации необходимо разархивировать файл fopserver.zip в отдельную папку для определенности в C:\fopserver\ пример развертывания Apache FOP как web-приложения
Скачиваем Apache FOP пример развертывания Apache FOP как web-приложения
Разархивируем Apache FOP для определенности в C:\fop-1.1\ Копируем файл C:\fop-1.1\build\fop.jar в C:\fopserver\WEB-INF\lib Копируем все файлы из C:\fop-1.1\lib в C:\fopserver\WEB-INF\lib пример развертывания Apache FOP как web-приложения
Скачиваем правила переноса слов пример развертывания Apache FOP как web-приложения
Из скачанного архива offo-hyphenation-binary.zip Копируем файл fop-hyph.jar в C:\fopserver\WEB-INF\lib пример развертывания Apache FOP как web-приложения
Скачиваем Apache Commons FileUpload fileupload/download_fileupload.cgi пример развертывания Apache FOP как web-приложения
Из скачанного архива, например commons-fileupload bin.tar.gz Копируем файл commons-fileupload jar в C:\fopserver\WEB-INF\lib пример развертывания Apache FOP как web-приложения
Вот примерно так будет выглядеть C:\fopserver\WEB-INF\lib пример развертывания Apache FOP как web-приложения
Смотрим файл C:\fopserver\WEB-INF\classes\logging.properties Выбираем какой нам нужен уровень информации Для разработчиков замените WARNING на INFO пример развертывания Apache FOP как web-приложения
Смотрим файл C:\fopserver\WEB-INF\web.xml Выбираем в какой папке будет располагаться файл с настройками Apache FOP пример развертывания Apache FOP как web-приложения
Выделяем в проводнике папки META-INF и WEB-INF Создаем архив fopserver.zip Проверяем, что при открытии архива нет лишних папок пример развертывания Apache FOP как web-приложения
Переименовываем C:\fopserver\fopserver.zip в fopserver.war Из архива второго слайда презентации скорируйте папку fopweb в папку, которую вы указали в C:\fopserver\WEB-INF\web.xml Если это папка не С:\fopweb, то исправьте conf\fop.xconf В папку fonts\ скопируйте из папки %WINDIR%\fonts файлы arial.ttf arialbd.ttf arialbi.ttf ariali.ttf ARIALN.TTF ARIALNB.TTF ARIALNBI.TTF ARIALNI.TTF CALIBRI.TTF CALIBRIB.TTF CALIBRII.TTF CALIBRIZ.TTF cour.ttf courbd.ttf courbi.ttf couri.ttf symbol.ttf tahoma.ttf tahomabd.ttf times.ttf timesbd.ttf timesbi.ttf timesi.ttf Как настраивать шрифты показано в этой презентации pps пример развертывания Apache FOP как web-приложения
Скачиваем Apache Tomcat пример развертывания Apache FOP как web-приложения
Разархивируем в C:\apache-tomcat Скопируем C:\fopserver\fopserver.war в C:\apache-tomcat \webapps пример развертывания Apache FOP как web-приложения
Скачаем и установим JDK пример развертывания Apache FOP как web-приложения
Установим переменную окружения JAVA_HOME пример развертывания Apache FOP как web-приложения
Выполним в проводнике C:\apache-tomcat \bin\startup.bat Или в cmd cd C:\apache-tomcat \bin startup.bat Откроется окно пример развертывания Apache FOP как web-приложения
Проверяем пример развертывания Apache FOP как web-приложения
Возле параметра XML нажмите кнопку Выберите файл Выберите любой файл из например C:\fop-1.1\examples\fo\basic пример развертывания Apache FOP как web-приложения
Должен открыться PDF пример развертывания Apache FOP как web-приложения
Настраиваем load balancing Переходим на пример развертывания Apache FOP как web-приложения
Настраиваем load balancing Читаем переходим пример развертывания Apache FOP как web-приложения
Настраиваем load balancing Переходим Скачиваем, например VC11. zip Скачиваем Распространяемый пакет Visual C++ для Visual Studio пример развертывания Apache FOP как web-приложения
Настраиваем load balancing Разархивируем файл httpd win64-VC11. zip Переписываем папку Apache24 в C:\ пример развертывания Apache FOP как web-приложения
Настраиваем load balancing Переходим на пример развертывания Apache FOP как web-приложения
Настраиваем load balancing Скачиваем, например, connectors/jk/binaries/windows/tomcat-connectors windows-x86_64- httpd-2.4.x.ziphttp:// connectors/jk/binaries/windows/tomcat-connectors windows-x86_64- httpd-2.4.x.zip Из архива файл mod_jk.so переписываем в каталог C:\Apache24\modules пример развертывания Apache FOP как web-приложения
Настраиваем load balancing Переписываем файлы из C:\apache-tomcat в C:\tomcat- cluster\node1 Переписываем файлы из C:\apache-tomcat в C:\tomcat- cluster\node2 Из архива второго слайда презентации переписываем содержимое файлов \loadbalancing\httpd.conf в C:\Apache24\conf\ httpd.conf \loadbalancing\workers.properties в C:\Apache24\conf\ workers.properties \loadbalancing\node1\server.xml в C:\tomcat-cluster\node1\conf\server.xml \loadbalancing\node2\server.xml в C:\tomcat-cluster\node2\conf\server.xml пример развертывания Apache FOP как web-приложения
Настраиваем load balancing В файле C:\tomcat-cluster\node1\webapps\examples\index.html Пишем node1 пример развертывания Apache FOP как web-приложения
Настраиваем load balancing В файле C:\tomcat-cluster\node2\webapps\examples\index.html Пишем node2 пример развертывания Apache FOP как web-приложения
Настраиваем load balancing Т.к. мы притворились то в httpd.conf пишем ServerName пример развертывания Apache FOP как web-приложения
Настраиваем load balancing Суть проделанных изменений у httpd Мы подключили и настроили модуль mod_jk LoadModule jk_module modules/mod_jk.so JkWorkersFile conf/workers.properties JkLogFile logs/mod_jk.log JkLogLevel warn JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories JkRequestLogFormat "%w %V %T" JkMount /examples/* loadbalancer JkMount /fopserver/* loadbalancer пример развертывания Apache FOP как web-приложения
Настраиваем load balancing В файле workers.properties прописали 2 сервера worker.list= node1, node2, loadbalancer worker.node1.port=8009 worker.node1.host= worker.node1.type=ajp13 worker.node1.lbfactor=1 worker.node2.port=8010 worker.node2.host= worker.node2.type=ajp13 worker.node2.lbfactor=1 worker.loadbalancer.type=lb worker.loadbalancer.balance_workers= node1, node2 worker.loadbalancer.sticky_session= False пример развертывания Apache FOP как web-приложения
Настраиваем load balancing В файлах server.xml Комментируем У node1 У node2 пример развертывания Apache FOP как web-приложения
Из проводника запускаем C:\Apache24\bin\httpd.exe C:\tomcat-cluster\node1\bin\startup.bat C:\tomcat-cluster\node2\bin\startup.bat пример развертывания Apache FOP как web-приложения
Проверяем Обновляем страницу Должно поменяться: node1 на node2 пример развертывания Apache FOP как web-приложения
Проверяем пример развертывания Apache FOP как web-приложения
СПАСИБО ЗА ВНИМАНИЕ «Корпорация ПАРУС», , Москва, ул. Ярославская, д.10 корп.4, (495) ,