最近用到HighChart作图,在图片导出时,出现了图片中中文乱码的问题,在网络上找了很多资料,但都没有解决,最后才发现了最容易被忽略的问题。具体见下。

由于之前有同事使用过HighChart,所以毫不犹豫了之前同事使用的方法:通过自己书写servlet,利用batik工具完成不同格式图片的导出,具体方法见下:

@RequestMapping(value = "/save_image", method = RequestMethod.POST)
public void saveImage(HttpServletRequest request,
HttpServletResponse response, String type, String svg,
String filename) throws IOException {
request.setCharacterEncoding("utf-8");
filename = filename == null ? "chart" : filename;
ServletOutputStream out = response.getOutputStream(); if (null != type && null != svg) {
svg = svg.replaceAll(":rect", "rect");
String ext = "";
Transcoder t = null;
if (type.equals("image/png")) {
ext = "png";
t = new PNGTranscoder();
} else if (type.equals("image/jpeg")) {
ext = "jpg";
t = new JPEGTranscoder();
} else if (type.equals("application/pdf")) {
ext = "pdf";
t = (Transcoder) new PDFTranscoder();
} else if (type.equals("image/svg+xml"))
ext = "svg"; response.addHeader("Content-Disposition", "attachment; filename="
+ filename + "." + ext);
response.addHeader("Content-Type", type); if (null != t) {
TranscoderInput input = new TranscoderInput(new StringReader(
svg));
TranscoderOutput output = new TranscoderOutput(out); try {
t.transcode(input, output);
} catch (TranscoderException e) {
out.print("Problem transcoding stream. See the web logs for more details.");
}
} else if (ext.equals("svg")) {
OutputStreamWriter writer = new OutputStreamWriter(out, "UTF-8");
writer.append(svg);
writer.close();
} else
out.print("Invalid type: " + type);
} else {
response.addHeader("Content-Type", "text/html");
out.println("Usage:\n\tParameter [svg]: The DOM Element to be converted."
+ "\n\tParameter [type]: The destination MIME type for the elment to be transcoded.");
}
out.flush();
out.close();
}

之后修改exporting.js文件,将其中的导出URL改为上述servlet中指定的URL。方法与网络上的大致相同。

但是问题来了,测试的同事告诉我部署在Linux服务器上的应用在导出图片时,中文都变成了小框框,一般这种乱码问题都会想到是编码问题,于是开始在网络上找解决方法。

首先根据http://ollevere.iteye.com/blog/1773563中提到的解决方法二,在代码中添加了

request.setCharacterEncoding("utf-8");

部署测试之后,发现不管用

于是,继续海搜,看到了http://jstree.iteye.com/blog/1586623,又在代码中加下

response.setCharacterEncoding("utf-8");

部署测试后,发现还是不管用

其实,我在工程的servlet配置中,已经对字体做了转码配置。如果没有进行配置,还是要像上面提到的方法控制servlet中的编码。

<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<!-- 将StringHttpMessageConverter的默认编码设为UTF-8 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" />
</bean>
<!-- 将Jackson2HttpMessageConverter的默认格式化输出设为true -->
<bean
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="prettyPrint" value="true" />
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

这时我测试发现,部署在本地(Windows7系统)tomcat服务器上的应用并没有这个问题,导出的图片中中文显示得很正常,这时,有点懵了。

于是想到是不是Linux服务器上有什么地方没有配置正确?但在比较本地tomcat和服务器tomcat的配置之后,发现两者大同小异,甚至我把本地的配置拷贝到服务器,部署测试后,问题仍然存在。想到会不会是java版本不同,结果看了,Linux服务器上用的是Java1.7,而本地用的是Java1.6。但是看了下也没有找到问题所在。

这时,自己感觉很无力,也几乎耽误了一天时间了。

于是开始找同事咨询,同事看了之后就提到说是不是Linux服务器上是不是不支持设定的中文字体,突然感觉眼前一亮,可能找到问题所在了,于是前端同事配合修改highchart画图时设置的font-family,添加了linux中默认的字体Monospace,但是问题仍没有解决。

之后找做系统方面的同事咨询:是Linux系统中缺少中文字体包还是jdk中缺少中文字体包才导致这个问题,他给出的答案是应该是jdk中缺少中文字体包,于是,在jdk中安装了几个常用的中文字体包,再部署应用测试,问题解决了。虽然之前也想到可能是服务器上配置的问题,但没想到是JDK中缺少中文字体包,还是经验不足啊。

此次的查错过程甚是曲折,不过总算把问题解决了,特意整理出来,供大家参考。有不足之处,请大家见谅。

HighChart利用servlet导出中文PNG图片乱码问题解决的更多相关文章

  1. 利用Servlet导出Excel

    -----因为Excel可以打开HTML文件,因此可以利用页面的Form表单把页面中的table内容提交给Servlet,然后后台把提交上来的table内容转换成文件流的形式,并以下载的形式转给客户端 ...

  2. Servlet中response、request乱码问题解决

    Java Web(二) Servlet中response.request乱码问题解决   三月不减肥,五月徒伤悲,这就是我现在的状态,哈哈~ 健身.博客坚持. --WH 一.request请求参数出现 ...

  3. Java Web之Servlet中response、request乱码问题解决

    Java Web之Servlet中response.request乱码问题解决   一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, ...

  4. window.location.href url含中文服务器收到乱码问题解决

    中文乱码问题 window.location.href url含中文服务器收到乱码问题解决 (1).页面中先对中文进行编码. 如:window.location.href = url+"&a ...

  5. window nginx 中文路径, 文件名乱码问题解决

    window nginx 中文路径, 文件名乱码, error, not found 此问题是由于windows系统编码与nginx编码设置不一致导致的,因此我们要统一二者的编码 nginx编码设置 ...

  6. Java Web(二) Servlet中response、request乱码问题解决

    三月不减肥,五月徒伤悲,这就是我现在的状态,哈哈~ 健身.博客坚持. --WH 一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, M ...

  7. web开发(二) Servlet中response、request乱码问题解决

    在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6412475.html>,在此仅供学习参考之用. 一.re ...

  8. mantis 中文统计报表乱码问题解决办法

    mantis 中文报表乱码问题 1.安装mantisTB 1.2.17:a.安装插件:管理-->插件管理-->安装MantisGraph(Mantis图表 1.0) 插件b.修改配置文件: ...

  9. 锐浪报表 导出 PDF ANSI码 乱码 问题解决

    锐浪 报表 导出PDF时如果 ANSI 码 打勾了会乱码,能将这个选项默认不打勾吗 //在报表导出事件脚本里写脚本,可实现导出控制Sender.AsE2PDFOption.AnsiTextMode=0 ...

随机推荐

  1. js对函数参数的封装

    对函数参数的封装 一个原始函数有n个参数,用wrap对函数进行封装,生成一个新的函数,当给它传入参数数量为n的时候,将执行原始函数,否则不执行 //函数封装 function wrap(func){ ...

  2. Flutter Navigator 跳转

    1,routes 静注册,使用 跳转 Navigator.pushNamed(context, "/main"); 2,静态跳转及销毁当前页面使用 Navigator.pushNa ...

  3. Mac os x的发展

    OS X(前称Mac OS X)是苹果公司为麦金塔电脑开发的专属操作系统.Mac OS X于1998年首次推出,并从2002年起随麦金塔电脑发售.它是一套Unix基础的操作系统,包含两个主要的部分:核 ...

  4. Linux 开机、重启和用户登录注销、用户管理、用户组

    l 关机&重启命令   基本介绍: shutdown –h now 立该进行关机 shudown -h 1 "hello, 1 分钟后会关机了" shutdown –r n ...

  5. XNA项目基础

    XNA项目基础 using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Frame ...

  6. VMware Workstation pro14 虚拟机下安装CentOS6.5图文教程

    1 启动VMware的画面 2.点击 创建新的虚拟机 3 选择 典型(推荐) 4 选择 稍后安装操作系统 5 选择客户机操作系统类型 6 设置虚拟机名称 和 安装路径 7 指定磁盘容量 8 点击 自定 ...

  7. JVM的内存结构

    程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.字节码解释器工作时就是通过改变这个计数器的值来选取下一条 ...

  8. MySql的数据查询

    SELECT语句是最常用的查询语句,它的使用方式有些复杂,但功能却相当强大.SELECT语句的基本语法如下: select selection_list//要查询的内容,选择哪些列 from数据表名/ ...

  9. MySQL使用全文索引(fulltext index)

    1.创建全文索引(FullText index) 旧版的MySQL的全文索引只能用在MyISAM表格的char.varchar和text的字段上. 不过新版的MySQL5.6.24上InnoDB引擎也 ...

  10. python 包管理工具Pipenv

    Kenneth Reitz的最新工具Pipenv可以用于简化Python项目中依赖项的管理. 它汇集了Pip,Pipfile和Virtualenv的功能,是一个强大的命令行工具. 入门 首先使用pip ...