传统解决思路
这个问题传统的解决思路:
-
Ireport软件中设置字体
-
项目中导入jar包:
itext-asian
, 因为jasper本身不支持中文.
这样, 生成模板字体部分类似这样:
....
<font fontName="宋体" -pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true" />
...
以上思路, 基本可以解决问题. 但是在笔者这里失效了, 原因未知, 可能是因为maven仓库中jar有问题, 没有下载全或是其他. 导致一直报: 加载字体失败.
即使不报错, 同样会有个严重的问题: 模板中中文字体
辣么多, 难道要...挨个设置上文中的那3项?(请赐我一刀)
终极大法
回想一下, 使用office时, 肯定有过这样的经历: "系统自带字体不够用, 太low..."(尤其是写PPT的时候).
这时, 是不是下载自己中意的很多漂亮字体, 类似什么华康少女
之类的.
同样, 在使用Jasperreport
时也一样, 何不定制一个自己的字体包, 里面含有丰富的好看的字体?(当然作为程序猿, 能显示中文就OK了!).
步骤[1]
- 引入
itext 4.2.1
(替换掉2.1.7)
<!-- itext -->
<!--https://mvnrepository.com/artifact/com.lowagie/itext-->
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>4.2.1</version>
</dependency>
<!--itextpdf-->>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.10</version>
</dependency>
放弃
itext-asian
引入
jasperreport
- 排除
itext
是为了用上文中配置的itext
(?是否可选?) - 是否要排除
font
, 待测试.
<!-- jasperreport -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.3.1</version>
<exclusions>
<exclusion>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
</exclusion>
<!--?可选?-->
<exclusion>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports-fonts</artifactId>
</exclusion>
</exclusions>
</dependency>
- 定制
fonts
jar包(关键)
1、官网下载jasperreports-6.1.1-project.zip
2、解压缩,查看demo的fonts,D:\jasperreports-6.1.1-project\jasperreports-6.1.1\demo\fonts\net\sf\jasperreports\fonts\dejavu目录下增加simsun.ttf(不能用windows的ttc文件直接修改后缀名的文件)
3、修改D:\jasperreports-6.1.1-project\jasperreports-6.1.1\demo\fonts\net\sf\jasperreports\fonts目录下的fonts.xml 增加如下配置:
<fontFamily name="宋体">
<normal>net/sf/jasperreports/fonts/dejavu/simsun.ttf</normal>
<bold>net/sf/jasperreports/fonts/dejavu/simsun.ttf</bold>
<italic>net/sf/jasperreports/fonts/dejavu/simsun.ttf</italic>
<boldItalic>net/sf/jasperreports/fonts/dejavu/simsun.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>
4、D:\jasperreports-6.1.1-project\jasperreports-6.1.1\demo\fonts目录下mvn package打包
5、把打好的jar包放到工程中即可
同样的方法, 可以配置很多自己想要的字体.
实现代码
package com.sykd.x02jasperreports;
import net.sf.jasperreports.engine.*;
import java.util.HashMap;
import java.util.Map;
/**
* @version:
* @author: Nisus-Liu
* @email: liuhejunlj@163.com
* @date: 2018-01-07-19:26
*/
public class JasperCreatePdf {
public static void main(String[] args) throws JRException {
// 编译模板文件
String jrxml = "D:\\Work\\JAVA\\workspace\\sykd\\sykd-parent\\bos-management\\bos-management-web\\src\\main\\webapp\\template\\report1.jrxml";
JasperReport report = JasperCompileManager.compileReport(jrxml);
// 准备需要数据
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("company", "xyz");
// 第三个参数: 必须有, 但可以是空数据源
JasperPrint jasperPrint = JasperFillManager.fillReport(report, parameters, new JREmptyDataSource());
// 设置目标文件输出的路径
String desFilePath = "C:\\Users\\Nisus\\Desktop\\TMP\\test.pdf";
// 输出文档
JasperExportManager.exportReportToPdfFile(jasperPrint, desFilePath);
}
}
附:
- 引入坐标无法正常下载到jar包怎么办?
笔者的解决方案是, 手动下载离线jar包, 然后install
到本地仓库.
// 示例:
mvn install:install-file -Dfile="jar包路径" -DgroupI d=net.sf.jasperreports -DartifactId=jasperreports-fonts -Dversion=6.3.1 -Dpackaging=jar
- 怎么用
maven
命令打包?(jar
命令打包也可以)
./fonts
目录下有pom.xml
等文件, 所以可以用mvn package
命令打成jar包. (注意确认打成的jar里的fonts.xml
中是否确实添加了你的配置, 笔者第一次就是由于打好的jar包里没有我的配置, 浪费好久!)
参考资料: