Метод tSpdf для imageSVG () неправильно отображает SVG-файл - PullRequest
0 голосов
/ 26 июня 2018

У меня есть следующий SVG-файл:

http://jsfiddle.net/wptn28c5/

<svg></svg>

, что делает:

svg output

Однако, используя tcpdf ($ pdf-> imageSVG ()), я получаю pdf-файл, который отображает:

pdf output

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Очень жаль, что проект больше не поддерживается, хотя это одна из лучших работ, которые я когда-либо видел. Для тех, кто все еще использует его и сталкивается с этой проблемой, проблема в том, что в соответствии со спецификациями SVG, команда "Z" :

.. в подпути вызывает автоматическую прямую линию от текущей указать начальную точку текущего подпути.

Это должно «сбросить» относительный путь следующей команды к началу подпути. TCPDF не реализовал эту часть; он просто закрывает путь, но никогда не перемещает перо к началу подпути, откуда и должна начинаться следующая команда.

Итак, чтобы исправить это, я просто создал две переменные в начале защищенной функции SVGPath и установил их значения с помощью переключателя «M» (moveto), чтобы сохранить начало каждого пути или подпути. .

Затем в переключателе «Z» я просто нарисовал линию назад к этой сохраненной точке, основываясь на заявленных спецификациях. Я проверил это в разных SVG и работает довольно хорошо. Вот код ..

Для "М":

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 в начале функции, чтобы избежать ошибок, если путь не начинается с переездом.

0 голосов
/ 30 июня 2018

Стандарт SVG не полностью реализован в TCPDF, поэтому не все SVG будут правильно отображаться в TCPDF как есть. В этих случаях вам нужно либо использовать setRasterizeVectorImages (требуется ImageMagick), чтобы растеризовать SVG на лету, либо настроить SVG в форму, которая будет работать.

С этим конкретным файлом я подозреваю, что проблема заключалась в сложности пути. Хотя я не совсем уверен. Я сделал вам новый файл SVG, который работает в последней версии TCPDF. Я сохранил его здесь в JSFiddle. По сути, я выбрал путь и разбил его на отдельные элементы с помощью InkScape.

Для этого я вошел в группу преобразований, выбрал путь и, наконец, выбрал " Разбить в меню Путь .

...