Создание PDF средствами PHP и Inkscape из шаблона

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

Для начала установим нужный софт — Inkscape, в Debian это делается одной командой:

apt-get install inkscape

Inksape — это бесплатный векторный редактор, с помощью его будем создавать шаблон и из этого шаблона будем делать pdf документ. Поэтому его не мешало бы установить и на свой компьютер. Можно создать сложный шаблон с картинками и всеми остальными «плюшками», но мы в учебных целях создадим просто пустую страницу с несколькими блоками для вставки текста.

Простой шаблон для создания pdf

Простой шаблон для создания pdf

Получился вот такой простой шаблон, идем далее. Сохраняем этот шаблон в svg формате. На этом подготовительные действия заканчиваются, переходим к теме заметки.

Для того чтобы сгенерировать pdf нам нужно прочитать файл шаблона, подставить в нужные поля наши значения и создать pdf. Приступим. Напишем функцию которая открывает шаблон и подставляет нужные значения:

function prepareTemplate($template, $templateTmp, $data) {
	$fp = fopen($template, 'r');
	$fpTmp = fopen($templateTmp, 'w+');

	$fileData = fread($fp, filesize($template));
	$fileData = str_replace(array(array_keys($data)), array(array_values($data)), $fileData);

	fwrite($fpTmp, $fileData);

	fclose($fp);
	fclose($fpTmp);
}

Функция очень простая, на вход она принимает три параметра:

  1. Путь к шаблону
  2. Путь к временному файлу (с уже подставленными значениями)
  3. Ассоциативный массив, ключ — имя блока, значение — данные для вставки

Далее она открывает файл шаблона, заменяет в нем нужные поля и сохраняет все изменения во временный файл. Этот временный файл мы и будем конвертировать.

Приступим к достижения нашей цели. Для этого нужно выполнить одну системную команду

inkscape -T /path/to.svg -P /path/to.pdf

Теперь свяжем все это с той функцией что мы написали ранее:

$source = "/tmp/template.svg";
$tmp = "/tmp/templateTmp.svg";
$pdf = "/tmp/file.pdf";

$data = array(
	'{BLOCK_1}' => 'Текст в первый блок',
	'{BLOCK_2}' => 'Текст во второй блок',
	'{BLOCK_3}' => 'Текст в третий блок',
);

prepareTemplate($source, $tmp, $data);

system("inkscape -T {$tmp} -P {$pdf}");

unlink($tmp);

Вот и все! С помощью нехитрых приспособлений и 5 минут времени мы с легкостью генерируем pdf документы из шаблона.

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

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

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