Генерация графиков в PDF-файле с использованием TCPDF
Есть множество тем на эту тему, ни одна из которых не решила мою проблему. То, что я хотел бы сделать, это просто - сгенерировать гистограмму и затем внедрить этот график в файл PDF, который я буду генерировать с помощью библиотеки под названием TCPDF.
У меня нет проблем с генерацией HTML-контента с использованием TCPDF, но когда дело доходит до генерации графика и включения его в файл PDF, у меня возникают всевозможные проблемы.
Генерация графика
Я создаю график, используя библиотеку под названием svggraph. Генерация графика очень проста, единственная проблема заключается в том, что есть заголовки, отправляемые через включение файла основного класса. При отправке заголовков TCPDF не может сгенерировать документ PDF.
Моя настройка сейчас:
generatereport.php - TCPDF генерирует документ pdf на этой странице graph.php - SVGGraph генерирует гистограмму на этой странице
Я пробовал:
file_get_contents('graph.php')
отgeneratereport.php
- ничего не выводится в отчете PDF, когда я использую встроенныйwriteHTML
функция, которую предлагает TCPDF- require_once('graph.php') - заголовки уже отправили ошибку
echo file_get_contents('graph.php')
- Заголовки уже отправлены, но это было ожидаемо. Хорошей новостью является то, что график был отображен правильно.
Цель (что бы я хотел, чтобы) TCPDF имеет встроенную ImageSVG
функция, которая используется для этой конкретной цели. Первый параметр может принимать XML-строку данных SVG; проблема здесь в том, что я не могу понять, как вернуть данные XML из graph.php
страница (я прочитал каждую страницу документации, которую я мог найти).
У кого-нибудь есть опыт использования любой из этих двух библиотек?
Спасибо!
Изменить: некоторый код
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);
}
@
Символ сообщает функции, что ей отправляются данные XML, в отличие от файла SVG.
1 ответ
Использование fetch
- Увидеть ниже
<?php
require_once 'svggraph/SVGGraph.php';
$graph = new SVGGraph(500, 400);
$graph->Values(1, 4, 8, 9, 16, 25, 27);
$output = $graph->fetch('LineGraph');
?>
а затем скормить его в TCPDF (С fetch
без опций генерирует декларацию XML и тип документа) Это должно сгенерировать $output
формата:
<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>
Поток это так
$pdf->ImageSVG('@' . $output, $x=15, $y=30, $w='', $h='', $link='http://www.tcpdf.org', $align='', $palign='', $border=1, $fitonpage=false);
В соответствии с комментарием выше от $VSOverFlow.
Конечно, вы также можете сохранить вывод в файл, а затем указать путь к файлу, например, так
$pdf->ImageSVG($file='images/file.svg', $x=15, $y=30, $w='', $h='', $link='', $align='', $palign='', $border=0, $fitonpage=false);