Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Создание печатной формы Microsoft Word с поддержкой PHP

Anna | 31.05.2014 | нет комментариев

Занимаюсь написанием crm модуля в одном диллерском центре. Каждый план делается в вебе. Одной из недавних задач было создание печатной формы, а вернее торгового предложения. И все бы ничего, но документ должен печататься и отдаваться заказчику в руки, а основная проблема была в том, что данный документ был многостраничным и содержал два колонтитула, верхний и боковой. (Таков оказался формальный бланк организации). Вариант решения под катом.

Мой вариант решения

И вот с этими колонтитулами и появилась задача. Я не сумел обнаружить простого решения с применением HTML javascript. С поддержкой HTML дозволено руководить расположением блоков при печати, переносить блок если он не входит целеком и все в таком духе. Как посчитать приблизительный конец страницы и уместить там блок с колонтитулом (с поддержкой javascript) я тоже представляю слабо, от того что существует довольно много нюансов на стороне пользователя. Следственно было принято пойти немножко другим путем, а именно связаться с Microsoft Word.
Известность начальству этой организации, на всякой рабочей станции установлен Microsoft Office 2007.

Выходит, был собран образец в Word’е, тот, что содержал всецело заполненное торговое предложение, с автомтически формируемыми полями и колонтитулами. Оставалось только подставить в надобные места данные заказчика, таблицу со спецификацией товара и контакты администратора. Как это сделать?

Я не стал применять сторонние библиотеки, оказалось довольно того, что документ Microsoft Word (речь идет про *.docx) представляет собой ничто иное, как обыкновенный zip с кучей xml-файлов и прочих источников типа картинок. Распаковав docx мы получаем следующее:
image

Собственно из всех этих файлов нам необходим только один, это document.xml. В нем содержится каждая волнующая нас информация, а именно оглавление нашего документа. От того что данный файл будет служить образцом, его мы старательно извлекаем и располагаем рядом с нашим упакованным документом. Дальше нам остается только взять его содержимое, изменить данные, упаковать его в Word в необходимое место и отправить пользователю в браузер.
Для этого мы используем Zip — растяжение разрешает легко читать и писать как в сами сжатые ZIP архивы, так и в файлы внутри них.

$zip = new ZipArchive;
if ($zip->open('template.docx') === TRUE) {
	/*открываем наш образец для чтения (он находится вне документа)
	и помещаеем его содержимое в переменную $content*/
	$handle = fopen("document.xml", "r");
	$content = fread($handle, filesize("document.xml"));
	fclose($handle);
	/*Далее заменяем все что нам необходимо скажем так */
	$content = str_replace("{customer_r}","Иванов Иван Иванович",$content);

	/*Удаляем имеющийся в архиве document.xml*/
	$zip->deleteName('word/document.xml');
	/*Пакуем сделанный нами ранее и закрываем*/
	$zip->addFromString('word/document.xml',$content);
	$zip->close();
}

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

Если не портить xml то пользователь получит, всецело валидный документ. Если по невнимательности намудрить, то при открытии Word выругается на вас о наличии недопустимых символов, скажет где именно, и попытается поправить.
Дозволено добавлять всякую информацию, скажем таблицы.
Ячейку таблицы дозволено легко вычислить (как и целую строку):

<w:tc><w:tcPr><w:tcW w:w="4783" w:type="dxa"/></w:tcPr><w:p w:rsidR="00BB344C" w:rsidRDefault="00BB344C"><w:r><w:t>Значение в ячейке</w:t></w:r><w:bookmarkStart w:id="0" w:name="_GoBack"/><w:bookmarkEnd w:id="0"/></w:p></w:tc></w:tr>

Ну вот собственно и все.
Если знаете другие методы как решить даную задачу, поделитесь пожалуйста.
Буду дюже благодарен.
Спасибо, что уделили внимание.
P.S. (Мой 1-й пост на прогре)

Источник: programmingmaster.ru

Оставить комментарий
БАЗА ЗНАНИЙ
СЛУЧАЙНАЯ СТАТЬЯ
СЛУЧАЙНЫЙ БЛОГ
СЛУЧАЙНЫЙ МОД
СЛУЧАЙНЫЙ СКИН
НОВЫЕ МОДЫ
НОВЫЕ СКИНЫ
НАКОПЛЕННЫЙ ОПЫТ
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB