среда, 17 мая 2017 г.

Как заставить jasperreport говорить по-русски?


Для того, чтобы jasper-отчеты  отображали русский текст, необходимо:
1.       Добавить шрифт, имеющий кодировку 1251
2.       Убедиться, что текущая локаль в коде русская, если шрифт её требует.

Создание шрифта

Необходимо добавить шрифт в ireport для шаблонов:  http://community.jaspersoft.com/wiki/how-show-cyrillic-letters-pdf

Далее требуется создать расширение шрифта (jar), которое необходимо добавить в classpath проекта. Его можно создавать как в ручную, так и воспользовавшись средствами ireport.

Создать средствами ireport:
Инструкция от техподдержки jasper здесь: http://community.jaspersoft.com/wiki/how-render-cyrillic-symbols-pdf-and-jrxml-report-jasperreports-library-custom-java-application
Краткий пересказ:
1.       Установить ireport и запустить от имени Администратора (если windows)
2.       Скачать шрифт в формате ttf (можно по ссылке сверху)
3.       Открыть TOOLS-OPTIONS-IREPORT-FONTS нажать на кнопку «INSTALL FONT», далее следовать указаниям мастера:
3.1   Выбрать шрифт ttf, нажать NEXT
3.2   Указать имя В FAMILY NAME,  по нему шрифт можно будет найти в ireport и использовать для текста шаблонов, если есть вариации шрифта (жирный, курсив и жирный курсив), то добавить, указать кодировку 1251 и поставить отметку «Embed this font in the PDF-document», нажать NEXT
3.3   Добавить локаль (если не добавлять ничего, то шрифт будет работать со всеми), нажать NEXT
3.4   Finish
3.5   Выделить появившийся шрифт и нажать кнопку "Export as extention". Сохранить jar. 

Создать jar cо шрифтом вручную: 
Подробная инструкция по ссылке:
http://jasperreports.sourceforge.net/sample.reference/fonts/index.html#fontextensions

Данный шрифт надо использовать для текста в при генерации шаблонов  в ireport, а созданный jar добавить в classpath проекта.
Если проект собирается maven-ом, то можно распаковать jar-архив и его содержимое (папку fonts и jasperreports_extension.properties) добавить в src/main/resources.


Если шаблоны отчетов планируется хранить также в src/main/resources, то эту директорию следует исключить из фильтрации, добавив следующую запись в pom.xml:

<build>

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>false</filtering>
        </resource>   
    </resources>
</build>


Итак, шрифт создан и применяется в тексте шаблонов отчетов, а также добавлен в java-проект.
Как правило, этого достаточно для отображения кириллических букв. Если нет, то можно указать в коде принудительно русскую локаль (или ту, которая указана в шрифте).


Локаль


Если при создании шрифта была указана русская локаль (в сгенерированном xml-файле из папки fonts есть строка <locale><![CDATA[ru_RU]]></locale>), то необходимо её указать в коде. 
Для начала следует посмотреть, какая используется в программе, выведите в лог или stdout Locale.getDefault();

Установить русскую локаль можно двумя способами:
1.      Задать принудительно:

Locale.setDefault(new Locale("ru", "RU"));

2.      Передать параметрами джаспера:

Map parameters = new HashMap();
parameters.put(JRParameter.REPORT_LOCALE, new Locale("ru", "RU"));

Предпочтительнее пользоваться вторым способом, поскольку остальные части программы могут требовать английский язык.