虽然现在回答为时已晚,但如果有人偶然发现同样的问题,它可能会有所帮助。
在创建 phantomjs 服务器的尝试失败后,我放弃了它,在互联网上搜索解决方案时,我遇到了蜡染。在 Highchart 官方网站上,他们还提到蜡染可用于导出图表。所以经过更多的试验,我终于能够离线导出我的图表并且实现很简单。
要使其工作,您需要蜡染库文件。他们的项目托管在 github;您可以从那里下载所需的 jars。下载整个包后,我只使用 batik.jar、batik-transcoder.jar、pdf-transcoder.jar,因为我只想将图表导出为 JPEG、png 和 pdf。
所以我在我的 net-beans 项目中添加了这些库。
在初始化 highchart 的地方添加此代码
exporting: {
buttons: {
contextButton: {
menuItems: [{
text: 'Export to PNG',
onclick: function() {
printChart(panelno,"image/png");
}
}, {
text: 'Export to JPEG',
onclick: function() {
printChart(panelno,"image/jpeg");
},
separator: false
},{
text: 'Export to PDF',
onclick: function() {
printChart(panelno,"application/pdf");
},
separator: false
}]
}
}}
exporting 是 highchart 支持的选项之一,如 series、title、plotOption 等。
下面是 printchart 函数的代码
function printChart(panelno,printtype){
var chart = $k('#container'+panelno+panelno).highcharts();
var options = chart.options.exporting;
var svg=chart.getSVG();
$k("#mytype").val(printtype);
$k("#mysvg").val(svg);
$k("#myfile").val("chart");
$k("#testform").submit();}
只需忽略面板,它是我的自定义字段,但是您要做的是将图表选项和 svg 保存到一些变量中。您可以使用显示图表的 div id 或更具体地声明的位置获取它们
<div id="highchart"></div>
在我的情况下,我在同一页面上有多个 highchart,以便识别哪个图表调用 printChart 函数,我使用了 panelno
这里的 testform 是我在页面中声明的表单;此表单具有图表类型和 svg 的三个隐藏输入字段,一旦我有了这些值,我将表单提交到另一个处理实际图表导出的 jsp 页面。
在您实际导出图表的页面中编写以下代码。
try {
String ctype = request.getParameter("charttype");
String svg = request.getParameter("svg");
String filename = request.getParameter("filename");
if (filename == null && filename.equals("")) {
filename = "chart";
}
String ext = "";
Transcoder transcoder = null;
ServletOutputStream outp = response.getOutputStream();
if (!ctype.equals("image/svg+xml")) {
InputStream svgInputStream = new ByteArrayInputStream(svg.getBytes());
if (ctype.equals("image/png")) {
ext = "png";
transcoder = new PNGTranscoder();
} else if (ctype.equals("image/jpeg")) {
ext = "jpg";
transcoder = new JPEGTranscoder();
} else if (ctype.equals("application/pdf")) {
ext = "pdf";
transcoder = new PDFTranscoder();
}
response.setHeader("Content-disposition", "attachment; filename=" + filename + "." + ext);
////response.setHeader("Content-type", type);
response.setContentType("application/download");
TranscoderInput tInput = new TranscoderInput(svgInputStream);
TranscoderOutput lOutput = new TranscoderOutput(outp);
transcoder.transcode(tInput, lOutput);
} else {
ext = "svg";
response.setHeader("Content-disposition", "attachment; filename=" + filename + "." + ext);
response.setHeader("Content-type", ctype);
// out.write(svg.getBytes());
}
outp.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();}
您的所有图表都是由蜡染生成的,图表文件发送到客户端下载。