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