tcpdf的imageSVG()方法无法正确呈现svg文件

时间:2018-06-26 11:59:49

标签: tcpdf

我有以下svg文件:

http://jsfiddle.net/wptn28c5/

<svg></svg>
呈现的

svg output

但是,通过使用tcpdf($ pdf-> imageSVG()),我得到了一个呈现以下内容的pdf文件:

pdf output

2 个答案:

答案 0 :(得分:1)

很遗憾,该项目不再得到支持,尽管这是我见过的最出色的工作之一。对于仍在使用它并遇到此问题的用户,问题在于根据SVG specs, the "Z" command

  子路径中的

..导致从当前位置绘制一条自动直线   指向当前子路径的起始点。

这应该将下一个命令的相对路径“重置”到子路径的开头。 TCPDF没有实现这部分。它只是关闭路径,但永远不会将笔移到子路径的起点,这是下一条命令应从此处开始的地方。

为解决此问题,我仅在受保护的 SVGPath 函数的开头创建了两个变量,然后在“ M”(移动)开关中设置了它们的值,以存储每个路径或子路径。

然后,在“ Z”开关中,我只是简单地根据规格说明在存储点绘制了一条线。我已经在不同的SVG中进行了测试,并且效果很好。这是代码。

对于“ M”:

case 'M': { // moveto
foreach ($params as $ck => $cp) {
    if (($ck % 2) == 0) {
        $x = $cp + $xoffset;
    } else {
        $y = $cp + $yoffset;
        if ($firstcmd OR (abs($x0 - $x) >= $minlen) OR (abs($y0 - $y) >= $minlen)) {

            if ($ck == 1) {
                $this->_outPoint($x, $y);
                $firstcmd = false;
            } else {
                $this->_outLine($x, $y);
            }
            $x0 = $x;
            $y0 = $y;
        }
        $xmin = min($xmin, $x);
        $ymin = min($ymin, $y);
        $xmax = max($xmax, $x);
        $ymax = max($ymax, $y);
        if ($relcoord) {
            $xoffset = $x;
            $yoffset = $y;
        }
        $start_x = $x;
        $start_y = $y;
    }
}
break;

对于“ Z”:

case 'Z': {
$x = $start_x;
$y = $start_y;
$this->_outLine($x, $y);
$this->_out('h');
break;

变量为: $ start_x $ start_x ,您可以在函数开始时将每个变量初始化为0值,以避免在路径不正确的情况下出错。 t从移动到开始。

答案 1 :(得分:0)

SVDF标准没有在TCPDF中完全实现,因此并非所有SVG都可以在TCPDF内部正确呈现。在这种情况下,您要么需要使用SELECT Id from (Select *, Row_number() over (partition by tvshow_id,season order by epnum desc) as ranking from tbl)c Where ranking=1 (需要ImageMagick)来为您动态地对SVG进行栅格化,要么将SVG调整为可以使用的形式。

对于这个特定的文件,我怀疑路径的复杂性是问题所在。不过,我不确定。我为您制作了一个新的SVG文件,该文件可在最新版本的TCPDF中使用。 I saved it in a JSFiddle here.基本上,我走了这条路,然后使用InkScape将其分解为各个元素。

为此,我进入了转换组,选择了路径,最后从 Path 菜单中选择了“ Break Apart ”。