Расширение шрифта не работает для шрифта OTF - JasperReports 4.7.1

Я следовал всем примерам, которые смог найти в Интернете, чтобы встроить шрифт OTF в сгенерированный PDF-файл, но это не сработало. Я создал расширение шрифта .jar с помощью iReport (я также создал maven jar для шрифтов вручную), но оно не работает со шрифтами OTF. Я также убедился, что файл jasper-fonts-extension.jar находится в пути к классам. Я знаю это, потому что когда я заменяю этот шрифт другими шрифтами TTF, он просто работает.

Я бегу дальше -

Jasper Reports & iReport Version : 4.7.1
Oracle Java SDK 7
Ubuntu 12.04

Шрифт, который я пытаюсь встроить в PDF — Myraid Pro (OTF)

Мой fonts.xml выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
   <fontFamily name="Myriad Pro">
   <normal><![CDATA[fonts/MyriadPro-Regular.otf]]></normal>
   <bold><![CDATA[fonts/MYRIADPRO-BOLD.OTF]]></bold>
   <italic><![CDATA[fonts/MYRIADPRO-CONDIT.OTF]]></italic>
   <boldItalic><![CDATA[fonts/MYRIADPRO-BOLDIT.OTF]]></boldItalic>
   <pdfEmbedded><![CDATA[true]]></pdfEmbedded>
   </fontFamily>
   <fontFamily name="Myriad Pro Lite">
      <normal><![CDATA[fonts/MYRIADPRO-COND.OTF]]></normal>
      <pdfEmbedded><![CDATA[true]]></pdfEmbedded>
   </fontFamily>
</fontFamilies>

Это работало с другими шрифтами TTF, но когда я переключаюсь на шрифты MyraidPro, я получаю следующую ошибку

Exception in thread "main" java.lang.ExceptionInInitializerError
at net.sf.jasperreports.engine.fill.JRBaseFiller.<init>(JRBaseFiller.java:121)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:88)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:103)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:61)
at net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:153)
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:122)
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:464)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:861)
at com.qedrix.formbuilder.pojo.JsonForm.main(JsonForm.java:141)

Причина: net.sf.jasperreports.engine.util.JRFontNotFoundException: шрифт fonts/MyriadPro-Regular.otf недоступен для JVM.

Я также выполнил шаги, указанные в следующей ссылке: здесь

Если это как-то связано со шрифтами OTF, мне интересно, почему это не работает при экспорте PDF в Java, хотя работает в Режим просмотра iReport?


person Qedrix    schedule 25.02.2014    source источник
comment
Это должно помочь stackoverflow.com/questions/3151562/   -  person vsingh    schedule 09.04.2019


Ответы (2)


Я думаю, что это небольшая ошибка в JasperReports. Запись в "fonts.xml"

<normal><ttf>fonts/OfficinaSansStd-Book.otf</ttf></normal>

выдает исключение. Если вы ПЕРЕИМЕНОВАЕТЕ свой файл шрифта и измените запись на

<normal><ttf>fonts/OfficinaSansStd-Book.ttf</ttf></normal>

он отлично работает со мной.

person Thilo Bretschneider    schedule 18.04.2014
comment
Спасибо @Thilo после переименования OTF в TTF заработало в java и ireport 5.2.0 - person Anand; 31.12.2015

Я считаю, что вам нужно следовать следующему ответу, чтобы эти шрифты работали в формате PDF. Использовать пользовательские шрифты при создании pdf с помощью iReport

Также вы можете следить за тем, какие вызовы файлов используются приложением для поиска шрифта. Я рекомендую strace для Linux.

person Israel Lopez    schedule 28.02.2014
comment
Спасибо. Я уже перешел по этой ссылке (я упомянул об этом в своем посте в конце). Это не помогло. Я слышал, что у Java есть проблемы с обработкой шрифтов otf с кодировкой Adobe 1; но я не могу подтвердить. Ваше последнее заявление - не могли бы вы объяснить немного больше, пожалуйста? - person Qedrix; 04.03.2014
comment
Правильно, в большинстве ОС вы можете регистрировать активность файлов, чтобы узнать, какие вызовы файлов делает приложение. Скорее всего, Java проходит известный набор путей, чтобы найти это имя шрифта/файла. strace — это такая команда, которая в Linux будет регистрировать, что делает приложение. См.: stackoverflow.com/questions/10384850/ - person Israel Lopez; 04.03.2014