Подтвердить что ты не робот

Как преобразовать/сохранить график d3.js в pdf/jpeg

Я работаю над клиентской /javascript функцией для сохранения или преобразования существующего графика D3-SVG в файл. Я много искал и нашел некоторые рекомендации, главным образом используя canvas.toDataURL().

У меня нет <canvas> на моей странице и вместо этого используйте: d3.select("body").append("svg").... Я также пытался добавить SVG в <canvas>, но ничего не происходит.

Не могли бы вы помочь мне устранить это исключение:

Uncaught TypeError: Object #<SVGSVGElement> has no method 'toDataURL' 

Спасибо

4b9b3361

Ответ 1

Чтобы отобразить ваш SVG в холсте, вам сначала нужно преобразовать его с помощью утилиты синтаксического анализатора/рендера, например http://code.google.com/p/canvg/ p >

(код адаптирован из: Преобразование SVG в изображение (JPEG, PNG и т.д.) в браузере, не проверено)

// 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");

Ответ 2

Просто хедз-ап, я превратил это понятие в небольшую библиотеку JavaScript: https://github.com/krunkosaurus/simg

Он просто преобразует любой SVG в изображение для замены или запуска загрузки. Идея взята здесь: http://techslides.com/save-svg-as-an-image/

Ответ 3

Как отметил @Premasagar в этом комментарии по этому вопросу Преобразование SVG в изображение (JPEG, PNG и т.д.) в браузере

Если borwser поддерживает как SVG, так и canvas, вы можете использовать этот метод 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);
    }
}

Ответ 4

Библиотека Simg, созданная и предлагаемая Маувисом Ледфордом выше, отлично поработала над тем, чтобы мои svg-диаграммы, созданные с помощью Dimple, были загружены.

Однако мне нужно было изменить один аспект кода, чтобы он работал. Внутри прототипа toString() внутри цикла forEach (строка 37), если вы меняете "svg.setAttribute(..)" на "svg [0].setAttribute", это облегчит "setAttribute (..)", а не функция "ошибка. Точно так же должно быть сделано прямо в инструкции return, добавив" [0]" после svg (строка 39).

Мне также пришлось вручную отредактировать назначения canvas.width и canvas.height(строки 48 и 49) в прототипе toCanvas(), чтобы сделать загруженный образ более правильным (ранее он был просто загружая статический квадрат 300x150 в верхнем левом углу диаграммы).