Страницы

Поиск по вопросам

среда, 25 декабря 2019 г.

Библиотека PHPWord - сохранение шаблона для загрузки

#php #phpword


Вопрос достаточно простой, но ввиду 3х дневного головомойства никак не могу прийти
к решению.
Суть - есть библиотека PHPWord она умеет работать с шаблонами .docx. ОК!
Далее:
Создаю объект
$phpword = new PHPWord();

открываю шаблон
$tpl = $phpword->loadTemplate('tpl.docx');

В нем расставлены переменные по типу ${var}
В PHP коде делаю как надо
$tpl->setValue('var', 'Вставка данных на место переменной');

В конце, когда переменные вставлены нужно сохранить получившийся файл
$tpl->save('mydoc.docx');

В библиотеке PHPWord можно передавать документ сразу на скачивание, если его генерация
идет на лету вот таким вот способом
$writer = PHPWord_IOFactory::createWriter($phpword, 'Word2007');
$writer->save('php://output');

Вопрос: Можно ли так же сделать с созданным шаблоном без его сохранения на диск?
Пробовал засунуть вместо объекта $phpword - $tpl: получал вот такую строчку
$phpword = new PHPWord();
$tpl = $phpword->loadTemplate('tpl.docx');
$tpl->setValue('var', 'Вставка данных на место переменной');
$writer = PHPWord_IOFactory::createWriter($tpl, 'Word2007');
$writer->save('php://output');

пробовал
$tpl->save('php://output');

ничего не вышло. Может Вы подскажете?    


Ответы

Ответ 1



Можно ли так же сделать с созданным шаблоном без его сохранения на диск? Если посмотрите код TemplateProcessor, то заметите что он всегда создает временный файл и работает уже с ним, вызов save() (у неё, кстати, нет параметров) же просто возвращает путь к этому временному файлу (а вот saveAs() позволяет переименовать этот временный файл во что-то нужное вам). Поэтому ответ: нельзя. задан "1 год назад" Не заметил... ну да ладно, с тех пор все равно ничего не поменялось :)

Ответ 2



Как я сделал: $template->save('1.docx'); function file_force_download($file) { if (file_exists($file)) { // сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт // если этого не сделать файл будет читаться в память полностью! if (ob_get_level()) { ob_end_clean(); } // заставляем браузер показать окно сохранения файла header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); // читаем файл и отправляем его пользователю readfile($file); exit; } } file_force_download('1.docx'); unlink('1.docx'); Создал и сохранил в файл, отправил пользователю и удалил. Не знаю на сколько это эффективно, но мою проблему решило быстро.

Комментариев нет:

Отправить комментарий