Появилась задача скомпилировать шаблон в документ Word.
Воспользоваться функцией send_template не получится. По этому решено написать самому. Существует много библиотек для решения этой задачи, но в КБ какая-то уже есть. К сожалению, реализация функция send_template находится в одном из зашифрованных файлов. Прошу Вас сказать какая библиотека используется в КБ для создания Word-документов, чтобы не добавлять лишних библиотек.
![](https://forum.clientbase.ru/public/style_images/master/icon_users.png)
![](https://forum.clientbase.ru/public/style_images/master/profile/default_large.png)
Сообщений в теме: 8
#1
Отправлено 14 Ноябрь 2017 - 10:11
#3
Отправлено 15 Ноябрь 2017 - 09:36
Инструкция по функциям шикарная!
Но меня интересует какую библиотеку для формировании документа вы используете в этой функции? Или Вы сами реализовали формирование документа? Есть несколько ограничений которые не дают реализовать через стандартные шаблоны.
Но меня интересует какую библиотеку для формировании документа вы используете в этой функции? Или Вы сами реализовали формирование документа? Есть несколько ограничений которые не дают реализовать через стандартные шаблоны.
#4
Отправлено 15 Ноябрь 2017 - 10:29
Конкретно для Word реализация самописная, сторонняя библиотека не используется, в отличие например от Excel шаблонов. Реализовывал не я, если что.
#5
Отправлено 21 Ноябрь 2017 - 10:59
Пытаюсь сам реализовать такой функционал... Столкнулся с такой проблемой. Разархивировал документ и заархивировал, после этого MS Word ругается, что документ повреждён. Для работы с архивом использую класс ZipArchive. Подскажите, как Вы работаете с вордовскими документами.
#6
Отправлено 21 Ноябрь 2017 - 14:12
Насколько вижу по коду, конкретно для архивации используется не ZipArchive, а отдельная библиотека, из-за некоторых особенностей файла, вот кусок кода:
ZipArchive не поддерживает выбор компрессии, видимо из-за этого у вас проблема.
// Добавляем файл/директрию в архив // Если файл mimetype, то его нельзя сжимать - уровень компрессии 0 require_once $config['site_path'] . "/include/zlib/zip.lib.php"; $zip = new zipfile(); $zip->addFile($data, $filename, time(), $filename == 'mimetype' ? 0 : -1);
ZipArchive не поддерживает выбор компрессии, видимо из-за этого у вас проблема.
#7
Отправлено 22 Ноябрь 2017 - 08:23
Не понял какой файл нельзя сжимать. Файла с именем mimetype нет внутри архива.
#8
Отправлено 22 Ноябрь 2017 - 09:13
К сожалению подробностей сам не знаю, т.к. делал не я, а спросить не у кого (автор кода давно у нас не работает).
#9
Отправлено 27 Ноябрь 2017 - 09:11
Может кому пригодится...
PS. не говорю что это конечный вариант... данная функция ещё будет мной дорабатываться, но это уже рабочий вариант. Боюсь что потом могу забыть поделиться, поэтому делюсь сейчас.
function compile_template($template_file, $output_file, $data) { $tmp_file_name = tempnam(sys_get_temp_dir(), 'tmp_php_'); copy($template_file, $tmp_file_name); $zip = new ZipArchive(); if ($zip->open($tmp_file_name)) { $settings_content = $zip->getFromName('word/settings.xml'); $settings = new SimpleXMLElement($settings_content); $doc_vars = $settings->{'w:docVars'}; if (!$doc_vars) { $doc_vars = $settings->addChild('w:docVars'); } foreach ($data as $key => $value) { $child = $doc_vars->addChild('w:docVar'); $child->addAttribute('w:name', $key, 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'); $child->addAttribute('w:val', $value, 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'); } $update_fields = $settings->{'w:updateFields'}; if (!$update_fields) { $update_fields = $settings->addChild('w:updateFields'); } $update_fields->addAttribute('w:val', 'true', 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'); $zip->deleteName('word/settings.xml'); $zip->addFromString('word/settings.xml', $settings->asXML()); } $zip->close(); if ($output_file == 'php://output') { header('Cache-Control: max-age=0'); header('Content-Description: File Transfer'); header('Content-Transfer-Encoding: binary'); header('Content-Length: ' . filesize($tmp_file_name)); readfile($tmp_file_name); } else { file_put_contents($output_file, file_get_contents($tmp_file_name)); } unlink($tmp_file_name); }использование
// Для того чтобы скачать скомпилированный шаблон header('Content-Disposition: attachment; filename="Договор.docx"'); compile_template('document.docx', 'php://output', array('ID' => '123')); // или если необходимо сохранить на сервере compile_template('document.docx', 'compiled_document.docx', array('ID' => '123'));
PS. не говорю что это конечный вариант... данная функция ещё будет мной дорабатываться, но это уже рабочий вариант. Боюсь что потом могу забыть поделиться, поэтому делюсь сейчас.
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных