Я использую FabricJS на внешнем интерфейсе, чтобы создавать монограммы, а изображения, загруженные на холст, обрезаются в соответствии с дизайном. Fabric использует исходное изображение при генерации SVG, поэтому я обновляю источник изображения до uri данных и отрисовываю холст перед окончательным вызовом toSVG ()
Выше работает, нуждается в доработке, но SVG генерируется и выглядит хорошо.
Теперь, когда мы передаем данные SVG в TCPDF, TCPDF выдает ошибки и создает неполный PDF. Все, кроме встроенного изображения, нарисовано правильно. Часть изображения, однако, представляет собой просто белый квадрат.
Что вызывает сбой TCPDF при разборе образа data-uri?
Warning: Illegal string offset 'masked' in /home/xxx/includes/tcpdf/tcpdf.php on line 7145
Warning: Illegal string offset 'altimgs' in /home/xxx/includes/tcpdf/tcpdf.php on line 7151
Warning: Illegal string offset 'i' in /home/xxx/includes/tcpdf/tcpdf.php on line 20877
Warning: Illegal string offset 'i' in /home/xxx/includes/tcpdf/tcpdf.php on line 20890
Warning: Illegal string offset 'i' in /home/xxx/includes/tcpdf/tcpdf.php on line 7153
Warning: Illegal string offset 'i' in /home/xxx/includes/tcpdf/tcpdf.php on line 7188
Warning: Illegal string offset 'i' in /home/xxx/includes/tcpdf/tcpdf.php on line 7235
Ссылка на данные SVG: http://pastebin.com/SqjYT89Q
Я считаю, что эта проблема вызвана ошибкой в FabricJS. Файл SVG, созданный вами с использованием FabricJS, имеет много экземпляров stroke-dasharray
параметр, используемый в stroke
атрибут path
тэги, за исключением того, что он не включает спецификацию опций, что, согласно спецификациям SVG, неверно:
http://www.w3.org/TR/SVG/painting.html#StrokeProperties
Файл содержит много экземпляров, которые выглядят так:
style="stroke: none; stroke-width: 1; stroke-dasharray: ; stroke-linecap: butt;...
Но на самом деле должно выглядеть так:
style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt;...
Обратите внимание на добавление никто вариант после stroke-dasharray
,
Чтобы проверить эту теорию, я выполнил простой поиск и замену предоставленного вами файла SVG, добавив никто и, как только я это сделал, я смог успешно преобразовать ваш SVG-файл в JPG с помощью Imagick (получил фиолетовый овал с URL-адресом и изображением красивой собаки. :-). Основываясь на этом результате, я вполне уверен, что ошибки TCPDF исчезнут, если эта проблема в файле SVG будет решена.
Надлежащее решение этой проблемы состоит в том, чтобы поднять проблему в проекте FabricJS на GitHub, и, если ваши навыки работы с JavaScript соответствуют этому, вы, вероятно, можете исправить и отправить запрос на извлечение.
Тем временем вы можете обойти эту проблему, запустив входящий SVG-файл через str_replace()
функция, заменяющая все экземпляры stroke-dasharray: ;
с stroke-dasharray: none;
перед передачей данных SVG в TCPDF, и это должно решить вашу проблему.
Других решений пока нет …