我尝试了这里的每一个解决方案,但都没有解决我的问题。我的图片始终比我的d3.js画布小。
我不得不设置画布的宽度、高度,然后在上下文中进行clearRect操作才能使其正常工作。这是我的有效版本。
导出函数:
var svgHtml = document.getElementById("d3-canvas"),
svgData = new XMLSerializer().serializeToString(svgHtml),
svgBlob = new Blob([svgData], {type:"image/svg+xml;charset=utf-8"}),
bounding = svgHtml.getBoundingClientRect(),
width = bounding.width * 2,
height = bounding.height * 2,
canvas = document.createElement("canvas"),
context = canvas.getContext("2d"),
exportFileName = 'd3-graph-image.png';
canvas.width = width;
canvas.height = height;
var image = new Image();
image.onload = function() {
context.clearRect(0, 0, width, height);
context.drawImage(image, 0, 0, width, height);
canvas.toBlob(function(blob) {
saveAs(blob, exportFileName);
});
};
var svgUrl = URL.createObjectURL(svgBlob);
image.src = svgUrl;
它使用
FileSaver.js 保存文件。
这是我的画布创建,注意我在这里解决了命名空间问题。
d3.js 画布创建:
var canvas = d3.select("body")
.insert("svg")
.attr('id', 'd3-canvas')
.attr("xmlns", "http://www.w3.org/2000/svg")
.attr("xmlns:xlink", "http://www.w3.org/1999/xlink")
.attr("width", width)
.attr("height", height);