1、问题描述
使用 JasperStudio 设计报表,并 Export as pdf 时,中文信息正确显示;
使用 JasperReport 生成报表时,中文信息无法显示;
其根本原因,是 JasperReport 报表引擎没有找到模板中指定的字体,比如模板中有个 Static Text 组件,如下:
<staticText>
<reportElement x="130" y="10" width="95" height="30" uuid="3af8b7ce-eeca-4ebf-a75f-d2db315c726d"/>
<textElement textAlignment="Center">
<font fontName="simfang" size="15"/>
</textElement>
<text><![CDATA[套餐编码]]></text>
</staticText>
这是一个静态文本组件,使用的中文字体为 simfang
。
点击组件,可查看其属性信息:
可以在属性编辑栏中,对中文字体信息进行更改,比如改为 宋体、黑体 等。
JasperStudio 内置了一些字体,可以在 Font 列表中查看:
但是这些字体,有些能用来生成 pdf 文件,有些不能;比如使用 微软雅黑 字体,生成的 PDF 报表,中文信息能正常显示,但是使用 隶书 、微软雅黑 UI、宋体 等字体时,生成的 PDF 文件,中文信息缺失。当然,生成的 HTML 报表,一般都是没有问题的。
这种情况下,就需要添加特定的字体 font,来实现在 pdf 报表中显示中文信息。
2、添加字体到 JasperStudio 中
1、下载或生成所需字体的 .tff 文件:
windows 系统中,Windows -> Fonts
目录中,有很多的字体文件:
有些时 ttc 格式,有些是 ttf 格式,比如微软雅黑就是 .ttc 格式的文件。需要使用转换工具将其转换为 .ttf 文件。
ttc 转 ttf 在线工具
2、在 JasperStudio 中添加字体文件
右击 project 节点,查看 properties -> Fonts,添加新的字体类型,例如下图中的 simfang,仿宋:
添加后,就可以在文本属性中使用新的字体类型了。.jrxml 文件中,如下:
3、添加多种新字体
添加多种字体:微软雅黑,宋体,楷体,黑体,行书等,如下:
在 JasperStudio 中,创建示例:
对应的 detail 栏的内容,如下:
<detail>
<band height="155" splitType="Stretch">
<staticText>
<reportElement x="20" y="50" width="150" height="30" uuid="229658ae-a622-4f58-b790-0ab0586f4a00"/>
<textElement>
<font size="20"/>
</textElement>
<text><![CDATA[Hello World!]]></text>
</staticText>
<staticText>
<reportElement x="200" y="20" width="230" height="30" uuid="d5e645af-cc75-48f7-924f-1371512a50d7"/>
<textElement>
<font fontName="xingshu" size="18"/>
</textElement>
<text><![CDATA[你好,世界]]></text>
</staticText>
<staticText>
<reportElement x="200" y="62" width="100" height="30" uuid="090d90f4-a77a-485d-a7d7-9fa3a01ff8e0">
<property name="com.jaspersoft.studio.unit.spacingAfter" value="px"/>
</reportElement>
<textElement textAlignment="Left">
<font fontName="msyh"/>
<paragraph lineSpacing="Single" spacingAfter="0"/>
</textElement>
<text><![CDATA[你好,世界!微软雅黑]]></text>
</staticText>
<staticText>
<reportElement x="200" y="100" width="100" height="30" uuid="f3b38e4c-4649-4cf7-876a-6d7a53ade965"/>
<textElement>
<font fontName="simhei"/>
</textElement>
<text><![CDATA[你好,世界!黑体]]></text>
</staticText>
<staticText>
<reportElement x="330" y="62" width="100" height="30" uuid="064b44b2-7c53-456c-ab81-6dfa39f0f840"/>
<textElement>
<font fontName="simkai"/>
</textElement>
<text><![CDATA[你好,世界!楷体]]></text>
</staticText>
</band>
</detail>
在 Preview 窗口,执行 Export as PDF,可以导出 pdf 文件,能够正确的显示出中文信息:
这样的话,说明 JasperStudio 中的字体已经没有问题了。这样,可以在 JasperStudio 中设计报表模板,并根据模拟数据进行报表演示了。
但是当 JasperReport 根据给定的报表模板生成报表时,怎么获取到扩展的字体信息呢?
3、JasperReport 使用扩展字体
1、在 JasperStudio 中将扩展字体集,导出为 fonts.jar 文件:
生成的 jar 文件中,包含了字体的详细信息(ttf 文件和 meta 信息),可供 JasperReport 引擎使用!
2、将 fonts.jar 文件添加到 java 项目中:
可以将 fonts.jar 发布到项目仓库中,也可以通过 lib 的形式添加;只要保证 fonts.jar 在项目的 classpath 中即可!
我放到在resources
下面
然后点击鼠标右键
然后就可以导出中文就不会缺失了。
备注:默认情况下,当没有数据源信息存在于一个报告,JR不产生页面。另一个选项(可以在报告的whenNoDataType属性中设置)将打印除<detail>之外的所有报告部分。此报告包含详细信息部分,但仅包含一些静态数据。为确保本节也将被打印,最简单的方法是提供一个空数据源,其中包含一个空记录。