2017-07-24 2 views
0

Ich möchte eine HTML-Seite in ein Bild zu konvertieren, wenn ich den folgenden Code verwenden, bekomme ich ein Ergebnis, das nicht ganz das entspricht, was ich erwarten würde.konvertieren HTML mit Highcharts Grafik in Bild mit html2canvas

html2canvas($("#sharedOne"), {       
onrendered: function (canvas) {     
console.log("canvas",canvas) 
    var imgsrc = canvas.toDataURL("image/png"); 
    console.log(imgsrc); 
    } 
}); 

Dies ist ein Screenshot der HTML

This is a screenshot

und dies ist ein Screenshot für die Ergebnisse über den Code ausgeführt wird.

this is a screenshot Wenn ich den Code unten ich eine Fehlermeldung erhalten:

var canvas = document.getElementById('sharedOne'); 
console.log("CSSSS",canvas) 
var t = canvas.toDataURL("image/png"); 
console.log("chart",t) 

Der Fehler ist:

error canvas.toDataURL is not a function

ich erstellen Beispiel für dieses Problem überprüfen Sie bitte

https://jsfiddle.net/solanki/hku6r7g2/

Hinweis: Die HTML-Seite enthält ein Highchart-Diagramm

+1

haben Sie überprüft, was 'canvas' Wert nach' var Leinwand = document.getElementById ('sharedOne'); '? –

+0

Entweder Ihr #sharedOne-Div existiert nicht oder ist kein HTML-Canvas-Element. –

+0

@henriqueromao Ja, ich überprüfe Leinwand Wert. es ist nur return html –

Antwort

0

Es sieht aus wie es mit Beta-Version (0.5.0-Beta4) von html2canvas funktioniert.

$('#convert').bind('click', function() { 
    html2canvas($("#main-container"), { 
    onrendered: function(canvas) { 
     var imgsrc = canvas.toDataURL("image/png"); 
     $('<img src="' + imgsrc + '" />').appendTo('#main-container'); 
    } 
    }); 
}); 

Beispiel:
http://jsfiddle.net/g1c8Lyfn/

+0

Danke Mann. es funktioniert gut, aber das Bild wurde gestreckt. –

+0

Es funktioniert für Chrome, funktioniert aber nicht in Firefox. –

0

.toDataURL() kann nur unter <canvas> Elemente aufgerufen werden; Es kann nicht für beliebiges HTML verwendet werden.

console.log("Canvas:"); 
 
var theCanvas = document.getElementById('theCanvas'); 
 
var a = theCanvas.toDataURL("image/png"); 
 
console.log(a); // this will work 
 

 
console.log("Div:"); 
 
var theDiv = document.getElementById('theDiv'); 
 
// this will throw the "not a function" error: 
 
var b = theDiv.toDataURL("image/png");
<div id="theDiv"></div> 
 

 
<canvas id="theCanvas"></canvas>

Die html2canvas Plugin zuerst erstellt ein <canvas> Element auf dem ursprünglichen HTML-basierte verwendet, so dass Sie .toDataURL() auf sie verwenden können - aber nicht SVG unterstützt, weshalb Ihr Diagramm ist ist in der Ausgabe nicht sichtbar.

einige andere Techniken für HTML in ein Bild konvertieren kann in diesem (alt, aber ich habe nichts mehr den letzten auf den ersten Blick sehen) zu finden Frage: Render HTML to an image

der Zwischenzeit für SVG in ein Bild umwandelt, siehe Convert SVG to image (JPEG, PNG, etc.) in the browser

Sie können diese Techniken in der Folge an die Kette der Lage sein: zuerst die SVG in eine jpeg oder png konvertieren, dann wandeln die HTML enthält das Bild in ein <canvas>, dann verwenden .toDataURL auf dass ...

+0

Ich denke, es ohne Leinwand arbeitet überprüfen Sie bitte diesen Link https://jsfiddle.net/solanki/hku6r7g2/ Ich habe das gleiche Problem –

+0

@Solankiram Der Code in dieser Geige html2canvas verwendet das HTML ein 'zu konvertieren 'Element vor Aufruf von' .toDataURL() 'darauf. (Beachten Sie die Ausgabe der Zeile 'console.log (" canvas ", canvas)). Dies ist die gleiche Technik, die in der akzeptierten Antwort in der älteren Frage verwendet wird, mit der ich verbunden bin. –

+0

@Solankiram Entschuldigung, ich habe zuerst nicht bemerkt, dass es zwei verschiedene Fragen gab, und ich hatte nur einen von ihnen beantwortet. Ich habe die Antwort –

0

Soweit ich dieses Problem analysiert habe, habe ich erfahren, dass es um die Konvertierung von SVG in PNG geht (SVG -> Canvas -> PNG). In diesem Fall funktioniert html2canvas möglicherweise nicht gut.

Warum in diesem Fall nicht html2canvas passen:

Seit Highcharts Verwendung von SVG machen die Grafiken und Diagramme zu machen, bedarf es svg umgewandelt wird anstelle von HTML auf der Leinwand. html2canvas ist ein sehr guter html to canvas converter, aber es scheint, dass es not designed to convert svg's oder may render faulty war.

Bei der Suche nach Google stieß ich auf etwas namens Canvg, von dem ich dachte, es könnte Ihnen helfen. Also ich habe es codiert und es hat geklappt.Im Folgenden werde ich das Code-Snippet angebracht haben, die, wenn Sie können Sie verwenden möchten:

<html> 
<head></head> 
<body> 
<script src="https://code.jquery.com/jquery-3.2.1.js"></script> 
<script src="https://code.highcharts.com/highcharts.js"></script> 
<script src="https://code.highcharts.com/modules/exporting.js"></script> 

<!-- 
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.js"> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.svg.js"></script> 
--> 

<script type="text/javascript" src="http://canvg.github.io/canvg/rgbcolor.js"></script> 
<script type="text/javascript" src="http://canvg.github.io/canvg/StackBlur.js"></script> 
<script type="text/javascript" src="http://canvg.github.io/canvg/canvg.js"></script> 
<div id="sharedOne"> 
    <div id="container"></div> 
    <button class="clickGrn"> 
     GENERATE IMAGE 
    </button> 
</div> 
<div id="img"> 
    <img id="newimg"> 
</div> 

<script> 
     Highcharts.chart('container', { 

     title: { 
      text: 'Solar Employment Growth by Sector, 2010-2016' 
     }, 

     subtitle: { 
      text: 'Source: thesolarfoundation.com' 
     }, 

     yAxis: { 
      title: { 
       text: 'Number of Employees' 
      } 
     }, 
     legend: { 
      layout: 'vertical', 
      align: 'right', 
      verticalAlign: 'middle' 
     }, 

     plotOptions: { 
      series: { 
       pointStart: 2010 
      } 
     }, 

     series: [{ 
       name: 'Installation', 
       data: [43934, 52503, 57177, 69658, 97031, 119931, 137133, 154175] 
      }, { 
       name: 'Manufacturing', 
       data: [24916, 24064, 29742, 29851, 32490, 30282, 38121, 40434] 
      }, { 
       name: 'Sales & Distribution', 
       data: [11744, 17722, 16005, 19771, 20185, 24377, 32147, 39387] 
      }, { 
       name: 'Project Development', 
       data: [null, null, 7988, 12169, 15112, 22452, 34400, 34227] 
      }, { 
       name: 'Other', 
       data: [12908, 5948, 8105, 11248, 8989, 11816, 18274, 18111] 
      }] 

    }); 

    /* 
    YOU SHALL REPLACE THE FOLLOWING CODE WITH THE CODE PROVIDED BELOW 
    ================================================================= 
    $("body").on("click", ".clickGrn", function() { 
     alert("Calll"); 
     html2canvas($("#sharedOne"), { 
     allowTaint: true, 
       onrendered: function (canvas) { 
        canvg('canvas', canvas); 
        var imgsrc = canvas.toDataURL("image/jpg"); 
        console.log(imgsrc); 
        $("#newimg").attr('src', imgsrc); 
       } 
      }); 
     }); 
    */ 

$("body").on("click", ".clickGrn", function() { 

    var canvasSharedOne = document.createElement("canvas"); 
    var HighChartsSVG=$('#container').find('svg')[0].outerHTML; 
    canvg(canvasSharedOne, HighChartsSVG); 
    var imgsrc = canvasSharedOne.toDataURL(); 
    document.getElementById('newimg').src = imgsrc; 

    }); 

</script> 
</body> 
</html> 

Aber ja, noch konnte ich versuche, die neueste Version von html2canvas zu verwenden, die eine zusätzliche html2canvas.svg.js enthält, aber nicht herausfinden, wie man Verwenden Sie es, da der Ersteller die Bibliothek von Grund auf neu geschrieben hat. Außerdem hat er angegeben, dass SVG-Rendering-Unterstützung hinzugefügt wird. Beim Lesen des Codes denke ich, dass er FabricJS für Canvas-Unterstützung verwendet hat.

Da es neu ist, können wir keine Codebeispiele erwarten, da es noch in der Entwicklungsphase ist.

+0

es funktioniert, aber dieses erzeugt nur SVG zu Bild, nicht HTML. Ich brauche beides (HTML und Grafik). –

Verwandte Themen