Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 下载D3JS图表,格式为png/pdf/jpeg_Javascript_Jquery_D3.js_Svg - Fatal编程技术网

Javascript 下载D3JS图表,格式为png/pdf/jpeg

Javascript 下载D3JS图表,格式为png/pdf/jpeg,javascript,jquery,d3.js,svg,Javascript,Jquery,D3.js,Svg,我一直在寻找这个问题的答案,我有一个svg形式的D3Js图表。svg有圆、文本、线、图像等属性(以.png形式)。我可以下载一个.png文件形式的D3Js图表,但我无法从图表中获取图像!。我研究过html2canvas,但它不支持svg格式 html 我已经达到了极限,我真的很感激一些帮助,代码示例将是伟大的 谢谢所以,在尝试解决这个问题几周后,终于想出了解决方案 1.如果有跨域或外部源(在本例中,我的图像来自AmazonS3) 1.1。将整个svg转换为字符串,我使用xmlSerialize将

我一直在寻找这个问题的答案,我有一个svg形式的D3Js图表。svg有圆、文本、线、图像等属性(以.png形式)。我可以下载一个.png文件形式的D3Js图表,但我无法从图表中获取图像!。我研究过html2canvas,但它不支持svg格式

html

我已经达到了极限,我真的很感激一些帮助,代码示例将是伟大的
谢谢

所以,在尝试解决这个问题几周后,终于想出了解决方案
1.如果有跨域或外部源(在本例中,我的图像来自AmazonS3)

1.1。将整个svg转换为字符串,我使用xmlSerialize将svg转换为字符串(svg是xml数据)
1.2. 对后端进行api调用
1.3. 接收字符串,使用ApacheBatik库(我们的后端是JavaSpringboot)并将字符串转换为.png/.pdf

我尝试过使用canvg,这很好,但它将svg转换为画布并污染画布,因为其中存在外部资源(请让e知道,如果有任何方法更改它,我无法找到)

HTML2Canvas也不会捕获现有的外部资源

我试图在前端完全解决这个问题,我能达到的最好效果是在页面上的画布元素上打印svg,我可以右键单击并将图像保存为图像,但无法直接将svg下载到客户端的.png


我仍然希望有人能给我一些建议&我非常渴望了解更多信息

我想你必须首先将图像转换为数据URL。@RobertLongson如果你可以指导我,请看哪一部分!,我对svg/canvas这个东西很陌生,我想我确实在click eventd中将图像转换为URL。photo需要是一个数据URL(对内部数据的引用),而不是对png文件的外部引用。@RobertLongson外部引用有什么问题?我的意思是,我有来自api的图像,有成千上万的图像,你说我需要将它们保存在我的项目目录中,检查我的由d3js生成的“”标记(下面),在svg元素中,我能够获得文本,但问题只在于图像<代码>汤姆A.阿尔伯格
 <button id="save" class="btn btn-primary " 
    style="margin-left: 5%;width: 10%;height: 70%;margin-top: 0%;"  ng-click="">
            Save as Image
 </button>

<div style="text-align:center;">
    <org-chart dataobj="vm.company" ng-if="vm.company"></org-chart>
    <canvas width="1000" height="800" style="display: none;"></canvas>
    <!-- <div id="svgdataurl" style="display: none;"></div> -->
</div>
d3.select("#save").on("click", function () {

    var html = d3.select("svg")
        .attr("xmlns", "http://www.w3.org/2000/svg")
        .node().parentNode.innerHTML;

    var imgsrc = 'data:image/svg+xml;base64,' + btoa(html);
    var img = '<img src="' + imgsrc + '">';

    var canvas = document.querySelector("canvas"),
        context = canvas.getContext("2d");


    var image = new Image;
    image.src = imgsrc;

    image.onload = function () {
        context.drawImage(image, 0, 0);
        var canvasdata = canvas.toDataURL("image/svg");
        var a = document.createElement("a");
        a.download = "sample.png";
        a.href = canvasdata;
        a.click();
    };
});
node.append("image")
    .attr("class", "circleClass")
    .attr("xlink:href", function (d) {
        return d.photo;
    })
    .attr("x", function (d) {
        if (d.group === "Focus") {
            return -40;
        } else {
            return -25;
        }
    })
    .attr("y", function (d) {
        if (d.group === 'Focus') {
            return -40;
        } else {
            return -25;
        }
    })
    .attr("height", function (d) {
        if (d.group === "Focus") {
            return 80;
        } else {
            return 50;
        }
    })
    .attr("width", function (d) {
        if (d.group === "Focus") {
            return 80;
        } else {
            return 50;
        }
    });