问题描述
JasperReport是一个纯Java写的开源免费报表工具库,有着易于学习,轻松上手的特点。使用过程就是先在它的报表的设计软件TIBCO Jaspersoft Studio(以前是IReport)里设计报表,然后编译jrxml,把生成的jasper文件拷贝到我们的web工程资源目录下,然后再调用jasper的api生成pdf即可。但是国外的东西就是有个不好的地方,生成PDF的时候中文不支持,所以得针对中文做下特殊处理。
JasperReport在用TIBCO Jaspersoft Studio进行报表设计的时候默认采用的字体是SansSerif,中文并不在其处理范围之内,这边我们把字体显示设置为华文宋体,如下图:

查看报表jrxml模板源代码可看到已经显示加了华文宋体。
1 2 3 4 5 6 7 |
<staticText> <reportElement x="20" y="7" width="68" height="32" uuid="c0240cf1-84c7-4197-b32e-dc59cbb77c66"/> <textElement textAlignment="Center" verticalAlignment="Middle"> <font fontName="华文宋体" size="19"/> </textElement> <text><![CDATA[姓名]]></text> </staticText> |
解决方法
报表模板文件中显示设置中文字体,生成PDF文件的时候中文其实还是不会显示,因为JasperRepeat的包中压根就没有华文宋体的字体库STSONG.TTF,需要在工程中放入该字体库,并配置JasperReport的字体模板fonts.xml,添加配置文件jasperreports_extension.properties
指明字体处理工厂类和字体模板。
Windows操作系统中的字体文件可以在C:\Windows\Fonts
目录下找到,华文宋体的字体文件STSONG.TTF就在该目录下面。
工程结构如下图:

fonts.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?xml version="1.0" encoding="UTF-8"?> <fontFamilies> <fontFamily name="华文宋体"> <normal>fonts/STSONG.TTF</normal> <bold>fonts/STSONG.TTF</bold> <italic>fonts/STSONG.TTF</italic> <boldItalic>fonts/STSONG.TTF</boldItalic> <pdfEncoding>Identity-H</pdfEncoding> <pdfEmbedded>true</pdfEmbedded> <exportFonts> <export key="net.sf.jasperreports.html">'华文宋体', Arial, Helvetica, sans-serif</export> <export key="net.sf.jasperreports.xhtml">'华文宋体', Arial, Helvetica, sans-serif</export> </exportFonts> </fontFamily> </fontFamilies> |
jasperreports_extension.properties
1 2 |
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory net.sf.jasperreports.extension.simple.font.families.lobstertwo=fonts/fonts.xml |
经过上述处理后,再生成PDF文件,中文已经可以正常显示了。

中文字体下载
链接:https://pan.baidu.com/s/1HAe0Vt92HnBY-TgMyF9pgA
提取码:r0yq