Не работают шрифты при развертывании jasperreport в PDF из веб-приложения
У меня возникают проблемы со шрифтами при развертывании отчетов в моем веб-приложении. Шрифты, которые я хочу иметь в своих PDF-файлах результатов, - Arial, Calibri и Century Gothic.
Я выполнил все шаги, указанные здесь, но не смог заставить его работать.
Вот что я сделал:
Я изменил содержимое моих jasperreports_extension.properties следующим образом:
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.dejavu=net/sf/jasperreports/fonts/fonts.xml
net.sf.jasperreports.extension.simple.font.families.arial=net/sf/jasperreports/fonts/fonts.xml
net.sf.jasperreports.extension.simple.font.families.calibri=net/sf/jasperreports/fonts/fonts.xml
net.sf.jasperreports.extension.simple.font.families.centurygothic=net/sf/jasperreports/fonts/fonts.xml
Затем в net\sf\jasperreports\fonts я поместил три папки для шрифтов, содержащие четыре стиля (обычный, полужирный, курсив и полужирный курсив) для каждого из ранее упомянутых шрифтов.
Кроме того, изменил файл fonts.xml в net/sf/jasperreports/fonts, и теперь он выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="DejaVu Sans">
<normal>net/sf/jasperreports/fonts/dejavu/DejaVuSans.ttf</normal>
<bold>net/sf/jasperreports/fonts/dejavu/DejaVuSans-Bold.ttf</bold>
<italic>net/sf/jasperreports/fonts/dejavu/DejaVuSans-Oblique.ttf</italic>
<boldItalic>net/sf/jasperreports/fonts/dejavu/DejaVuSans-BoldOblique.ttf</boldItalic>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
<exportFonts>
<export key="net.sf.jasperreports.html">'DejaVu Sans', Arial, Helvetica, sans-serif</export>
<export key="net.sf.jasperreports.xhtml">'DejaVu Sans', Arial, Helvetica, sans-serif</export>
</exportFonts>
<!--
<locales>
<locale>en_US</locale>
<locale>de_DE</locale>
</locales>
-->
</fontFamily>
<fontFamily name="DejaVu Serif">
<normal>net/sf/jasperreports/fonts/dejavu/DejaVuSerif.ttf</normal>
<bold>net/sf/jasperreports/fonts/dejavu/DejaVuSerif-Bold.ttf</bold>
<italic>net/sf/jasperreports/fonts/dejavu/DejaVuSerif-Italic.ttf</italic>
<boldItalic>net/sf/jasperreports/fonts/dejavu/DejaVuSerif-BoldItalic.ttf</boldItalic>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
<exportFonts>
<export key="net.sf.jasperreports.html">'DejaVu Serif', 'Times New Roman', Times, serif</export>
<export key="net.sf.jasperreports.xhtml">'DejaVu Serif', 'Times New Roman', Times, serif</export>
</exportFonts>
</fontFamily>
<fontFamily name="DejaVu Sans Mono">
<normal>net/sf/jasperreports/fonts/dejavu/DejaVuSansMono.ttf</normal>
<bold>net/sf/jasperreports/fonts/dejavu/DejaVuSansMono-Bold.ttf</bold>
<italic>net/sf/jasperreports/fonts/dejavu/DejaVuSansMono-Oblique.ttf</italic>
<boldItalic>net/sf/jasperreports/fonts/dejavu/DejaVuSansMono-BoldOblique.ttf</boldItalic>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
<exportFonts>
<export key="net.sf.jasperreports.html">'DejaVu Sans Mono', 'Courier New', Courier, monospace</export>
<export key="net.sf.jasperreports.xhtml">'DejaVu Sans Mono', 'Courier New', Courier, monospace</export>
</exportFonts>
</fontFamily>
<!--
Mapping Java logical fonts, for the sake of HTML export only.
-->
<fontFamily name="SansSerif">
<exportFonts>
<export key="net.sf.jasperreports.html">'DejaVu Sans', Arial, Helvetica, sans-serif</export>
<export key="net.sf.jasperreports.xhtml">'DejaVu Sans', Arial, Helvetica, sans-serif</export>
</exportFonts>
</fontFamily>
<fontFamily name="Serif">
<exportFonts>
<export key="net.sf.jasperreports.html">'DejaVu Serif', 'Times New Roman', Times, serif</export>
<export key="net.sf.jasperreports.xhtml">'DejaVu Serif', 'Times New Roman', Times, serif</export>
</exportFonts>
</fontFamily>
<fontFamily name="Monospaced">
<exportFonts>
<export key="net.sf.jasperreports.html">'DejaVu Sans Mono', 'Courier New', Courier, monospace</export>
<export key="net.sf.jasperreports.xhtml">'DejaVu Sans Mono', 'Courier New', Courier, monospace</export>
</exportFonts>
</fontFamily>
<fontFamily name="Arial">
<normal>net/sf/jasperreports/fonts/arial/arial.ttf</normal>
<bold>net/sf/jasperreports/fonts/arial/ArialBold.ttf</bold>
<italic>net/sf/jasperreports/fonts/arial/ArialItalic.ttf</italic>
<boldItalic>net/sf/jasperreports/fonts/arial/ArialBoldItalic.ttf</boldItalic>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
<exportFonts>
<export key="net.sf.jasperreports.html">'Arial'</export>
<export key="net.sf.jasperreports.xhtml">'Arial'</export>
</exportFonts>
</fontFamily>
<fontFamily name="Calibri">
<normal>net/sf/jasperreports/fonts/calibri/calibri.ttf</normal>
<bold>net/sf/jasperreports/fonts/calibri/calibri-bold.ttf</bold>
<italic>net/sf/jasperreports/fonts/calibri/calibri-italic.ttf</italic>
<boldItalic>net/sf/jasperreports/fonts/calibri/calibri-bold-italic.ttf</boldItalic>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
<exportFonts>
<export key="net.sf.jasperreports.html">'Calibri'</export>
<export key="net.sf.jasperreports.xhtml">'Calibri'</export>
</exportFonts>
</fontFamily>
<fontFamily name="Century Gothic">
<normal>net/sf/jasperreports/fonts/centurygothic/century-gothic.ttf</normal>
<bold>net/sf/jasperreports/fonts/centurygothic/century-gothic-bold.ttf</bold>
<italic>net/sf/jasperreports/fonts/centurygothic/century-gothic-italic.ttf</italic>
<boldItalic>net/sf/jasperreports/fonts/centurygothic/century-gothic-bold-italic.ttf</boldItalic>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
<exportFonts>
<export key="net.sf.jasperreports.html">'Century Gothic'</export>
<export key="net.sf.jasperreports.xhtml">'Century Gothic'</export>
</exportFonts>
</fontFamily>
</fontFamilies>
Обратите внимание, что я только что добавил последние три шрифта.
После этого я подготовил файл jar и поместил его в classpath своего приложения как обязательный. Пока что я только что экспортировал отчет с обычным шрифтом Sanserif...
Я не знаю, что я делаю не так, есть идеи?
Спасибо!
Краткая справка: я использую Jaspersoft Studio Community Edition (6.3.0), и мое приложение развернуто на сервере JBoss.
2 ответа
Я наконец узнал, что происходит в моем случае, и теперь это работает.
Когда я ввел шрифты (расширение.ttf) в Jaspersoft Studio Windows-> Preferences-> Fonts, я выбрал неправильное значение для комбинации выбора кодировки PDF. Сначала я выбрал CP1252 (западноевропейский ANSI или WinAnsi), который НЕПРАВИЛЬНО, если вы хотите экспортировать отчеты в PDF, затем я выбрал Identity-H (Unicode с горизонтальной записью) вместо этого, и он работал нормально.
Однако чего я до сих пор не понимаю: если в своем отчете я использую только шрифты Calibri и Century Gothic, почему на земле, когда я иду, чтобы увидеть шрифты, используемые в моем PDF (Файл-> Свойства-> Шрифты), я получить также Helvetica в списке используемых шрифтов?
- Экспорт шрифта из отчета Jasper как расширение (.jar) (инструмент / опция / шрифты).
Добавьте экспортированный jar шрифтов в ваш проект.
https://community.jaspersoft.com/wiki/how-fix-problem-custom-fonts-jasperreports-server
Включив нижеприведенную зависимость maven в ваш pom, жирный стиль будет показан в сгенерированном PDF
<dependency>
<groupid>net.sf.jasperreports</groupid>
<artifactid>jasperreports-fonts</artifactid>
<version>6.0.0</version>
</dependency>