2013-02-03 18 views
9

Sto cercando di implementare uno strumento di generazione automatica di report per i miei clienti. Ho bisogno di creare report in formato pdf e mi sto molto a mio agio nella creazione di grafici usando il jQuery flot. Ho solo bisogno di un modo per ottenere i grafici all'interno del pdf.Creazione di report PDF con grafico flottante

Ho provato ad utilizzare disco volante (xhtmlrenderer) per catturare l'immagine del grafico, ma non sembra aiutare me come i grafici creati da JavaScript.

can xhtmlrenderer può acquisire gli elementi creati con javascript?

o è il loro qualsiasi altro strumento in grado di catturare l'immagine del grafico?

risposta

9

Flot disegna il grafico sull'elemento HTML5 <canvas>. Quindi lo scenario possibile potrebbe essere il seguente:

  1. recuperare i dati di immagine da tela con toDataURL come descritto in this answer.
  2. Creare un PDF con jsPDF, utilizzare addImage come nel primo esempio per incorporare l'immagine in esso.

MA nota, in questo scenario non si vedrà alcun etichette degli assi in immagine, perché non sono disegnati su tela, sono semplici <div> elementi posizionati con position:relative. Ho trovato this post dove l'autore offre un plugin Flot che forza Flot a disegnare del testo su tela, ma non ho idea se funzioni.UPD: Le etichette di disegno su tela sono incluse nella versione 0.8 in arrivo (vedere i commenti).

MA il legenda inoltre non è disegnata su tela, è anche un posizionate correttamente <div>. Sembra che le persone della comunità di Flot stiano cercando di fare qualcosa con questo, ho trovato due richieste di pull, the first che modifica il core, the other introducendo un plugin. Nessuno dei due viene unito per circa 9 mesi e sono contrassegnati per la pietra miliare v. 0.9 che è successiva alla prossima e non ha una data di scadenza. Almeno è possibile clonare quei repository e testare il loro lavoro.

Riprendi: molte persone in tutto Flot si occupano di questo problema, ma purtroppo non c'è stabile, out-of-box modo per farlo - ancora solo la speranza che 0.9 sarà finalmente uscito a volte con questo problema indirizzata.

+2

Il ramo master attuale (0.8.0) in realtà fa disegnare le etichette degli assi alla tela. Finalizzare tale funzionalità (dal momento che molte persone vogliono ancora utilizzare il testo HTML) è l'ultimo elemento di lavoro rimanente prima di rilasciare 0.8.0. Quindi la capacità di disegnare l'intera trama - inclusa la leggenda - su tela fa molto parte dei nostri piani futuri. Non abbiamo unito le due richieste di pull esistenti perché la prima non è implementata correttamente e la seconda non corrisponde al modello che stiamo utilizzando per le etichette degli assi. – DNS

+0

@DNS, grazie per le informazioni "ufficiali"! Ho aggiornato la parte della mia risposta sulle etichette degli assi. – NIA

+0

la richiesta pull che ha modificato il core ha funzionato per me. –

2

Se si può fare questo serveride e si è su un sistema basato su Unix, proverei wkhtmltopdf.

EDITS dopo qualche tempo

Ora un giorno, per fare questo serverside Vorrei utilizzare il impressionante phantomjs. L'ho usato su un progetto basato su flottazione per un po 'di tempo e funziona perfettamente.

+0

Funziona anche su Windows. – ollo

5

Ho creato un JSFiddle con un esempio di come ottenere ciò con Flot + Html2Canvas + jsPDF. Il PDF esportato include assi, legende, ecc.:

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

Sto affrontando lo stesso problema ... il pdf sta funzionando bene, ma la sua pagina non si divide in modo corretto anche con l'aspetto allungato. Qualche risposta aggiornata per questo? –

+0

Come generarlo con più pagine. –

+0

Controlla la funzione ['addPage'] (http://rawgit.com/MrRio/jsPDF/master/docs/global.html#addPage) –

Problemi correlati