Конвертация SVG с flowed text (из стандарта 1.2) в PDF

Заказчик поставил задачу - создавать PDF документы после хитро заполненной формы из 52 вопросов. Причём структура этого PDF - лист А4 поделённый на 52 ячейки, большая часть из которых треугольная. Сделать хотелось это на shared хостинге beget.

На входе мне была предоставлена PDF-ка "как должно быть". Я не стал особо мудрить, проверил несколько вариантов и решил - нужно создать SVG файл-шаблон, который PHP скрипт после получения заполненных полей из HTML формы будет править и потом каким-нибудь известным плагином преобразовывать в PDF.

Я нарисовал SVG в любимом Inkscape, изучил его xml структуру, научился вносить правки в шаблон и стал искать, как мне преобразовывать SVG в PDF на PHP.

К моему удивлению, никто сделать этого не смог. Всё дело в том, что Inkscape использует близкую к стандарту 1.2 версию SVG где есть возможность нарисовать FLOW блок. Вот его пример.

То есть это многоугольник произвольной формы, в который вписывается текст. Вроде бы всё просто. Но дело в том, что стандарт SVG 1.2, который позволяет Flow тест, так и не был введён в строй. Все поддерживают только 1.1, который был выпущен в 2011 году. А flow  из 1.2  поддерживает только Inkscape. И какой бы я не находил способ преобразовать на PHP мой SVG в PDF, всё было чёрным блоком. Ни cairo ни какой другой софт не понимал этих текстов в многоугольниках.

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

Я попытался поставить Inksacpe через ssh на хостинг beget, даже поддержка хотела помочь, но не смогла - больно много зависимостей.

Выход был найден нетривиальный. У хостера jino.ru был взять VPS на тарифе Alpha за 99р в месяц. Там была быстренько поставлена Ubunto и Inkscape, который умеет работать через командную строку. Минус этого дешёвого VPS - отсутствие IP. Плюс адрес, который даёт jino на этот тариф настолько подозрительный, что зайти на него не дал браузер - мол, в чёрном списке. Но это оказалось не проблема

Далее на PHP был написан скрипт, который делал из полученных полей (ответы на 52 вопроса) SVG файл, по защищённому SFTP пересылал его на VPS, там запускалась команда преобразования. Вот как это работает:

$sftp = new Net_SFTP('xxx.xxx.xxx.vps.myjino.ru', '49309');
if (!$sftp->login('login', 'pass')) {
exit('Login Failed');
}
$sftp->put('/home/foxbox1.svg', 'foxbox5s.php', NET_SFTP_LOCAL_FILE);
$ssh = new Net_SSH2('xxx.xxx.xxx.vps.myjino.ru', '49309');
if (!$ssh->login( 'login', 'pass')) {
exit('Login Failed');
}
echo $ssh->exec('inkscape --without-gui --file=/home/foxbox1.svg --export-pdf=/home/foxbox1.pdf');

и файл отправлялся обратно на shared хостинг.

В итоге, задача была полностью решена, хотя и тянет за собой 99р в месяц помимо основного хостинга. Зато решение элегантно - SVG можно в любой момент поправить, дополнить, а генерация PDF никак не изменится - всё благодаря мощному Inkscape!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *