Генерация документов в PHP, ASP.NET используя шаблоны из MS Word

Задача: на веб-сайте, написанном на php или asp.net необходиомо сделать возможность генерации документов или отчётов в форматах pdf, doc, docx, rtf с настраиваемым внешним видом.

Решение: сервис livedocx.

Сервис позволяет используя word документ со специальной разметкой (которая легко создаётся используя MS Word 2003 и выше), используя php или asp.net, сгенерировать документ с необходимой разметкой и данными, например, из базы данных. Для обоих языков существуют библиотеки, при помощи которых для генерации необходимо написать несколько строк кода.

Zend Framework начиная с версии 1.10 включает библиотеку для работы с этим сервисом. Рассмотрим пример кода:

$mailMerge = new Zend_Service_LiveDocx_MailMerge(array(
            'username' => 'логин',
            'password' => 'пароль'
        ));

//set template
$mailMerge->setLocalTemplate('path/to/template');

//add data to document
$mailMerge->assign('report_name','Address report');
$data = array(
     array('first_name'=>'Petr','last_name'=>'Vasiliev'),
     array('first_name'=>'John','last_name'=>'Smith')
);
$mailMerge->assign('names', $data);

//get document
$mailMerge->createDocument();
$doc = $mailMerge->retrieveDocument('pdf');

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

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

Для того, чтобы создать переменную, в которую будут выводиться данные, перейдём в «Вставка -> Экспресс блоки -> Поле», в листбоксе «Поле» выбираем ‘MergeField» и указываем имя, соответствующее первому параметру из метода «assign».

Для вывода массива, необходимо добавить MergeField поля с именами, соответствующими ключам в массиве, и потом их, вместе с необходимой разметкой, объединить используя закладки «blockStart_NAME» и «blockEnd_NAME», где NAME соответствует первому параметру из метода «assign». То есть для нашего примера необходимо создать два MergeField с именами «first_name» и «last_name» и объединить их в закладки «blockStart_names» и «blockEnd_names». Для добавления закладок воспользуйтесь командой «Вставка -> Закладка -> Добавить»

Подробная документация по созданию шаблонов.