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

Я пытаюсь использовать шрифт, который не установлен на моей локальной ОС с a 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());

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

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

6
задан Alex K 3 June 2018 в 21:34
поделиться

1 ответ

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

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

На этот вопрос был дан ответ, и подробности доступны здесь.

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

7
ответ дан 17 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: