barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)
Показаны сообщения с ярлыком BIRT Report Viewer. Показать все сообщения
Показаны сообщения с ярлыком BIRT Report Viewer. Показать все сообщения

воскресенье, 27 декабря 2015 г.

SLES и birt: русские буквы в pdf

Проблема

Есть SLES, на нем установлен Tomcat, на котором крутится Birt Report Viewer. На последнем задеплоен отчет, используемый для генерации pdf-файлов, содержащих русский текст. Проблема заключается в том, что русские символы в отчете выгружаются моноширинным шрифтом, причем вне зависимости от того, какой шрифт указан в самом отчете (Calibri, Arial или просто sans-serif).

Решение

Устанавливаем пакет msttcorefonts (http://software.opensuse.org/download.html?project=home%3Acsa7fff%3Aadei&package=msttcorefonts), он распакует в /usr/share/fonts/msttcorefonts некоторый набор TrueType-шрифтов. 
Следующая задача - указать Birt'у на эту папку. Делается это путем правки файла WEB-INF/lib/org.eclipse.birt.runtime_4.5.0.jar/fontsConfig.xml. Этот файл содержит блок <font-paths> с перечнем путей, по которым birt ищет шрифты. Все имеющиеся там записи можно удалить, и добавить одну новую:
<path path="/usr/share/fonts/msttcorefonts" />
Вуаля, шрифты, которые есть в папке /usr/share/fonts/msttcorefonts, можно использовать в отчетах.
ЗЫ Вообще, в файлах fontsConfig.xml, fontsConfig_pdf.xml и fontsConfig_linux.xml есть и другие настройки, которые могут оказаться полезными: например, можно выбрать, какой шрифт будет использоваться при указании семейства "serif", указать fallback-шрифт, используемый, когда для символа невозможно найти глиф в указанном шрифте (<composite-font name="all-fonts"  ... />) и пр.

Birt Report Viewer: логирование

Чтобы получить максимальный уровень логирования для Birt Report Viewer'а, необходимо в его web.xml задать значение параметра BIRT_VIEWER_LOG_LEVEL равным FINEST:
<context-param>
<param-name>BIRT_VIEWER_LOG_LEVEL</param-name>
<param-value>FINEST</param-value>
</context-param>
Логи пишутся в папку log корня развертывания веб-приложения. 

среда, 26 сентября 2012 г.

BIRT Report Viewer 4.2 на Tomcat 6: проблема с default workspace и объявлениями JDBC драйверов

Проблема:

На Tomcat 6 развернут BIRT Report Viewer 4.2 (просто взят и развернут WAR-ник из Birt Runtime). Однако при попытке просмотреть какой-либо отчет в интерфейс выдается невнятная ошибка:
Can not load the report query
, а в лог logs/ReportEngine_xxx.log, расположенный в корне веб-приложения, валится исключение:
SEVERE: Unable to open connection.
org.eclipse.datatools.connectivity.oda.OdaException ;
    java.lang.IllegalStateException: Unable to determine the default workspace location.  Check your OSGi-less platform configuration of the plugin or datatools workspace path.
...
Причина:

BIRT`у необходимо указать путь к default workspace`у, без него он работать не может (в простейшем случае workspace - просто пустая папка). Сделать это можно либо через переменную окружения, либо через системное свойство, второй способ, как по мне, более логичен. Для этого в init.d-скрипт томката (/etc/init.d/tomcat6) я добавил нужную опцию к уже имевшимся там ранее:
JAVA_OPTS="-Djava.awt.headless=true -Xmx256M -XX:MaxPermSize=512m -XX:PermSize=128m -XX:+UseConcMarkSweepGC
-Dorg.eclipse.datatools_workspacepath=$CATALINA_BASE/workspace_dtp"
Папку $CATALINA_BASE/workspace_dtp необходимо создать и убедиться, что у томката будут права на запись в неё.
Кстати, эта директория пригодится, чтобы, например, положить в неё файл с определениями JDBC-драйверов, без которых отчеты, использующие соединения с БД, будут валится с исключениями:
SEVERE: Unable to open connection.
org.eclipse.datatools.connectivity.oda.OdaException ;
    java.lang.Exception: Driver definition could not be found.
...
Caused by: java.lang.Exception: Driver definition could not be found.
...
Caused by: java.lang.Throwable: DriverConnectionBase.error.driverDefinitionNotFound
...
, даже если в самом отчете в <property name="jarList"> указан путь к jar-нику. Файл определения JDBC-драйверов называется driverStorage.xml и располагается в подпапке org.eclipse.datatools.connectivity. Его можно скопировать с машины, на которой производится разработка отчетов, исправив пути к jar-никам драйверов (записи о ненужных драйверах можно удалить). Вот пример содержимого этого файла для одного единственного postgresql-драйвера:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<DataTools.PropertySets>
<propertySet iD="DriverDefn.org.eclipse.datatools.enablement.postgresql.postgresqlDriverTemplate.PostgreSQL JDBC Driver" keys="org.eclipse.datatools.connectivity.drivers.defnType jarList org.eclipse.datatools.connectivity.db.username org.eclipse.datatools.connectivity.db.driverClass org.eclipse.datatools.connectivity.db.databaseName org.eclipse.datatools.connectivity.db.password org.eclipse.datatools.connectivity.db.URL org.eclipse.datatools.connectivity.db.version org.eclipse.datatools.connectivity.db.vendor " name="PostgreSQL JDBC Driver" prop_jarList="/var/lib/tomcat6/workspace_dtp/postgresql-8.4-701.jdbc4.jar" prop_org.eclipse.datatools.connectivity.db.URL="jdbc:postgresql://localhost:5432/database" prop_org.eclipse.datatools.connectivity.db.databaseName="database" prop_org.eclipse.datatools.connectivity.db.driverClass="org.postgresql.Driver" prop_org.eclipse.datatools.connectivity.db.password="" prop_org.eclipse.datatools.connectivity.db.username="pg" prop_org.eclipse.datatools.connectivity.db.vendor="postgres" prop_org.eclipse.datatools.connectivity.db.version="8.x" prop_org.eclipse.datatools.connectivity.drivers.defnType="org.eclipse.datatools.enablement.postgresql.postgresqlDriverTemplate"/>
</DataTools.PropertySets>