Linux环境下部署jasperreport出现net.sf.jasperreports.engine.util.JRFontNotFoundException

本文介绍了如何解决JasperReports在Linux环境下因缺少特定中文字体而引发的错误。提供了两种解决方案:一是在Linux系统中安装所需的中文字体并配置项目;二是将字体打包为jar文件放入项目中。

如题所示的错误完整语句如下:

net.sf.jasperreports.engine.util.JRFontNotFoundException: Font '宋体' is not available to the JVM.  See the Javadoc for more details。。

这是一个很闹心的问题,你会发现你在windows环境开发,报表显示的好好的,但是开开心心部署到lInux环境时,可能就会给你泼如题所示的冷水。

要解决这个问题要从2方面考虑:

 

1)Linux在没有安装报表所需中文字体的情况:

第一步:安装方法——转到Linux环境下的/usr/share/fonts路径下,新建一个dir如zh_CN,把准备好的中文字体传到该目录下(中文字体的获取可以从windows环境的C:/Windows/Fonts下拷贝~),再执行如下命令:

mkfontscale
mkfontdir 
fc-cache -fv 

 即可成功安装字体。可以执行命令:

fc-list

 查看是否安装好字体。

第二步:(很重要!!)在项目的classes目录下加一个jasperreports.properties配置文件,添加内容如下:

 

net.sf.jasperreports.awt.ignore.missing.font=true

再重启项目即可~~

(以上方法亲测有效)

 

2)考虑到可移植性,把字体打包成jar放在项目里面。

这种方法我尝试了并没有起作用,可能是因为之前我已成功在Linux里安装好了中文字体的原因?但是我觉得也是一个比较靠谱的办法,所以记录下,可能以后用得着呢。。

前往官方社区下载jasperreports-6.2.0的完整版项目,解压后里面会有很多demo,找到fonts这个项目:

<%=你的jasperreport目录%>/demo/fonts.。

再转到net\sf\jasperreports\fonts\dejavu目录,把里面自带的字体删除,换上你自己的中文字体如STFANGSO.TTF(仿宋),然后修改net\sf\jasperreports\fonts下面的fonts.xml,这里以仿宋为例吧:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <fontFamilies>  
  3.     <fontFamily name="仿宋">  
  4.         <normal>net/sf/jasperreports/fonts/dejavu/STFANGSO.TTF</normal>  
  5.         <bold>net/sf/jasperreports/fonts/dejavu/STFANGSO.TTF</bold>  
  6.         <italic>net/sf/jasperreports/fonts/dejavu/STFANGSO.TTF</italic>  
  7.         <boldItalic>net/sf/jasperreports/fonts/dejavu/STFANGSO.TTF</boldItalic>  
  8.         <pdfEncoding>Identity-H</pdfEncoding>  
  9.         <pdfEmbedded>true</pdfEmbedded>  
  10.         <exportFonts>  
  11.             <export key="net.sf.jasperreports.html">'仿宋', Arial, Helvetica, sans-serif</export>  
  12.             <export key="net.sf.jasperreports.xhtml">'仿宋', Arial, Helvetica, sans-serif</export>  
  13.         </exportFonts>  
  14.         <!--  
  15.         <locales>  
  16.             <locale>en_US</locale>  
  17.             <locale>de_DE</locale>  
  18.         </locales>  
  19.         -->  
  20.     </fontFamily>  
  21. </fontFamilies>  

 好了,现在开始着手把修改后的字体项目打成jar包:

 在dos窗口转至:jasperreports-6.2.0\demo\fonts,执行如下命令:

jar cvf fonts.jar *

 fonts.jar即是你封装好的字体jar,可以反编译查看其大致结构:



 然后把这个jar包放到classpath下,同时也别忘了在classes目录下加上一个如1)情况所讲的配置文件。

【注:这种方法我目前还没有测通,可能是因为已经在Linux安装好字体的原因~】

 

3)其他方法

参考于网络但大多数都没测通,可能情况不同采取的方法不同。

  • 大小: 4.5 KB


原文地址:http://blog.youkuaiyun.com/qq_18875541/article/details/69392376



net.sf.jasperreports.engine.JRException: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression for source text: ((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("list") at com.jaspersoft.studio.editor.preview.view.control.ReportController.fillReport(ReportController.java:553) at com.jaspersoft.studio.editor.preview.view.control.ReportController.access$18(ReportController.java:528) at com.jaspersoft.studio.editor.preview.view.control.ReportController$1.run(ReportController.java:446) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) Caused by: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression for source text: ((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("list") at net.sf.jasperreports.engine.fill.JREvaluator.handleEvaluationException(JREvaluator.java:294) at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:328) at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:673) at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:641) at net.sf.jasperreports.engine.fill.JRFillElement.evaluateExpression(JRFillElement.java:1175) at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateSubreport(JRFillSubreport.java:529) at net.sf.jasperreports.components.table.fill.FillTableSubreport.evaluateSubreport(FillTableSubreport.java:112) at net.sf.jasperreports.components.table.fill.FillTable.evaluate(FillTable.java:136) at net.sf.jasperreports.engine.fill.JRFillComponentElement.evaluate(JRFillComponentElement.java:110) at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:383) at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:548) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2613) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:836) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:275) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:119) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:622) at net.sf.jasperreports.engine.fill.BaseFillHandle$ReportFill.run(BaseFillHandle.java:135) at java.base/java.lang.Thread.run(Unknown Source) Caused by: java.lang.ClassCastException: class net.sf.jasperreports.engine.JREmptyDataSource cannot be cast to class net.sf.jasperreports.engine.data.JsonDataSource (net.sf.jasperreports.engine.JREmptyDataSource and net.sf.jasperreports.engine.data.JsonDataSource are in unnamed module of loader org.eclipse.osgi.internal.loader.EquinoxClassLoader @14485747) at 骨灰堂工作量统计表_1756975472229_690370.evaluate(骨灰堂工作量统计表_1756975472229_690370:79) at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:313) ... 16 more
最新发布
09-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值