问题概述:PDF中文不显示问题主要是Jasperreports提供的font包不提供中文格式支持,所以我们需要自定义一个font包,用于支持。
第一步:在Jaspersoft Studio中添加中文字体
1、下载微软雅黑字体文件:*.ttf,字体文件下载地址:
2、在Jaspersoft Studio中设置Font,步骤: Window -> Preferences -> Jaspersoft Studio -> Fonts
3、添加字体文件:
添加完成后,可以在选择字体栏发现添加的字体
然后把所有的parameter字体都换成“微软雅黑”。保存从新生成report1.jasper文件。
第二步:在Jaspersoft Studio 打包字体文件Font.jar包
1、Jaspersoft Studio中打包Font.jar,步骤如下: Window -> Preferences -> Jaspersoft Studio -> Fonts->Export
2、将打包的font.jar 文件安装至本地Maven 仓库中,执行如下指令:
mvn install:install-file -Dfile=C:/font/jar/font.jar -DgroupId=com.zzg.report -DartifactId=font -Dversion=1.0.0 -Dpackaging=jar
3、报表项目添加对font.jar 依赖:
<!-- 报表系统:JasperReports --> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.6.0</version> </dependency> <!--字体文件依赖--> <dependency> <groupId>com.zzg.report</groupId> <artifactId>font</artifactId> <version>1.0.0</version> </dependency>4、重新启动项目,重新访问指定报表:
5、重点代码:
package com.zzg.report; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import net.sf.jasperreports.engine.JREmptyDataSource; import net.sf.jasperreports.engine.JasperRunManager; @Controller @RequestMapping("/api/report") public class ReportController { @RequestMapping("/{reportName}") public void getReportByParam(@PathVariable("reportName") final String reportName, HttpServletResponse response) { // try{ // 参数填充 Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("title", "参数"); parameters.put("date", "2019-05-23"); parameters.put("name", "强人"); parameters.put("age", "28"); parameters.put("dept", " 研发中心"); parameters.put("gender", "码农"); ServletOutputStream sosRef = null; try { // 获取文件流 ClassPathResource resource = new ClassPathResource("jaspers" + File.separator + reportName + ".jasper"); InputStream jasperStream = resource.getInputStream(); sosRef = response.getOutputStream(); JasperRunManager.runReportToPdfStream(jasperStream, sosRef, parameters, new JREmptyDataSource()); response.setContentType("application/pdf"); } catch (Exception e) { e.printStackTrace(); } finally { try { sosRef.flush(); sosRef.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
