在Firefox中导出highcharts时的黑色图像错误

时间:2015-04-01 15:25:50

标签: javascript firefox svg highcharts jspdf

我正在使用highcharts在网页上显示多个图表,显示正常。

我有一个导出功能,试图将图表组合成pdf。我正在获取图表的svg并将其转换为jpeg图像,以包含在由jsPDF创建的pdf中。

以下是我用来生成图片的代码:

if ($('.chart').length > 0) {
    var chartSVG = $('.chart').highcharts().getSVG(),
        chartImg = new Image();

    chartImg.src = "data:image/svg+xml;base64," + window.btoa(unescape(encodeURIComponent(chartSVG)));

    var chartCanvas = document.createElement("canvas");

    chartCanvas.width = 600;
    chartCanvas.height = 400;
    chartCanvas.getContext("2d").drawImage(chartImg, 0, 0, 600, 400);

    var chartImgData = chartCanvas.toDataURL("image/jpeg");
}

这在Chrome中完美运行,但在Firefox中它只会返回黑色图像。

有谁知道可能出现的问题或者看到类似的问题?

感谢您的帮助。

更新

我已更新了代码,但现在无法在Chrome或Firefox中将图片附加到pdf文档中。

if ($('.sales').length > 0) {
        var chartSVG = $('.sales').highcharts().getSVG(),
            chartImg = new Image();

        chartImg.onload = function () {
            var chartCanvas = document.createElement("canvas");

            chartCanvas.width = 600;
            chartCanvas.height = 400;
            chartCanvas.getContext("2d").drawImage(chartImg, 0, 0, 600, 400);

            var chartImgData = chartCanvas.toDataURL("image/jpeg");
        }

        chartImg.src = "data:image/svg+xml;base64," + window.btoa(unescape(encodeURIComponent(chartSVG)));
    }

不确定我的代码是否在正确的位置。

如果我记录了mapImgData'对于控制台,两个浏览器都生成一个dataURI,但Firefox的版本与Chromes不同。

更新

修正了黑色图像的问题。现在,我正在努力解决如何返回多个图像 - 如何嵌套多个回调或是否有另一种方式? 示例:jsfiddle.net/wmuk489c/2

解决

感谢您的帮助@RobertLangson。如果有人需要,可以使用最终工作代码更新小提琴:http://jsfiddle.net/wmuk489c/3/

进一步的问题:

我的图表是动态的,所以可能并不总是存在。我需要从存在的每个图形中获取图像。如果图表不存在,那么“getSVG'函数失败,请参见示例:http://jsfiddle.net/wmuk489c/4/

如果图表不存在,img.onload应如何工作?回调中的第一个图表也可能不存在,那么这将如何工作?有没有更好的方法来获取图像?

1 个答案:

答案 0 :(得分:2)

设置chartImg.src会导致异步加载,因此您需要执行此操作...

chartImg.onload = function() {
    var chartCanvas = document.createElement("canvas");

    chartCanvas.width = 600;
    chartCanvas.height = 400;
    chartCanvas.getContext("2d").drawImage(chartImg, 0, 0, 600, 400);

    var chartImgData = chartCanvas.toDataURL("image/jpeg");

    doc.addImage(chartImgData, 'JPEG', 0, 0, 200, 100);

    // You can only do this bit after you've added the image so it needs
    // to be in the callback too
    doc.save('test.pdf');

}

chartImg.src = ...

否则你就处于竞争状态,我想你恰好用PC上的Chrome浏览器侥幸逃脱了它。

Here's your fiddle fixed