1. 概述
1.1 问题描述
1)用户在打印、导出时,会出现与预览结果不一致的情况。如:
在 Linux 环境下,发现客户端预览是正常的,但是在导出或打印时会出现乱码,或者一些特殊符号如人民币符号「¥」,在导出或打印时发现变成了美元符号「$」。
在 Linux 系统的客户端,预览或导出的图片乱码。
Linux 下打印预览,有重影。
Linux 服务器导出文字重叠。
导出 pdf 时图表里的中文变成框框。
本来设置的字体是微软雅黑,但是导出来的 PDF 却是宋体。
插入斜线乱码,斜线为方框。
2)在本地设计器工程下预览字体正常,保存在服务器上,通过服务器预览时,效果和设计器工程预览不一致。
3)在 Linux 系统中出现报表斜线丢失。
4)Linux 系统中,在主报表中插入子报表,如果子报表有中文,那么在主报表中显示的时候会出现中文乱码,但主报表其他部分或者子报表单独访问的时候中文并不会乱码。
5)模板在钉钉中预览单元格内容显示不全,但是在浏览器中预览正常。
6)工程预览模板报错:java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
1.2 原因分析
客户端导出或者打印时,字体使用的是服务器的系统字体和服务器依赖的 JRE 下的字体,若服务器没有设计器设计时选用的字体,则会出现乱码或者字体被替换的问题。
设计器设计报表时,使用的是设计器所在设备本地系统的字体,保存在服务器上后,若服务器没有设计器设计时选用的字体,则会出现预览不一致的问题。
对于 Linux 系统 Java 在 drawString 的时候,可能会没有对应的字体,此时就会出现斜线丢失的情况。
在使用插入子报表时,实际上是在服务器端事先画好图片,当客户端发出请求访问主报表时,再去调用已画好的图片。当插入的子报表中含有中文的时候会调用操作系统中的语言包,如果 Linux 中没有安装中文语言包会导致出现乱码现象。
2. 解决思路
解决思路一:给工程安装字体
使用「字体管理插件」,给工程安装字体。
字体仅对安装配置了该插件的FineReport工程生效,对Linux/Windows服务器中的其他工程/应用不生效
详情请参见:字体管理插件
解决思路二:给服务器设置中文语言环境,给服务器、Tomcat、JDK安装字体
Linux 系统:Linux系统设置中文语言环境和字体
Windows 系统:Windows系统设置中文语言环境和字体
注1:如果是预览工程中的模板出现乱码,需要检查:
工程所在服务器(集群工程,需要检查每一个节点所在服务器)
预览模板的客户端设备(电脑)
注2:如果是预览设计器的模板出现乱码,需要检查:
设计器远程设计的工程所在服务器
设计器所在设备(电脑)