2013-02-03 7 views
9

Ich versuche, ein automatisches Berichterstellungs-Tool für meine Kunden zu implementieren. Ich muss Berichte im PDF-Format erstellen und ich bin sehr komfortabel beim Erstellen von Diagrammen mit Jquery Flot. Ich brauche nur einen Weg, um die Graphen in das PDF zu bekommen.Erstellen von PDF-Berichten mit Flot-Diagramm

Ich versuchte mit fliegende Untertasse (Xhtmlrenderer), um das Bild des Diagramms zu erfassen, aber es scheint mir nicht zu helfen, da die Grafiken von Javascript erstellt werden.

Kann xhtmlrenderer die Elemente erfassen, die mit Javascript erstellt wurden?

oder ist es ein anderes Werkzeug, das das Bild des Graphen erfassen kann?

Antwort

9

Flot zeichnet seine Grafik auf HTML5 <canvas> Element. So könnte das mögliche Szenario wie folgt sein:

  1. Abrufen von Bilddaten aus Leinwand mit toDataURL wie in this answer beschrieben.
  2. Erstellen Sie ein PDF mit jsPDF, verwenden Sie addImage wie im ersten Beispiel, um das Bild einzubetten.

ABER Notiz, in diesem Szenario Sie keine Achsenbeschriftungen in Bild sehen werden, weil sie nicht auf Leinwand gezogen werden, sie sind einfach <div> Elemente mit position:relative positioniert. Ich fand this post, wo der Autor ein Flotplugin anbietet, das Flot zwingt, Text auf Leinwand zu zeichnen, aber ich habe keine Idee, ob es funktioniert.UPD: Das Zeichnen von Etiketten auf Leinwand ist in der kommenden Version 0.8 enthalten (siehe Kommentare).

ABER die Legende ist auch nicht auf Leinwand gezogen, es ist auch ein richtig positioniert <div>. Scheint wie Leute in der Flot-Community versuchen, etwas damit zu tun, habe ich zwei Pull-Anfragen gefunden, the first Modifizierung des Kerns, the other Einführung eines Plugins. Keiner von ihnen ist seit etwa 9 Monaten zusammengeführt, und sie sind für v. 0,9 Meilenstein markiert, der nach-next ist und kein Fälligkeitsdatum hat. Zumindest ist es möglich, diese Leute Repos zu klonen und ihre Arbeit zu testen.

Diskussionsforum viele Leute um Flot sind mit diesem Problem betroffen, aber leider gibt es keine stabilen, Out-of-Box, wie es noch zu tun - nur die Hoffnung, dass 0,9 endlich mal mit dieser Frage kommen adressiert.

+2

der aktuelle Hauptzweig (0.8.0) nicht tatsächlich Achsenbeschriftungen die Leinwand ziehen. Die Fertigstellung dieser Funktionalität (da viele Leute immer noch eine Möglichkeit haben wollen, HTML-Text zu verwenden) ist das letzte verbleibende Arbeitselement, bevor wir 0.8.0 veröffentlichen. Die Fähigkeit, die gesamte Handlung - einschließlich der Legende - auf die Leinwand zu zeichnen, ist daher Teil unserer Zukunftspläne. Wir haben die beiden vorhandenen Pull-Anforderungen nicht zusammengeführt, da die erste wirklich nicht ordnungsgemäß implementiert wurde und die zweite nicht mit dem Modell übereinstimmt, das wir für Achsenbeschriftungen verwenden. – DNS

+0

@DNS, danke für die "offizielle" Info! Ich habe den Teil meiner Antwort auf Achsenbeschriftungen aktualisiert. – NIA

+0

die Pull-Anfrage, die den Kern geändert hat, funktionierte für mich. –

2

Wenn Sie dies serverseitig tun können und Sie auf einem Unix-basierten System sind, würde ich versuchen wkhtmltopdf.

EDITS nach einiger Zeit

Nun wird ein Tag, diese Serverside tun ich die großartige phantomjs verwenden würde. Ich verwende das schon seit einiger Zeit auf einem Flot-basierten Projekt und es funktioniert perfekt.

+0

Funktioniert auch auf Windows. – ollo

5

Ich habe ein JSFiddle mit einem Beispiel zusammengestellt, wie man das mit Flot + Html2Canvas + jsPDF erreichen kann. Die exportierte PDF enthält Achsen, Legenden usw.:

html2canvas($("#placeholder").get(0), { 
    onrendered: function(canvas) { 
    document.body.appendChild(canvas); 

    var imgData = canvas.toDataURL('image/png'); 
    var doc = new jsPDF('landscape'); 

    doc.addImage(imgData, 'PNG', 10, 10, 190, 95); 
    doc.save('sample-file.pdf'); 
    } 
}); 

JS Fiddle

+0

Ich bin mit dem gleichen Problem konfrontiert ... pdf funktioniert gut, aber es nicht Seite richtig auch gestreckt. Irgendeine aktualisierte Antwort dafür? –

+0

Wie man es mit mehreren Seiten erzeugt. –

+0

Überprüfen Sie die Funktion ['addPage'] (http://rawgit.com/MrRio/jsPDF/master/docs/global.html#addPage) –