依赖:
<!--jasperreport以及所有依赖包-->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>4.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
最后运行可能会报错,报
net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font :
pdfFontName : STSong-Light
pdfEncoding : UniGB-UCS2-H
isPdfEmbedded : false
缺少字体,需要导入 itext2.1.7.jar以及iTextAsian.jar
这两个jar包需要自己手动打包到maven,中央仓库没有
然后就是一堆网上找得到的,使用jasperreports的代码,那个就不贴了
最后,在windows下能运行,到linux就报错,报
net.sf.jasperreports.engine.util.JRFontNotFoundException: Font ‘宋体’ is not available to the JVM.
还是字体,在windows中系统是有宋体的,因此不会报错
先了解下这个程序运行机制:项目依赖中,也就是jar包,有字体的话,就直接使用,没有的话找部署这个项目的系统内置字体。
有两个解决办法:
1:linux安装字体集,不推荐
2:将字体引入到项目中
第一种,程序移植性就降低了,换一个服务器就得安装一次字体,不推荐
我这里使用第二种:
我们使用ireport工具在windows下能正常预览pdf,为啥?因为它里面有引入字体jar包,而不是使用系统内置的,不信?看下面
找到classpath,看到这个jar包了没,去这个位置找到这个jar包
拿出这个jar包,找到里面的字体文件,\net\sf\jasperreports\fonts\dejavu。
放入所需字体,目前需要宋体,宋体去哪里找?系统就有嘛,上网找系统的内置字体位置,拿到下面这个文件,还有一个ttd的,一起拿了
放入后修改jar包的xml,\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>
把这个jar包打进maven,后在pom中引入
完美解决