How to convert/save d3.js graph to pdf/jpeg

前端 未结 4 1251
执笔经年
执笔经年 2020-11-27 15:13

I\'m working on a client-side/javascript function to save or convert an existing D3-SVG graph into a file. I\'ve searched a lot and found some recommendations, mainly using

相关标签:
4条回答
  • 2020-11-27 15:46

    The Simg library created and suggest by Mauvis Ledford above worked great for allowing my svg charts created with Dimple to be downloaded.

    I did however need to change one aspect of the code to make it work. Inside of the toString() prototype, inside the forEach loop (line 37), if you change "svg.setAttribute(..)" to "svg[0].setAttribute" it will alleviate the "setAttribute(..) is not a function" error. Similarly the same needs to be done right below in the return statement, appending "[0]" after svg (line 39).

    I also had to manually edit the "canvas.width" and "canvas.height" (lines 48 & 49) assignments in the toCanvas() prototype, in order to make the downloaded image a more correct size (it was previously just downloading a static 300x150 square in the top left corner of the chart).

    0 讨论(0)
  • 2020-11-27 15:55

    To display your svg within a canvas, you first have to convert it using a parser/renderer utility such as http://code.google.com/p/canvg/

    (code adapted from: Convert SVG to image (JPEG, PNG, etc.) in the browser, not tested)

    // the canvg call that takes the svg xml and converts it to a canvas
    canvg('canvas', $("#my-svg").html());
    
    // the canvas calls to output a png
    var canvas = document.getElementById("canvas");
    var img = canvas.toDataURL("image/png");
    
    0 讨论(0)
  • 2020-11-27 15:57

    As pointed out by @Premasagar in this comment on this question Convert SVG to image (JPEG, PNG, etc.) in the browser

    If the borwser supports both SVG and canvas you can use this technique https://svgopen.org/2010/papers/62-From_SVG_to_Canvas_and_Back/index.html

    function importSVG(sourceSVG, targetCanvas) {
        // https://developer.mozilla.org/en/XMLSerializer
        svg_xml = (new XMLSerializer()).serializeToString(sourceSVG);
        var ctx = targetCanvas.getContext('2d');
    
        // this is just a JavaScript (HTML) image
        var img = new Image();
        // http://en.wikipedia.org/wiki/SVG#Native_support
        // https://developer.mozilla.org/en/DOM/window.btoa
        img.src = "data:image/svg+xml;base64," + btoa(svg_xml);
    
        img.onload = function() {
            // after this, Canvas’ origin-clean is DIRTY
            ctx.drawImage(img, 0, 0);
        }
    }
    
    0 讨论(0)
  • 2020-11-27 16:04

    Just a heads up that I turned this concept into a small JavaScript library: https://github.com/krunkosaurus/simg

    It simply converts any SVG to an image to swap out or trigger a download. Idea taken from here: http://techslides.com/save-svg-as-an-image/

    0 讨论(0)
提交回复
热议问题