【问题标题】:Generate graphs in PDF file using TCPDF使用 TCPDF 在 PDF 文件中生成图形
【发布时间】:2013-08-20 16:54:49
【问题描述】:

这方面有很多话题,但没有一个能解决我的问题。我想做的很简单 - 生成一个条形图,然后将此图嵌入到一个 pdf 文件中,我将使用名为 TCPDF 的库生成该文件。

我在使用 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)
?>

生成报告.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 文件。

【问题讨论】:

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

标签: tcpdf svggraph


【解决方案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);

【讨论】:

  • 要接受这个答案,但是,它在技术上并不正确。只需轻轻一点即可编辑答案,以便将来的观众可以使用。
  • 抱歉,有些快速输入并忽略了错误。感谢您的编辑。
  • 获取方法不包括图例。有没有办法来解决这个问题?我确定我给 SvgGraph btw 的图例选项。
  • 我给图例提供了错误的数据。问题解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多