天天看点

java中jasperReport中文乱码

         jasperReport在java中,生成pdf时,出现中文乱码,郁闷啊。。。。。。肿么办??????

        1、jasperReport在ireport设计器上,对每个有中文的组件的属性进行如下设置

java中jasperReport中文乱码

       2、把iTextAsian.jar和iTextAsianCmaps.jar引入到ireport的classpath中,我这篇文章讲过

           引入以后,设计器预览不会乱码了,看到可爱的汉字出现在了我们的pdf文件

      3、将编译好的japser文件拷贝到java工程中,程序运行看看报表结果,这坑爹了,报错了,错误信息如下:

net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font :
pdfFontName   : STSong-Light
pdfEncoding   : UniGB-UCS2-H(Chinese Siplified)

isPdfEmbedded : true
           

    跟踪错误信息,查看异常轨迹,在源码中发现,生成pdf时,字符集编码获取如下:

   a、从jasperReport上下文获取字符集:

java中jasperReport中文乱码

      这些字符是从哪里来呢?一个是当前运行的操作系统自身的字符集,一个jasperReport自己提供字符集,jasperReport提供的字符集,那是相当的少,差不多就算是个例子吧,就只有一个Pictonic字符集:

java中jasperReport中文乱码

      jasperReport提供的字符集没有,操作系统又没有,怎么办?自己遵循java的规则,造一个字符集?感觉好麻烦,我们遇到的别人,也一定会遇到,重复造轮子,是一个莫大的浪费,继续看源码;

     从jasperReport上下文找不到,从操作系统也找不到了,就靠第三方了,在接下来查找字符集的代码中,我们看到如下的代码:

java中jasperReport中文乱码

        从第三方,itext中(com.lowagie.text.FontFactory)获取,视乎有线希望。。。。结果com.lowagie.text.FontFactory返回的虽然不为空,可是baseFont为空,一样,没有查到字符集,尼玛。。。。什么情况?

        继续往下,大师就是大师,任性的继续寻找字符集,这次是从资源池中寻找字符集文件:

java中jasperReport中文乱码

       这里,还是失败,没有找到任何资源,可爱的异常信息打出来了,异常就是上图的Could not load the following font:.....

      静下来再想想,既然文件中,第三方也没有找到,会不会是第三方的资源文件缺少导致的?

      往下看以后,发现,itext的字符集包没有提供,正好,itext的字符集包由iTextAsian-2.1.jar,iTextAsianCmaps-2.1.jar两个包提供,打开iTextAsian-2.1.jar,我们看到熟悉的字符集名称:

java中jasperReport中文乱码

        爽哉,原来你在这里,把包导入工程,网上查了一遍。。。。悲剧。。。。没有找到相应的maven仓库,好吧,那就自己放到公司的maven仓库好了,马不停跌的放入公司maven仓库以后,引入项目,启动程序,ok,一切大吉,可爱的中文在pdf中出现了。

       注:如果不是maven项目,自己下载包,引入相应的仓库或者项目中即可

      至此,坑爹的中文显示异常及报错就搞定了。