首页  编辑  

JasperReport/IReport 指定自定义字体文件,解决中文不显示问题

Tags: /Java/   Date Created:
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>
    <!--
        可以配置多个字体
        name 属性:指定字体名称,这里的字体名称在 JasperReport 模板文件中使用的要一致,才能够匹配上
    -->
    <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中指定的工作目录,可以自己指定:
 
字体文件可以去网上下载(例如: https://www.cnziti.cn/ )或者从Windows字体文件目录中提取。

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;
 
/**
 * @version 1.0.0
 * @Date: 2023/8/26 21:32
 * @Author ZhuYouBin
 * @Description:
 */
@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】字体文件路径。