错误描述
在ireports模板设计中设置字体加粗样式,预览时样式生效,但是在Java程序导出PDF时样式都不生效;于是在网上查询了很多资料发现确实有这个问题,找了好多解决方案来尝试都没有成功。
问题发现
查看jasperreports-6.0.0.jar源码net.sf.jasperreports.engine.export包中JRPdfExporter.class文件中设置样式部分
FontInfo fontInfo = FontUtil.getInstance(jasperReportsContext).getFontInfo(jrFont.getFontName(), locale)方法内容:
在断点测试中发现行2034行fontInfo返回一直为null,所以pdf导出样式状态一直为false这样在模板中设置样式就失效了
最后在源码中找到了jasperReports字体样式配置文件jasperreports-fonts.xml,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="Pictonic" visible="false">
<normal>
<ttf>net/sf/jasperreports/fonts/pictonic/pictonic.ttf</ttf>
<svg>net/sf/jasperreports/fonts/pictonic/pictonic.svg</svg>
<eot>net/sf/jasperreports/fonts/pictonic/pictonic.eot</eot>
<woff>net/sf/jasperreports/fonts/pictonic/pictonic.woff</woff>
</normal>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
</fontFamily>
</fontFamilies>
只有一个pictonic字体;
解决方法
查看字体样式构造处理逻辑后打算添加一个字体,这个字体其他配置不设置默认;由于导出PDF时要求特殊设置了字体
使得在模板设置字体Foint name失效
解决方法
在程序根目录添加包net.sf.jasperreports.fonts,添加文件jasperreports-fonts.xml
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="Pictonic" visible="false">
<normal>
<ttf>net/sf/jasperreports/fonts/pictonic/pictonic.ttf</ttf>
<svg>net/sf/jasperreports/fonts/pictonic/pictonic.svg</svg>
<eot>net/sf/jasperreports/fonts/pictonic/pictonic.eot</eot>
<woff>net/sf/jasperreports/fonts/pictonic/pictonic.woff</woff>
</normal>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
</fontFamily>
<!--根据模板中设置的Foint name的值设置fantFamily的name属性 -->
<fontFamily name="SansSerif" visible="false">
<normal>
</normal>
</fontFamily>
</fontFamilies>