使用TCPDF生成PDF文件中的图表

9
有很多关于这个话题的讨论,但都没有解决我的问题。我想要做的很简单——生成一个条形图,然后将此图嵌入到我将使用TCPDF库生成的pdf文件中。
使用TCPDF生成HTML内容时没有任何问题,但当涉及生成图表并将其包含在pdf文件中时,就会出现各种问题。 生成图表 我正在使用svggraph库创建图表。生成图表非常简单,唯一的问题是通过包含主类文件发送了标头。当发送标头时,TCPDF无法生成PDF文档。
我的设置如下:
generatereport.php - TCPDF在此页面上生成pdf文档 graph.php - SVGGraph在此页面上生成条形图
我已经尝试过:
  • file_get_contents('graph.php')来自generatereport.php - 当我使用TCPDF提供的内置writeHTML函数时,pdf报告中没有任何输出。
  • require_once('graph.php') - 头信息已经发送错误
  • echo file_get_contents('graph.php') - 头信息已经发送,但这是预期的。好消息是图表已经正确显示。

目标(我想要发生的事情) TCPDF有一个内置的ImageSVG函数,用于此特定目的。第一个参数可以接受SVG数据的XML字符串;问题在于我无法弄清楚如何从graph.php页面返回XML数据(我已经阅读了我能找到的每个文档页面)。

有人有使用这两个库的经验吗?

谢谢!

编辑:一些代码

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文件。

我没有尝试过,因此不会将其添加为答案。http://www.goat1000.com/svggraph-using.php第4节讨论了两个选项,以抑制某些返回值的Render()调用。更重要的是,有一个$Fetch函数,它应该生成图形而不将其发送到浏览器。这可能允许您保存SVG文件并在ImageSVG命令中读取。此外,http://www.tcpdf.org/doc/code/classTCPDF.html#a56536508fb1b5aede7d2ed27f56c2353表明@选项需要实际的SVG数据字符串。 - VSOverFlow
1个回答

8
使用 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);

我会接受这个答案,但从技术上讲并不完全正确。我会稍微编辑一下这个答案,以便未来的观众能够理解。 - What have you tried
抱歉,打字太快,有些疏忽错误。感谢您的编辑。 - Vrashabh Irde
fetch方法不包括图例。有没有办法解决这个问题?顺便说一下,我确定我给SvgGraph的图例选项没问题。 - Soroush
我给图例提供了错误的数据。问题已解决。 - Soroush

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接