ⓘ
JasperReports输出PDF的时候,使用的是iText组件,天生对中文支持极弱。网上很多的解决方案是导入iTextAsian包,但这个包只能使用宋体。最合适的解决方案是使用TTF字体,这样汉字的字体就可以完美解决。
一、自定义字体文件
前面几篇文章,介绍了如何使用JasperReport开发报表,可以发现,我们之前的模板文件都是使用的英文,从来没有写过中文,这是因为,默认情况下,JasperReport是不支持显示中文,如果要显示中文,那么我们就需要自己指定采用的字体文件,下面就介绍一下,如何自定义字体文件,显示中文内容。
1.1、创建字体配置文件
在SpringBoot工程中的【src/main/resource】目录下,新建一个【jasperreports_extension.properties】配置文件,这个配置文件是JasperReport的扩展配置文件,在该文件中添加字体相关的配置信息。
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.default=fonts/fonts.xml
1.2、创建fonts.xml字体文件
在当前项目的工作空间下(可以在IDEA中指定工作目录路径),创建【fonts】目录,并且新建一个【fonts.xml】字体配置文件,在该文件中指定使用到的一些字体文件路径以及字体名称,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="MSYaHei">
<normal><![CDATA[fonts/MSYaHei/MSYaHei.ttf]]></normal>
<bold><![CDATA[fonts/MSYaHei/MSYaHei_bold.ttf]]></bold>
<italic><![CDATA[fonts/MSYaHei/MSYaHei.ttf]]></italic>
<bolditalic><![CDATA[fonts/MSYaHei/MSYaHei.ttf]]></bolditalic>
<pdfEmbedded><![CDATA[true]]></pdfEmbedded>
<pdfEncoding>Identity-H</pdfEncoding>
<exportFonts/>
</fontFamily>
</fontFamilies>
在fonts目录下创建对应字体的保存目录,就拿上面的为案例,指定了一个微软雅黑的字体,并且路径是在【fonts/MSYaHei】目录下。那就把我们下载的微软雅黑字体文件,放入这个目录下面。图中【working-dir】目录是我IDEA中指定的工作目录,可以自己指定:
1.3、在Jasper Studio中添加字体
当我们在制作模板文件的时候,指定的字体文件就要和我们IDEA中使用的一致,不然运行时候,就会报错。打开Jasper Studio,点击【File -> Properties】选项,如下:
在弹出窗口中,选择【Jaspersoft Studio】,继续选择下面的【Fonts】,这里就是设置字体的,如下所示:
选择【Using Project Settings】,然后选择【Add】按钮,这个就是添加我们刚刚下载的字体文件:
在弹出框中,输入字体名称,选择我们刚刚下载的字体文件路径,如下所示:
点击【Finish】之后,就可以看到我们刚刚添加的字体,之后点击close就可以啦。
到此,Jasper Studio中字体就添加好啦,下面就是在制作模板文件时候,使用我们刚刚添加的字体就可以。
1.4、指定模板文件
新建一个【FontDemo.jrxml】模板文件,添加几个Static Text、Text Filed组件,可以写几个中文,然后选择字体是微软雅黑,也就是我们刚刚添加的字体。
模板文件中使用字体文件还是比较简单的,关键是需要确保Jasper模板文件中使用的字体名称,要和我们Java代码中指定的字体相同。
1.5、案例代码
在Java代码中,就可以根据模板文件导出PDF啦,如下所示:
package com.gitcode.demo.web;
import com.gitcode.demo.util.JasperReportsUtil;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/api/report")
public class FontDemoController {
@GetMapping("/font-demo")
public String fontDemo(String format) throws Exception {
ClassPathResource resource = new ClassPathResource("jasper/FontDemo.jasper");
String templatePath = resource.getPath();
String fileName = "中文字体案例";
Map<String, Object> parameters = new HashMap<>();
parameters.put("name", "Jasper");
parameters.put("age", 20);
parameters.put("sex", "男");
parameters.put("nation", "中国");
return JasperReportsUtil.generateReport(templatePath, fileName, format, parameters);
}
}
1.6、运行测试
启动工程,打开浏览器,访问http://localhost:6251/api/report/font-demo?format=pdf地址,之后就可以在工程中,看到生成的PDF文件:
1.7、服务器部署
当我们把工程打包成jar文件之后,部署到Linux服务的时候,也是需要将字体文件一起放到服务器里面的,不然运行过程中会找不到字体,从而报错。将【font】目录放到和Jar包同级目录位置就可以啦,此时运行Jar文件的时候,就会从Jar的同级目录中寻找【font】字体文件路径。