Jasperreport6 导出pdf中文不显示问题终极大法

传统解决思路

这个问题传统的解决思路:

  1. Ireport软件中设置字体


    Ireport字体设置
  2. 项目中导入jar包: itext-asian, 因为jasper本身不支持中文.

    itext-asian

这样, 生成模板字体部分类似这样:

....
<font fontName="宋体"  -pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true" />
...

以上思路, 基本可以解决问题. 但是在笔者这里失效了, 原因未知, 可能是因为maven仓库中jar有问题, 没有下载全或是其他. 导致一直报: 加载字体失败.


1515314352.png

即使不报错, 同样会有个严重的问题: 模板中中文字体
辣么多, 难道要...挨个设置上文中的那3项?
(请赐我一刀)

终极大法

回想一下, 使用office时, 肯定有过这样的经历: "系统自带字体不够用, 太low..."(尤其是写PPT的时候).
这时, 是不是下载自己中意的很多漂亮字体, 类似什么华康少女之类的.
同样, 在使用Jasperreport时也一样, 何不定制一个自己的字体包, 里面含有丰富的好看的字体?(当然作为程序猿, 能显示中文就OK了!).

步骤[1]

  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>
  1. 放弃itext-asian

  2. 引入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>
  1. 定制fontsjar包(关键)
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);

    }

}


附:

  1. 引入坐标无法正常下载到jar包怎么办?
    笔者的解决方案是, 手动下载离线jar包, 然后install到本地仓库.
// 示例:
 mvn install:install-file -Dfile="jar包路径" -DgroupI d=net.sf.jasperreports -DartifactId=jasperreports-fonts -Dversion=6.3.1 -Dpackaging=jar
  1. 怎么用maven命令打包?(jar命令打包也可以)
    ./fonts目录下有pom.xml等文件, 所以可以用mvn package命令打成jar包. (注意确认打成的jar里的fonts.xml中是否确实添加了你的配置, 笔者第一次就是由于打好的jar包里没有我的配置, 浪费好久!)
    image.png

    image.png

参考资料:


  1. jasperreport6 导出pdf中文不显示问题解决方式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352