¿Hay alguna manera de permitir que un usuario, después de haber creado un gráfico vectorial en un lienzo svg javascript usando un navegador, descargue este archivo en su sistema de archivos local?
SVG es un campo totalmente nuevo para mí, así que tenga paciencia si mi redacción no es precisa.
javascript
svg
save
filesystems
local
Dr. Jerry
fuente
fuente
Respuestas:
Podría ser posible usando el comando normal del navegador "Guardar", pero no solo guardará el lienzo SVG, sino que guardará toda la página.
Creo que lo mejor que puede hacer es usar AJAX y enviar todos los datos XML SVG como datos POST a un script de servidor, y hacer que ese script envíe de vuelta los datos POST con el encabezado
Content-Disposition: attachment; filename=yourfile.svg
.(En PHP, puede obtener el contenido POST sin procesar con
file_get_contents('php://input')
.)fuente
Puede evitar un viaje de ida y vuelta al servidor.
Base64 codifica su SVG xml.
Luego genere un enlace a esos datos. El usuario puede hacer clic derecho para guardarlo localmente.
// This example was created using Protovis & jQuery // Base64 provided by http://www.webtoolkit.info/javascript-base64.html // Modern web browsers have a builtin function to this as well 'btoa' function encode_as_img_and_link(){ // Add some critical information $("svg").attr({ version: '1.1' , xmlns:"http://www.w3.org/2000/svg"}); var svg = $("#chart-canvas").html(); var b64 = Base64.encode(svg); // or use btoa if supported // Works in recent Webkit(Chrome) $("body").append($("<img src='data:image/svg+xml;base64,\n"+b64+"' alt='file.svg'/>")); // Works in Firefox 3.6 and Webit and possibly any browser which supports the data-uri $("body").append($("<a href-lang='image/svg+xml' href='data:image/svg+xml;base64,\n"+b64+"' title='file.svg'>Download</a>")); }
La etiqueta img funciona en Webkit, el enlace funciona en Webkit y Firefox, y puede funcionar en cualquier navegador que admita
data-uri
fuente
Base64
vienedownload
atributo a su enlace, lo que lo hace un poco más fácil para el usuario. Vea aquí para más informaciónbtoa(unescape(encodeURIComponent(svg)))
—no se requieren bibliotecas.Usando FileSaver.js
saveAs(new Blob([SVG_DATA_HERE], {type:"application/svg+xml"}), "name.svg")
fuente
SVG_DATA
?document.getElementsByTagName("svg")<something to get the data>
No es necesario realizar una codificación base64; puede crear un enlace con código SVG sin procesar. Aquí hay una función modificada encode_as_img_and_link () de la respuesta de The_Who:
function img_and_link() { $('body').append( $('<a>') .attr('href-lang', 'image/svg+xml') .attr('href', 'data:image/svg+xml;utf8,' + unescape($('svg')[0].outerHTML)) .text('Download') ); }
fuente
.attr('href', ...)
es efectivamente el<svg>...</svg>
código sin formato. Funciona en Chrome y Safari, aunque no he conseguido que funcione en Edge. IE parece estar prohibido en todos los ámbitos.Con FileSaver de Eli Gray lo hice funcionar (chrome):
bb = new window.WebKitBlobBuilder; var svg = $('#designpanel').svg('get'); bb.append(svg.toSVG()); var blob = bb.getBlob("application/svg+xml;charset=" + svg.characterSet); saveAs(blob,"name.svg");
SVG es del svg de keith woods jquery.
Html Rocks 1
Html Rocks 2
fuente
// save SVG $('#SVGsave').click(function(){ var a = document.createElement('a'); a.href = 'data:image/svg+xml;utf8,' + unescape($('#SVG')[0].outerHTML); a.download = 'plot.svg'; a.target = '_blank'; document.body.appendChild(a); a.click(); document.body.removeChild(a); });
fuente
Recientemente encontré este complemento de Chrome http://nytimes.github.io/svg-crowbar/ . Es un poco defectuoso para mis necesidades, pero básicamente funciona.
Anteriormente había creado una solución similar a la respuesta aceptada que involucraba un script del lado del servidor, pero es bastante largo y también tenía el problema de que todos los estilos tenían que estar en línea en el marcado. Crowbar parece encargarse de eso por ti, lo cual es bueno.
fuente
Estoy respondiendo a este tema, aunque tiene algunos años, porque la reciente convergencia de navegadores web en su soporte para SVG y otros comportamientos relevantes ha generado un renovado interés en SVG y permite una respuesta 'universal' a la pregunta. En esencia, el enfoque de zneak es correcto pero, en mi opinión, conciso (es decir, me tomó un tiempo hacerlo funcionar por mí mismo). También creo que su referencia a AJAX es innecesaria o no es lo que entiendo por AJAX (= usa XMLHttpRequest). Por lo tanto, proporcionaré una respuesta más detallada utilizando JavaScript puro (es decir, sin JQuery o cualquier otra biblioteca) y proporcionaré código de servidor para Java, Perl y PHP.
(1) Incluya el contenido SVG (generado dinámicamente) en su página HTML en un div con una ID única, p. Ej.
<div id="svg"><svg...>SVG content</svg></div>
(2) Incluya un botón para invocar la función de JavaScript, p. Ej.
<button onclick="sendSVG();">Save as SVG File</button>
(3) Incluya la función de JavaScript nombrada en el marcado de su botón:
function sendSVG() { var svgText = document.getElementById('svg').innerHTML; var form = document.createElement("form"); form.setAttribute("method", "post"); form.setAttribute("action", "http://path-to-your-server-app"); form.setAttribute("accept-charset", "UTF-8"); var hiddenSVGField = document.createElement("input"); hiddenSVGField.setAttribute("type", "hidden"); hiddenSVGField.setAttribute("name", "svgText"); hiddenSVGField.setAttribute("value", svgText); form.appendChild(hiddenSVGField); document.body.appendChild(form); form.submit(); }
(4) Escriba una aplicación de servidor para aceptar su solicitud de publicación SVGtext y devolverla como image / svg + xml usando Content-Disposition para especificar un archivo adjunto. Se presenta código de trabajo en tres idiomas, aunque no soy un programador de Perl y nunca he usado PHP con rabia.
Servlet de Java
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String svgText = (String) request.getParameter("svgText"); response.setContentType("image/svg+xml"); response.addHeader("Content-Disposition", "attachment; filename=\"image.svg\""); PrintWriter out = response.getWriter(); out.println(svgText); }
Perl CGI
use CGI qw(:standard); my $svgText = param('svgText'); print header(-type => "image/svg+xml", -content_disposition => "attachment; filename=image.svg"); print $svgText;
PHP
<?php $svgText = $_POST['svgText']; header('Content-type: image/svg+xml'); header('Content-Disposition: attachment; filename="image.svg"'); print "$svgText"; ?>
He usado un nombre codificado para la imagen aquí (image.svg), pero en realidad seleccioné un descriptor del contenido dinámico que genero de la página (usando un div y una ID nuevamente, y
document.getElementById('graphName').textContent
).Esto se ha probado en Mac Safari 9, Firefox 42, Chrome 47, Opera 34 y Windows7 / IE 11 y Windows10 / Edge y, en cada caso, se descarga el archivo svg o se le solicita que lo descargue. Los archivos resultantes se abrirán, por ejemplo, en Adobe Illustrator o en cualquier otra aplicación que haya configurado para abrir archivos svg.
Un ejemplo del mundo real de esto (si considera la investigación académica del mundo real) está en http://flyatlas.gla.ac.uk/MidgutAtlas/index.html en la sección Gen.
fuente
Si es posible. Use jquery.svg http://keith-wood.name/svgRef.html y publique los datos svg xml usando la función svg.toSVG () (escribiendo en un campo oculto al enviar). Haga que el php guarde y convierta a ráster usando imagemagick (convierta image.svg image.png), luego fuerce la descarga del archivo usando el encabezado ("Content-Type: application / octet-stream") y readfile la imagen.
fuente
La forma más compatible sería un viaje de ida y vuelta al servidor. También puede usar un URI de datos en algunos navegadores.
fuente
No puede guardar nada con javascript en el sistema de archivos local, lo que debe hacer es enviar el contenido
canvas
al servidor y hacer que el usuario lo descargue y lo guarde.fuente
Para responder mi propia pregunta:
Otra posibilidad, aunque no la más agradable, es mostrar el contenido serializado en la página web y hacer que el usuario lo seleccione, copie y pegue. Esto después de investigar la solución de Eli Grey.
fuente
Quizás descubrí una mejor manera de no obligar al usuario a presionar el botón derecho del ratón en "guardar imagen como". simplemente dibuje en vivo el código base64 del lienzo en el href del enlace y modifíquelo para que la descarga comience automáticamente. No sé si su navegador universal es compatible, pero debería funcionar con los navegadores principales / nuevos.
var canvas = document.getElementById('your-canvas'); if (canvas.getContext) { var C = canvas.getContext('2d'); } $('#your-canvas').mousedown(function(event) { // feel free to choose your event ;) // just for example // var OFFSET = $(this).offset(); // var x = event.pageX - OFFSET.left; // var y = event.pageY - OFFSET.top; // standard data to url var imgdata = canvas.toDataURL('image/png'); // modify the dataUrl so the browser starts downloading it instead of just showing it var newdata = imgdata.replace(/^data:image\/png/,'data:application/octet-stream'); // give the link the values it needs $('a.linkwithnewattr').attr('download','your_pic_name.png').attr('href',newdata); });
siéntete libre de envolver el a alrededor de lo que quieras, espero que eso ayude un poco
fuente
$(document).ready(function(){ $("#btnDownload").click(function(){ var $container = $('#svg-container'), // Canvg requires trimmed content content = $container.html().trim(), canvas = document.getElementById('svg-canvas'); // Draw svg on canvas canvg(canvas, content); $container.hide(); // Change img be SVG representation var theImage = canvas.toDataURL('image/jpeg'); var a = document.createElement('a'); a.href = theImage; // xhr.response es un blob file a.target = '_blank'; a.download = 'prueba'; // nombre del archivo. a.style.display = 'none'; document.body.appendChild(a); a.click(); delete a; });//fin function });// fin
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script type="text/javascript" src="http://canvg.googlecode.com/svn/trunk/rgbcolor.js"></script> <script type="text/javascript" src="http://canvg.googlecode.com/svn/trunk/canvg.js"></script> <input id="svgData" name="svgData" type="hidden"/> <input id="btnDownload" type="button" value="Descargar"/> <div id='svg-container'> <svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" style="font-family:'lucida grande', 'lucida sans unicode', arial, helvetica, sans-serif;font-size:12px;" xmlns="http://www.w3.org/2000/svg" width="600" height="400"><desc>Created with Highcharts 4.0.4</desc><defs><clipPath id="highcharts-5"><rect x="-75" y="-75" width="750" height="550"></rect></clipPath></defs><rect x="0" y="0" width="600" height="400" strokeWidth="0" fill="#FFFFFF" class=" highcharts-background"></rect><g style="stroke:rgba(255,255,255,0);"><path fill="rgb(255,255,255)" fill-opacity="0" d="M 59 79 L 460 61 L 456 287 L 65 330 Z" stroke-linejoin="round"></path><path fill="rgb(255,255,255)" fill-opacity="0" d="M 65 330 L 456 287 L 456 286 L 65 330 Z" stroke-linejoin="round"></path><path fill="rgb(230,230,230)" fill-opacity="0" d="M 0 0" stroke-linejoin="round"></path></g><g style="stroke:rgba(255,255,255,0);"><path fill="rgb(255,255,255)" fill-opacity="0" d="M 495 66 L 496 66 L 490 300 L 490 301 Z" stroke-linejoin="round"></path><path fill="rgb(230,230,230)" fill-opacity="0" d="M 495 66 L 460 61 L 455 287 L 490 301 Z" stroke-linejoin="round"></path><path fill="rgb(255,255,255)" fill-opacity="0" d="M 495 66 L 460 61 L 460 61 L 496 66 Z" stroke-linejoin="round"></path></g><g style="stroke:rgba(255,255,255,0);"><path fill="rgb(255,255,255)" fill-opacity="0" d="M 88 345 L 490 300 L 490 300 L 88 346 Z" stroke-linejoin="round"></path><path fill="rgb(255,255,255)" fill-opacity="0" d="M 88 346 L 490 300 L 457 287 L 65 330 Z" stroke-linejoin="round"></path><path fill="rgb(230,230,230)" fill-opacity="0" d="M 88 345 L 65 329 L 65 330 L 88 346 Z" stroke-linejoin="round"></path></g><g class="highcharts-grid" ><path fill="none" d="M 146 75 L 146 75 L 150 320 L 175 336" stroke="#C0C0C0" stroke-width="1" opacity="1"></path><path fill="none" d="M 189 73 L 189 73 L 191 316 L 217 331" stroke="#C0C0C0" stroke-width="1" opacity="1"></path><path fill="none" d="M 230 71 L 230 71 L 232 311 L 259 326" stroke="#C0C0C0" stroke-width="1" opacity="1"></path><path fill="none" d="M 271 69 L 271 69 L 271 307 L 300 322" stroke="#C0C0C0" stroke-width="1" opacity="1"></path><path fill="none" d="M 310 67 L 310 67 L 310 302 L 339 317" stroke="#C0C0C0" stroke-width="1" opacity="1"></path><path fill="none" d="M 349 66 L 349 66 L 348 298 L 378 313" stroke="#C0C0C0" stroke-width="1" opacity="1"></path><path fill="none" d="M 387 64 L 387 64 L 385 294 L 416 308" stroke="#C0C0C0" stroke-width="1" opacity="1"></path><path fill="none" d="M 424 62 L 424 62 L 421 290 L 454 304" stroke="#C0C0C0" stroke-width="1" opacity="1"></path><path fill="none" d="M 461 61 L 461 61 L 457 286 L 491 300" stroke="#C0C0C0" stroke-width="1" opacity="1"></path><path fill="none" d="M 103 77 L 103 77 L 108 325 L 131 341" stroke="#C0C0C0" stroke-width="1" opacity="1"></path><path fill="none" d="M 59 79 L 59 79 L 65 329 L 87 345" stroke="#C0C0C0" stroke-width="1" opacity="1"></path></g><g class="highcharts-grid" ><path fill="none" d="M 59 78 L 59 78 L 461 60 L 496 66" stroke="#C0C0C0" stroke-width="1" opacity="1"></path><path fill="none" d="M 61 144 L 61 144 L 460 119 L 494 127" stroke="#C0C0C0" stroke-width="1" opacity="1"></path><path fill="none" d="M 62 206 L 62 206 L 459 175 L 493 185" stroke="#C0C0C0" stroke-width="1" opacity="1"></path><path fill="none" d="M 64 269 L 64 269 L 458 232 L 492 243" stroke="#C0C0C0" stroke-width="1" opacity="1"></path><path fill="none" d="M 65 330 L 65 330 L 457 286 L 490 300" stroke="#C0C0C0" stroke-width="1" opacity="1"></path></g><g class="highcharts-axis" ><path fill="none" d="M 75 325.5 L 525 325.5" stroke="#C0D0E0" stroke-width="1" visibility="hidden"></path></g><g class="highcharts-axis" ><text x="556.96875" text-anchor="middle" transform="translate(0,0) rotate(90 556.96875 200)" class=" highcharts-yaxis-title" style="color:#707070;fill:#707070;" visibility="visible" y="200">Values</text></g><g class="highcharts-series-group" ><g class="highcharts-series" visibility="visible" transform="translate(75,75) scale(1 1)" clip-path="url(#highcharts-5)"><g r="0" stroke="#7cb5ec" stroke-width="1"><path fill="#7cb5ec" d="M 390 141 L 408 139 L 406 226 L 388 228 Z" stroke-linejoin="round"></path><path fill="rgb(99,156,211)" fill-opacity="1" d="M 390 141 L 378 137 L 376 223 L 388 228 Z" stroke-linejoin="round"></path><path fill="rgb(149,206,255)" fill-opacity="1" d="M 390 141 L 378 137 L 395 136 L 408 139 Z" stroke-linejoin="round"></path></g><g r="0" stroke="#7cb5ec" stroke-width="1"><path fill="#7cb5ec" d="M 353 56 L 372 54 L 369 230 L 351 232 Z" stroke-linejoin="round"></path><path fill="rgb(99,156,211)" fill-opacity="1" d="M 353 56 L 342 53 L 339 227 L 351 232 Z" stroke-linejoin="round"></path><path fill="rgb(149,206,255)" fill-opacity="1" d="M 353 56 L 342 53 L 360 52 L 372 54 Z" stroke-linejoin="round"></path></g><g r="0" stroke="#7cb5ec" stroke-width="1"><path fill="#7cb5ec" d="M 314 118 L 333 117 L 332 235 L 313 237 Z" stroke-linejoin="round"></path><path fill="rgb(99,156,211)" fill-opacity="1" d="M 314 118 L 303 114 L 302 231 L 313 237 Z" stroke-linejoin="round"></path><path fill="rgb(149,206,255)" fill-opacity="1" d="M 314 118 L 303 114 L 322 113 L 333 117 Z" stroke-linejoin="round"></path></g><g r="0" stroke="#7cb5ec" stroke-width="1"><path fill="#7cb5ec" d="M 275 212 L 294 210 L 293 239 L 274 241 Z" stroke-linejoin="round"></path><path fill="rgb(149,206,255)" fill-opacity="1" d="M 275 212 L 264 207 L 283 205 L 294 210 Z" stroke-linejoin="round"></path><path fill="rgb(99,156,211)" fill-opacity="1" d="M 275 212 L 264 207 L 264 236 L 274 241 Z" stroke-linejoin="round"></path></g><g r="0" stroke="#7cb5ec" stroke-width="1"><path fill="#7cb5ec" d="M 235 94 L 255 93 L 254 243 L 235 246 Z" stroke-linejoin="round"></path><path fill="rgb(99,156,211)" fill-opacity="1" d="M 235 94 L 224 90 L 224 240 L 235 246 Z" stroke-linejoin="round"></path><path fill="rgb(149,206,255)" fill-opacity="1" d="M 235 94 L 224 90 L 244 89 L 255 93 Z" stroke-linejoin="round"></path></g><g r="0" stroke="#7cb5ec" stroke-width="1"><path fill="#7cb5ec" d="M 194 250 L 214 248 L 214 248 L 194 250 Z" stroke-linejoin="round"></path><path fill="rgb(149,206,255)" fill-opacity="1" d="M 194 250 L 184 245 L 204 243 L 214 248 Z" stroke-linejoin="round"></path><path fill="rgb(99,156,211)" fill-opacity="1" d="M 194 250 L 184 245 L 184 245 L 194 250 Z" stroke-linejoin="round"></path></g><g r="0" stroke="#7cb5ec" stroke-width="1"><path fill="#7cb5ec" d="M 152 131 L 173 130 L 173 253 L 153 255 Z" stroke-linejoin="round"></path><path fill="rgb(99,156,211)" fill-opacity="1" d="M 152 131 L 142 127 L 143 249 L 153 255 Z" stroke-linejoin="round"></path><path fill="rgb(149,206,255)" fill-opacity="1" d="M 152 131 L 142 127 L 163 126 L 173 130 Z" stroke-linejoin="round"></path></g><g r="0" stroke="#7cb5ec" stroke-width="1"><path fill="#7cb5ec" d="M 66 170 L 88 168 L 89 262 L 68 264 Z" stroke-linejoin="round"></path><path fill="rgb(99,156,211)" fill-opacity="1" d="M 66 170 L 57 165 L 59 259 L 68 264 Z" stroke-linejoin="round"></path><path fill="rgb(149,206,255)" fill-opacity="1" d="M 66 170 L 57 165 L 79 163 L 88 168 Z" stroke-linejoin="round"></path></g><g r="0" stroke="#7cb5ec" stroke-width="1"><path fill="#7cb5ec" d="M 23 206 L 44 204 L 45 267 L 24 269 Z" stroke-linejoin="round"></path><path fill="rgb(99,156,211)" fill-opacity="1" d="M 23 206 L 14 201 L 15 264 L 24 269 Z" stroke-linejoin="round"></path><path fill="rgb(149,206,255)" fill-opacity="1" d="M 23 206 L 14 201 L 36 199 L 44 204 Z" stroke-linejoin="round"></path></g></g><g class="highcharts-markers" visibility="visible" transform="translate(75,75) scale(1 1)" clip-path="none"></g></g><text x="300" text-anchor="middle" class="highcharts-title" style="color:#333333;font-size:18px;fill:#333333;width:536px;" y="25"><tspan>3D chart with null values</tspan></text><text x="300" text-anchor="middle" class="highcharts-subtitle" style="color:#555555;fill:#555555;width:536px;" y="53"><tspan>Notice the difference between a 0 value and a null point</tspan></text><g class="highcharts-legend" transform="translate(270,364)"><g ><g><g class="highcharts-legend-item" transform="translate(8,3)"><text x="21" style="color:#333333;font-size:12px;font-weight:bold;cursor:pointer;fill:#333333;" text-anchor="start" y="15">Sales</text><rect x="0" y="4" width="16" height="12" fill="#7cb5ec"></rect></g></g></g></g><g class="highcharts-axis-labels highcharts-xaxis-labels" ><text x="110" text-anchor="middle" style="width:25px;color:#606060;cursor:default;font-size:11px;fill:#606060;" y="363" z="-59" opacity="1">Jan</text><text x="154" text-anchor="middle" style="width:25px;color:#606060;cursor:default;font-size:11px;fill:#606060;" y="358" z="-40" opacity="1">Feb</text><text x="197" text-anchor="middle" style="width:25px;color:#606060;cursor:default;font-size:11px;fill:#606060;" y="353" z="-22" opacity="1">Mar</text><text x="239" text-anchor="middle" style="width:25px;color:#606060;cursor:default;font-size:11px;fill:#606060;" y="348" z="-3" opacity="1">Apr</text><text x="280" text-anchor="middle" style="width:25px;color:#606060;cursor:default;font-size:11px;fill:#606060;" y="343" z="16" opacity="1">May</text><text x="320" text-anchor="middle" style="width:25px;color:#606060;cursor:default;font-size:11px;fill:#606060;" y="338" z="35" opacity="1">Jun</text><text x="359" text-anchor="middle" style="width:25px;color:#606060;cursor:default;font-size:11px;fill:#606060;" y="334" z="53" opacity="1">Jul</text><text x="398" text-anchor="middle" style="width:25px;color:#606060;cursor:default;font-size:11px;fill:#606060;" y="329" z="72" opacity="1">Aug</text><text x="435" text-anchor="middle" style="width:25px;color:#606060;cursor:default;font-size:11px;fill:#606060;" y="324" z="91" opacity="1">Sep</text><text x="472" text-anchor="middle" style="width:25px;color:#606060;cursor:default;font-size:11px;fill:#606060;" y="320" z="109" opacity="1">Oct</text></g><g class="highcharts-axis-labels highcharts-yaxis-labels" ><text x="502" text-anchor="start" style="width:55px;color:#606060;cursor:default;font-size:11px;fill:#606060;" y="301" z="122" opacity="1">0</text><text x="504" text-anchor="start" style="width:55px;color:#606060;cursor:default;font-size:11px;fill:#606060;" y="244" z="111" opacity="1">2</text><text x="505" text-anchor="start" style="width:55px;color:#606060;cursor:default;font-size:11px;fill:#606060;" y="187" z="100" opacity="1">4</text><text x="506" text-anchor="start" style="width:55px;color:#606060;cursor:default;font-size:11px;fill:#606060;" y="128" z="90" opacity="1">6</text><text x="508" text-anchor="start" style="width:55px;color:#606060;cursor:default;font-size:11px;fill:#606060;" y="69" z="79" opacity="1">8</text></g><g class="highcharts-tooltip" style="cursor:default;padding:0;white-space:nowrap;" transform="translate(0,-9999)"><path fill="none" d="M 3 0 L 13 0 C 16 0 16 0 16 3 L 16 13 C 16 16 16 16 13 16 L 3 16 C 0 16 0 16 0 13 L 0 3 C 0 0 0 0 3 0" stroke="black" stroke-opacity="0.049999999999999996" stroke-width="5" transform="translate(1, 1)"></path><path fill="none" d="M 3 0 L 13 0 C 16 0 16 0 16 3 L 16 13 C 16 16 16 16 13 16 L 3 16 C 0 16 0 16 0 13 L 0 3 C 0 0 0 0 3 0" stroke="black" stroke-opacity="0.09999999999999999" stroke-width="3" transform="translate(1, 1)"></path><path fill="none" d="M 3 0 L 13 0 C 16 0 16 0 16 3 L 16 13 C 16 16 16 16 13 16 L 3 16 C 0 16 0 16 0 13 L 0 3 C 0 0 0 0 3 0" stroke="black" stroke-opacity="0.15" stroke-width="1" transform="translate(1, 1)"></path><path fill="rgb(249, 249, 249)" fill-opacity=" .85" d="M 3 0 L 13 0 C 16 0 16 0 16 3 L 16 13 C 16 16 16 16 13 16 L 3 16 C 0 16 0 16 0 13 L 0 3 C 0 0 0 0 3 0"></path><text x="8" style="font-size:12px;color:#333333;fill:#333333;" y="21"></text></g><text x="590" text-anchor="end" style="cursor:pointer;color:#909090;font-size:9px;fill:#909090;" y="395">Highcharts.com</text></svg> </div> <section> <canvas id="svg-canvas"></canvas> </section>
fuente
Hice un marcador limpio y utilizable con las sugerencias.
Pondrá un enlace único junto a cada línea
<svg>
en la página.https://codepen.io/corysimmons/pen/vybzqV
Espero que ayude a alguien.
fuente
No es necesario realizar ninguna programación. Hay aplicaciones en línea que la gente ya ha creado para eso, e incluyen parámetros definibles como dimensiones, resolución, formato de salida, etc.
Esta es una de las mejores aplicaciones de conversión de imágenes en línea que he encontrado para svg-> jpeg. http://image.online-convert.com/convert-to-jpg
fuente