2013-08-18 27 views
6

Ci sono un sacco di argomenti su questo, nessuno dei quali ha risolto il mio problema. Quello che mi piacerebbe fare è semplice: generare un grafico a barre e quindi incorporare questo grafico in un file pdf che genererò con una libreria denominata TCPDF.Generare grafici in file PDF usando TCPDF

Non ho problemi a generare contenuto HTML tramite TCPDF, ma quando si tratta di generare il grafico e includerlo nel file pdf, sto avendo tutti i tipi di problemi.

Generazione grafico

Sto creando il grafico utilizzando una libreria chiamata svggraph. Generare il grafico è molto semplice, l'unico problema è che ci sono intestazioni inviate attraverso l'inclusione del file di classe principale. Quando vengono inviate le intestazioni, TCPDF non può generare il documento PDF.

La mia configurazione ora:

generatereport.php - TCPDF genera il documento PDF in questa pagina graph.php - SVGGraph genera il grafico a barre in questa pagina

ho provato:

  • file_get_contents('graph.php') da generatereport.php - non viene prodotto nulla nel report in formato PDF quando utilizzo la funzione writeHTML10 integrata che TCPDF offre
  • require_once ('graph.php') - le intestazioni hanno già inviato l'errore
  • echo file_get_contents('graph.php') - Le intestazioni già inviate, ma era previsto. La buona notizia è che il grafico è stato visualizzato correttamente.

Goal (Quello che mi piacerebbe che accada) TCPDF è dotato di un ImageSVG funzione che viene utilizzato per questo scopo esatto. Il primo parametro può prendere una stringa XML di dati SVG; il problema qui è che non riesco a capire come restituire i dati XML dalla pagina graph.php (ho letto ogni pagina di documentazione che ho trovato).

Qualcuno ha esperienza con l'una o l'altra di queste due librerie?

Grazie!

Edit: Alcuni codice

Graph.php:

<?php 
require_once 'svggraph/SVGGraph.php'; 
$graph = new SVGGraph(500, 400); 
$graph->Values(1, 4, 8, 9, 16, 25, 27); 
$graph->Render('LineGraph', true, true) 
?> 

generatereport.php

$html = file_get_contents('http://localhost:8080/vu/graph.php'); 

if(!empty($file)){ 
//$pdf->Write(0, $html, '', 0, 'L', true, 0, false, false, 0); 
//$pdf->writeHTML($html, true, false, true, false, ''); 
$pdf->ImageSVG('@' . $html, $x=15, $y=30, $w='', $h='', $link='http://www.tcpdf.org', $align='', $palign='', $border=1, $fitonpage=false); 
} 

Il simbolo @ indica alla funzione che i dati XML vengono inviati ad esso, al contrario di un file SVG.

+0

io non sono l'aggiunta di come una risposta visto che non ho provato. http://www.goat1000.com/svggraph-using.php La sezione 4 parla di due opzioni della chiamata a Render() per sopprimere determinati valori di ritorno. Ancora più importante, c'è una funzione $ Fetch che dovrebbe generare il grafico senza inviarlo al browzer. Questo potrebbe consentire di salvare il file SVG e leggere il comando ImageSVG. Anche http://www.tcpdf.org/doc/code/classTCPDF.html#a56536508fb1b5aede7d2ed27f56c2353 suggerisce che l'opzione @ richiede la stringa di dati SVG effettiva. – VSOverFlow

risposta

4

Usa fetch - Vedi sotto

<?php 
require_once 'svggraph/SVGGraph.php'; 
$graph = new SVGGraph(500, 400); 
$graph->Values(1, 4, 8, 9, 16, 25, 27); 
$output = $graph->fetch('LineGraph'); 
?> 

e poi alimentarlo a TCPDF (Dal fetch senza opzioni genera la dichiarazione XML e doctype) Questo dovrebbe generare $output del formato:

<svg style="overflow: hidden; position: relative;" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1226" version="1.1" height="826"><image transform="matrix(1.0364,-0.3305,0.3305,1.0364,-41.846,108.0143)" preserveAspectRatio="none" x="10" y="10" width="205" height="154" xlink:href="wallpaper.jpg" opacity="1" stroke-width="1"></image><rect transform="matrix(1.0364,-0.3305,0.3305,1.0364,-41.846,108.0143)" x="165" y="114" width="50" height="50" r="0" rx="0" ry="0" fill="#C0C0C0" stroke="#000" opacity="0" stroke-width="1"></rect><image transform="matrix(1.1575,0.2385,-0.2385,1.1575,-442.1395,-145.4163)" preserveAspectRatio="none" x="500" y="10" width="205" height="154" xlink:href="wallpaper.jpg" opacity="1" stroke-width="1"></image><rect transform="matrix(1.1575,0.2385,-0.2385,1.1575,-442.1395,-145.4163)" x="655" y="114" width="50" height="50" r="0" rx="0" ry="0" fill="#C0C0C0" stroke="#000" opacity="0" stroke-width="1"></rect></svg> 

Feed it like this

$pdf->ImageSVG('@' . $output, $x=15, $y=30, $w='', $h='', $link='http://www.tcpdf.org', $align='', $palign='', $border=1, $fitonpage=false); 

In linea con il commento precedente da $ VSOverFlow.

Naturalmente è anche possibile salvare l'output in un file e quindi fornire il percorso del file in questo modo

$pdf->ImageSVG($file='images/file.svg', $x=15, $y=30, $w='', $h='', $link='', $align='', $palign='', $border=0, $fitonpage=false); 
+0

Accettando questa risposta, tuttavia, non è tecnicamente corretto. Andando a modificare la risposta solo un tocco per farlo bene per i futuri spettatori. –

+0

Oops, scusate un po 'di digitazione veloce e trascurate gli errori. Grazie per la modifica. – Slartibartfast

+0

Il metodo di recupero non include la legenda del grafico. C'è un modo per risolvere questo problema? Sono sicuro delle opzioni della legenda che ho dato a SvgGraph btw. – Soroush