Я пытаюсь использовать шрифт, который не установлен на моей локальной ОС с 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
; тем не менее я не знаю, где ошибка или проблема находятся. Любая справка значительно ценилась бы.
Заранее спасибо! (жаль о плохом добавлении отступа кода и я надеюсь, что включал достаточно деталей),
Проблема заключалась в том, что загрузка банок расширений шрифтов происходит из загрузчика классов контекста потока и из JRParameter.REPORT_CLASS_LOADER
, ни из JRExporterParameter.CLASS_LOADER
.
Поэтому в моем случае необходимо было сохранить текущий (начальный) загрузчик классов потока, для чего нужно было сделать что-то вроде Thread.currentThread().setContextClassLoader(cl)
, где cl
был контекстом приложения, основанного на JasperReports
, а затем загрузчик классов контекста потока был возвращен к исходному.
На этот вопрос был дан ответ, и подробности доступны здесь.
Я надеюсь, что этот ответ поможет другим людям, столкнувшимся с подобными (шрифтовыми) проблемами.