JasperReports: как добавить шрифт не в путь к классам приложения

Я пытаюсь использовать шрифт, который не установлен в моей локальной ОС, с расширением JasperReports. Отчет о яшме использует таким образом:

<textField>  
  <reportElement x="0" y="0" width="137" height="20"/>  
        <textElement>  
    <font fontName="Corbel" size="12"/>  
    </textElement>  
    <textFieldExpression class="java.lang.String"><![CDATA[$F{something}]]></textFieldExpression>  
</textField>

Шрифт с именем Corbel был экспортирован как расширение шрифта (с помощью iReport) и содержится в файле (Corbel.jar) в папке в моей системе. Я добавляю это расширение в путь к классам приложения, используя следующий код:

ClassLoader cl = new URLClassLoader(new URL[] {new URL("file:///D:/path/to/Corbel_jar_folder/")});  
param = new HashMap();    
param.put(JRParameter.REPORT_CLASS_LOADER, cl);  
jasperReport = JasperCompileManager.compileReport("d:/path/to/Report_with_Corbel_font.jrxml");  
jasperPrint = JasperFillManager.fillReport(jasperReport, param, new JREmptyDataSource());

После заполнения отчета я экспортирую его с помощью файла JRPdfExporter. Однако в результирующем PDF-файле к элементу не применен шрифт Corbel. Экспорт в пдф не включал, так как думаю, что проблема где-то с начинкой. Я искал и читал многочисленные сообщения и вопросы, связанные с использованием/включением шрифтов (т.е. расширений шрифтов) в JasperReports; до сих пор я не знаю, где ошибка или проблема. Любая помощь будет принята с благодарностью.

Заранее спасибо! (извините за плохой отступ кода, и я надеюсь, что я включил достаточно деталей)


person acostache    schedule 30.06.2010    source источник


Ответы (3)


Проблема заключалась в том, что загрузка jar-файлов расширений шрифтов выполняется из загрузчика классов контекста потока и из файлов JRParameter.REPORT_CLASS_LOADER и JRExporterParameter.CLASS_LOADER.

Поэтому в моем случае текущий (начальный) загрузчик классов потока должен был быть сохранен, нам пришлось сделать что-то вроде Thread.currentThread().setContextClassLoader(cl), где cl был контекстом приложения на основе JasperReports, а затем загрузчик классов контекста потока был возвращен к исходному.

На вопрос дан ответ, и подробная информация доступна здесь .

Я надеюсь, что этот ответ поможет другим, столкнувшимся с подобными проблемами (шрифта).

person acostache    schedule 05.07.2010

Отчеты Jasper: добавление пользовательских шрифтов

  1. Получите файлы шрифтов, которые вы хотите использовать ( TTF, EOT, SVG или WOFF (OTF, преобразованный в TTF, также работает))
  2. Добавьте шрифты в Jaspersoft Studio (или iReport) с помощью пользовательского интерфейса. (Окно->Настройки->Jaspersoft Studio->Шрифты)

    Добавить шрифт

    Вам нужно дать детали, как на изображении. Специальное поле имени шрифта PDF вводит в заблуждение. Нам нужно указать здесь путь для этого шрифта в файле font-extention.jar, который мы создадим на следующем шаге.

    Теперь вы можете предварительно просмотреть шрифт в своем отчете.

    Шрифт добавлен

  3. Экспортируйте шрифты в файл fonts-extention.jar для использования в вашем приложении. Выберите и экспортируйте необходимые шрифты. (Окно->Настройки->Jaspersoft Studio->Шрифты->Выбрать и экспортировать)

  4. Позаботьтесь об интеграции банки в вашу сборку. Если вы используете maven для своего проекта, вы можете интегрировать его следующим образом.

        <dependency>
           <groupId>local.jasperFont</groupId>
           <artifactId>local.jasperFont</artifactId>
           <version>1.0</version>
           <scope>system</scope>
           <systemPath>${basedir}/src/main/resources/reports/fonts-extension.jar</systemPath>
        </dependency>

И добавьте fonts-extension.jar в каталог ресурсов/отчетов проекта.

person Dhanushka Lahiru    schedule 01.08.2018

Мы могли бы использовать шрифты Google Noto с Jasper с помощью этих шагов.

  1. Упаковка семейства NotoSans в файл jar, как указано в документации Jasper.

  2. Загрузил эту банку в наш репозиторий maven

  3. Определить зависимость в pom
<dependency>
  <groupId>com.crunchtime.shared.fonts</groupId>
  <artifactId>notosans</artifactId>
  <version>1.0</version>
</dependency>
  1. А потом использовать в нашем. Я думаю, это самая сложная часть, но вот как мы это сделали.

частная статическая конечная строка DEFAULT_PDF_STYLE = "defaultPdf";

частная статическая финальная строка DEFAULT_FONT_FAMILY = "NotoSans";

private static final String CJK_FONT = "fonts/NotoSansCJKtc-Regular.otf";

   if (language-other-than-English) {
        defaultStyle.setPdfFontName(CJK_FONT);
    } else {
        defaultStyle.setFontName(DEFAULT_FONT_FAMILY);
    }

Мы видели это исключение нулевого указателя, но ключ был в том, чтобы явно установить шрифт для pdf.

person vsingh    schedule 09.04.2019