HighChart利用servlet导出中文PNG图片乱码问题解决

最近用到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中缺少中文字体包,还是经验不足啊。

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

时间: 2024-11-08 19:23:34

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

利用Servlet导出Excel

-----因为Excel可以打开HTML文件,因此可以利用页面的Form表单把页面中的table内容提交给Servlet,然后后台把提交上来的table内容转换成文件流的形式,并以下载的形式转给客户端,由此完成导出Excel功能. 效果: <!--[endif]--> Java代码 package com.mr; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletExcepti

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

mantis 中文报表乱码问题 1.安装mantisTB 1.2.17:a.安装插件:管理-->插件管理-->安装MantisGraph(Mantis图表 1.0) 插件b.修改配置文件:文件mantis\plugins\MantisGraph\pages\config.php(用UltraEdit打开修改文件,然后另存为UTF-8格式):$t_current_font_selected = array('simsun' => false, //增加这一行'arial' => fa

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

中文乱码问题 window.location.href url含中文服务器收到乱码问题解决 (1).页面中先对中文进行编码. 如:window.location.href = url+"&groupName=" + encodeURI(encodeURI(groupName)) ; 注意,页面部分需要编码两次. (2).在服务端进行解码.   groupName= java.net.URLDecoder.decode(groupName, "UTF-8");

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

三月不减肥,五月徒伤悲,这就是我现在的状态,哈哈~ 健身.博客坚持. --WH 一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, MyServlet是一个普通的Servlet,浏览器访问它时,使用get请求方式提交了一个name=小明的参数值,在doGet中获取该参数值,并且打印到控制台,发现出现乱码 出现乱码的原因: 前提知识:需要了解码表,编码,解码这三个名词的意思.我简单说一下常规的, 码表:是一种规则,用来让我们看得懂的

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

在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6412475.html>,在此仅供学习参考之用. 一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, MyServlet是一个普通的Servlet,浏览器访问它时,使用get请求方式提交了一个name=小明的参数值,在doGet中获取该参数值,并且打印到控制台,发现出现乱码 出现乱码的原因: 前提知识

Zabbix-web的中文显示及其乱码问题解决方法

问题: 通常在安装完zabbix后默认显示的是英文界面,虽然1-2个月也就习惯了,但对于刚开始接触的人来说英文毕竟不太友好,所以为了今后方便还是将界面改为中文:当改为中文后,在查看图表时会遇到乱码问题,这是由于字体格式不一致导致,本文的目的就是解决这常见的两个问题. 环境 zabbix3.2.7 centos7.3 zabbix改为中文界面 1.输入zabbix的IP,进入zabbix的web界面如下图 2.按图点击右上方的一个类似小人的设置项 3.之后出现如下界面,在Language选项中选择

PHP导入导出excel表格图片(转)

写excel的时候,我用过pear的库,也用过pack压包的头,同样那些利用smarty等作的简单替换xml的也用过,csv的就更不用谈了.呵呵.(COM方式不讲了,这种可读的太多了,我也写过利用wps等进行word等的生成之类的文章 )但是在读的时候,只用过一种,具体是什么忘了,要回去翻代码了.基本上导出的文件分为两种:1:类Excel格式,这个其实不是传统意义上的Excel文件,只是因为Excel的兼容能力强,能够正确打开而已.修改这种文件后再保存,通常会提示你是否要转换成Excel文件.优

Servlet中文乱码问题解决办法

首先对于源jsp网站和servlet里面的字符集要一样,一般支持中文的字符集为UTF-8最好采用这个字符集(除此之外还有gb2312); 对于源jsp文件的代码中需要设置 设置你的page里面的字符集 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 设置html文件里面的字符集 <meta http-eq

txt excel 导出 文件名称为中文,避免乱码的解决方案

在通过response导出文件数据的时候,不论是txt 还是Excel ,如果想让其文件名称为中文,解决方案: response.setCharacterEncoding("UTF-8"); response.setContentType("application/txt");//"application/vnd.ms-excel" response.setHeader("Content-disposition","