2013-08-18 22 views
6

Istnieje mnóstwo tematów na ten temat, z których żaden nie ma rozwiązać mój problem. Co chciałbym zrobić, to proste - wygenerować wykres słupkowy, a następnie umieścić ten wykres do pliku PDF, który będę generującego z biblioteką o nazwie TCPDF.Generowanie wykresy w pliku PDF za pomocą TCPDF

mam żadnych problemów generowanie zawartości HTML przy użyciu TCPDF ale jeśli chodzi o generowanie wykresu i włączenie go w pliku pdf, mam wszystkie rodzaje problemów.

Generowanie wykresu

tworzę wykres przy użyciu biblioteki o nazwie svggraph. Generowanie wykresu jest bardzo proste, jedynym problemem jest to, że są nagłówki wysyłane przez włączenie głównego pliku klasy. Po wysłaniu nagłówków protokół TCPDF nie może wygenerować dokumentu PDF.

Moja konfiguracja teraz:

generatereport.php - TCPDF generuje dokument PDF na tej stronie graph.php - SVGGraph generuje wykres słupkowy na tej stronie

ja próbowałem:

  • file_get_contents('graph.php') od generatereport.php - nic nie jest wyprowadzane w raporcie pdf, gdy korzystam z wbudowanej funkcji writeHTML, którą TCPDF oferuje
  • require_once ('graph.php') - nagłówki już wysłane błąd
  • echo file_get_contents('graph.php') - nagłówki już wysłane, ale to było oczekiwane. Dobrą wiadomością jest to, że wykres był wyświetlany prawidłowo.

Gol (Co chciałbym się zdarzyć) TCPDF posiada wbudowany ImageSVG funkcji, które jest używane do dokładnego tego celu. Pierwszy parametr może przyjmować ciąg znaków XML danych SVG; Problem polega na tym, że nie mogę wymyślić, jak zwrócić dane XML ze strony graph.php (przeczytałem każdą stronę dokumentacji, którą mogłem znaleźć).

Czy ktoś ma jakieś doświadczenia z wykorzystaniem jednej z tych dwóch bibliotek?

Dzięki!

Edycja: Niektóre kodu

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); 
} 

@ symbol informuje, że dane XML funkcji jest wysyłane do niego, w przeciwieństwie do pliku SVG.

+0

nie jestem dodanie go jako odpowiedź, ponieważ nie próbowałem go. http://www.goat1000.com/svggraph-using.php Sekcja 4 omawia dwie opcje wywołania Render() w celu powstrzymania pewnych wartości zwracanych. Co ważniejsze, istnieje funkcja $ Fetch, która ma generować wykres bez wysyłania go do przeglądarki. Może to pozwolić na zapisanie pliku SVG i odczytanie w komendzie ImageSVG. Również http://www.tcpdf.org/doc/code/classTCPDF.html#a56536508fb1b5aede7d2ed27f56c2353 sugeruje, że opcja @ wymaga rzeczywistego ciągu danych SVG. – VSOverFlow

Odpowiedz

4

Zastosowanie fetch - Zobacz poniżej

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

a następnie karmić je TCPDF (od fetch bez opcji generuje deklarację XML oraz doctype) To powinno generować $output formatu:

<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> 

Nakarm go w ten sposób:

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

Zgodnie z powyższym komentarzem z $ VSOverFlow.

Oczywiście można również zapisać wynik w pliku, a następnie podać ścieżkę do pliku, podobnie jak

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

Podejście do tej odpowiedzi nie jest jednak technicznie poprawne. Zamierzam edytować odpowiedź, ale wystarczy, aby było to w porządku dla przyszłych widzów. –

+0

Ups, przepraszam za szybkie pisanie i pomijam błędy. Dziękuję za edycję. – Slartibartfast

+0

Metoda pobierania nie zawiera legendy wykresu. Czy istnieje sposób, aby to naprawić? Jestem pewien, jakie opcje legendy dałem SvgGraph btw. – Soroush