Is there a way to save the SVG generated by raphael as an svg file. Note it only need to work in chrome.
As stef commented, the BlobBuilder API is deprecated. Instead, use the Blob API.
Building on Andreas' answer, here is how I quickly got it to work:
svgString = r.toSVG();
a = document.createElement('a');
a.download = 'mySvg.svg';
a.type = 'image/svg+xml';
blob = new Blob([svgString], {"type": "image/svg+xml"});
a.href = (window.URL || webkitURL).createObjectURL(blob);
a.click();
I came up with a solution using Raphael.Export, which gives me an valid svg/xml String (something that I couldn't get from the simply from the innerHTML of the DOM object that holds the svg) and Blobbuilder to create a url for a link which will I fire a click event at the end to save the file.
svgString = @paper.toSVG();
a = document.createElement('a');
a.download = 'mySvg.svg';
a.type = 'image/svg+xml';
bb = new(window.BlobBuilder || WebKitBlobBuilder);
bb.append(svgString);
blob = bb.getBlob('image/svg+xml');
a.href = (window.URL || webkitURL).createObjectURL(blob);
a.click();
As stef commented, the BlobBuilder API is deprecated. Instead, use the Blob API.
Building on Andreas' answer, here is how I quickly got it to work:
svgString = r.toSVG();
a = document.createElement('a');
a.download = 'mySvg.svg';
a.type = 'image/svg+xml';
blob = new Blob([svgString], {"type": "image/svg+xml"});
a.href = (window.URL || webkitURL).createObjectURL(blob);
a.click();
If you don't want to use the Rapahel.Export, you can directly get the svg from the dom, like that:
var svgString = document.getElementById('holder').innerHTML;
a = document.createElement('a');
a.download = 'mySvg.svg';
a.type = 'image/svg+xml';
blob = new Blob([svgString], {"type": "image/svg+xml"});
a.href = (window.URL || webkitURL).createObjectURL(blob);
a.click();
"holder" is the id of the div where is loaded Raphael : r = Raphael("holder"); Note that I think it won't work on old browser that doesn't handle svg
For the part where you save the blob, I'd recommend https://github.com/eligrey/FileSaver.js/
or https://www.npmjs.com/package/angular-file-saver if you're using AngularJs
At least for simple cases we can use the div that the Raphael plot is written to (usually 'canvas') and download the innerhtml from that. First, we need a javascript function which will copy the content of the div and create a download link (this function was from another page, not my work):
<script>
function downloadInnerHtml(filename, divId, mimeType) {
var elHtml = document.getElementById(divId).innerHTML;
console.log(elHtml); //useful for troubleshooting
var link = document.createElement('a');
mimeType = mimeType || 'text/plain';
link.setAttribute('download', filename);
link.setAttribute('href', 'data:' + mimeType + ';charset=utf-8,' + encodeURIComponent(elHtml));
link.click();
}
</script>
Second, we need a button on the page to run the function
<button onclick="downloadInnerHtml('raphaelplot.svg', 'canvas','text/html')">save plot as svg</button>
© 2022 - 2024 — McMap. All rights reserved.
data:
link. The user can click it to display, and use 'Save' in their browser. – Demob