【问题标题】:The imageSVG() method of tcpdf is not rendering correctly the svg filetcpdf 的 imageSVG() 方法无法正确渲染 svg 文件
【发布时间】:2019-06-27 15:21:53
【问题描述】:

我有以下 svg 文件:

http://jsfiddle.net/wptn28c5/

<svg></svg>

呈现:

但是,通过使用 tcpdf ($pdf->imageSVG()) 我得到一个 pdf 文件,该文件呈现:

【问题讨论】:

    标签: tcpdf


    【解决方案1】:

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

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

    这应该将下一个命令的相对路径“重置”到子路径的开头。 TCPDF 没有实现这部分;它只是关闭路径,但不会将笔移动到子路径的开头,这是下一个命令的起点。

    所以为了解决这个问题,我只是在受保护的 SVGPath 函数的开头创建了两个变量,并在“M”(moveto)开关中设置它们的值以存储每个路径的开头或子路径。

    然后在“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 值,以避免路径不存在时出现错误不要从移动开始。

    【讨论】:

      【解决方案2】:

      SVG 标准并未在 TCPDF 中完全实现,因此并非所有 SVG 都能按原样在 TCPDF 中正确呈现。对于这些情况,您要么需要使用setRasterizeVectorImages(需要 ImageMagick)为您动态栅格化 SVG,要么将 SVG 调整为可以工作的形式。

      对于这个特定的文件,我怀疑路径的复杂性是问题所在。不过,我并不完全确定。我为您制作了一个在最新版本的 TCPDF 中工作的新 SVG 文件。 I saved it in a JSFiddle here. 基本上,我选择了路径并使用 InkScape 将其分解为单独的元素。

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

      【讨论】:

        猜你喜欢
        • 2014-12-24
        • 2012-06-16
        • 2016-08-19
        • 1970-01-01
        • 1970-01-01
        • 2017-05-26
        • 2012-09-13
        • 2012-03-27
        • 2011-04-07
        相关资源
        最近更新 更多