УДК 004.91
РАЗРАБОТКА WEB-СЕРВИСА ДЛЯ АВТОМАТИЗИРОВАННОЙ ГЕНЕРАЦИИ ДОКУМЕНТОВ НА ОСНОВЕ DOCX-ШАБЛОНОВ
А. А. Карышев, В.Р. Афанасьев
Рассматривается задача разработки web-сервиса для автоматизации процесса генерации Microsoft Word документов на основе шаблонов. Данная задача решается в рамках разработки системы автоматизированной генерации коммерческих предложений. Рассмотрены ключевые особенности как серверной, так и клиентской частей проектируемой системы. Для создания серверной части использовалась платформа ASP .NETCore, а также механизм авторизации ASP .NET CoreIdentity. Для работы с шаблонами Microsoft Word документов использовалась библиотека Template Engine. Docx. Клиентская часть системы реализована с использованием библиотек React JS и Redux. Практическим результатом работы является web-сервис, позволяющий в автоматизированном режиме генерировать шаблонные Microsoft Word документы. Также в системе реализованы инструменты администрирования данных системы и механизм аутентификации пользователей.
Ключевые слова: web, docx, ASP .NET, шаблонизация, React, Redux.
На предприятиях различного рода деятельности нередко возникает потребность автоматизации процесса создания определенной документации. Ключом к решению данной проблемы является создание специализированного ПО, реализующего необходимую для целевой предметной области бизнес-логику. Для создания системы можно использовать два подхода: разрабатывать систему в виде настольного приложения, которое будет персонально устанавливаться на компьютер каждого конечного пользователя, либо разрабатывать специальный web-сервис. Второй способ является более универсальным, т.к. позволяет разработчику не задумываться о совместимости ПО с ОС конечных пользователей, а также централизованно хранить и администрировать данные, необходимые для работы системы.
При разработке такой системы необходимо учитывать, что, кроме основной бизнес-логики, в системе должен быть реализован механизм аутентификации пользователей для ограничения доступа к системе, а также механизм разделения прав пользователей в системе.
Все вышеперечисленные задачи были решены в рамках разработки системы генерации коммерческих предложений.
Бизнес-логику системы можно представить в виде функциональной модели в нотации IDEF0. Контекстная диаграмма модели системы представлена на рис. 1.
На контекстной диаграмме представлен основной бизнес-процесс системы - генерация коммерческого предложения. На вход данного процесса поступает модель входных данных, имеющая определённую структуру, а на выходе выводится результат генерации КП - готовое КП.
290
Рис. 1. Контекстная диаграмма
На рис. 2 приведена диаграмма системы первого уровня декомпо-
зиции.
Рис. 2.Диаграмма первого уровня
Далее необходимо было определить, с помощью каких инструментов будет разрабатываться данная система.
В качестве платформы для разработки был выбран ASP .NET Core -кроссплатформенный opensource-фреймворк. Аутентификация в системе была реализована с помощью встроенного механизма ASP .NET Corelden-tity [1].
Поскольку основная бизнес-логика системы заключается в генерации документа Microsoft Word по имеющемуся шаблону, было необходимо подобрать подходящий инструмент для работы с Microsoft Word файлами.
Платформа .NET имеет большое количество различных пакетов для работы с документами Microsoft Word, таких, как Open XMLSDK и NPOI. Однако в рамках поставленной задачи было принято решение использовать более высокоуровневое API для работы именно с шаблонами документов, а именно - найти подходящий шаблонизатор для генерации MicrosoftWord документов. В процессе подбора шаблонизатора были рассмотрены такие пакеты, как swxben/docx-template-engine, tssoft/ TsSoft.Docx.TemplateEngine и некоторые другие. Из рассмотренных шаб-лонизаторов самым подходящим оказался TemplateEngine.Docx-OpenSource .NET шаблонизатор docx-документов. Руководство по использованию данной библиотеки размещено на официальной странице TemplateEngine.Docx на github [2]. Данный шаблонизатор использует в качестве шаблона Microsoft Word документ, в котором динамические поля оформлены в виде ContentControls [3].
Преимущества данного шаблонизатора состоят в том, что он предоставляет удобный интерфейс для работы с шаблонами и позволяет оперировать такими сущностями, как строка, список, изображение, таблица.
Кроме того, тот факт, что динамические поля шаблона являются ContentControls, означает, что редактирование параметров этих полей доступно только в режиме разработчика. Поэтому оформлением шаблона может заниматься пользователь, не обладающий специальными навыками, не беспокоясь о том, что шаблон будет испорчен (за исключением случая удаления ContentControl из шаблона). Общий вид шаблона приведен на рис.3.
Headlmage ) Headlmage
création Date Дата создания КП
Коммерческое предложение Appeal Уважаемый Клиент )J !
offerPeserption Текст — описание к о ммерч еск ого предложения
OflerDescrp-txHi
Содержание и стоимость выполняемых работ:
PrfceLïst JSs п/п Наименование Цена 1 шт. Кол-во шт. Стоимость руб.
Amouint
1D- ServceName ПОЗИЦИЯ 1 ServceName (- UniiPrte 333 UnitPrfae j 1
Amount
ИТОГО: PreeSummary 333
Р rceSu mmary
) PrfceLïst ■ )
Рис. 3. Общий вид docx-шаблона
292
Информатика, вычислительная техника и обработка информации
Для работы с шаблонами в разрабатываемом приложении был создан класс TemplateService, содержащий логику генерации документа на основе шаблона и модели входных данных (рис.4).
public NemoryStream С reate By Template (Stream t em plate St rea m. Tern plate '-'odel irradel)
var outputDocument - nevj TemplateProcessor(result). SetRemoveContentControls(true);
Рис. 4. Класс TemplateService
Модель входных данных представляет собой набор классов, описывающих динамические поля шаблона.
Для того, чтобы упростить процесс возможного изменения содержания шаблона, необходимо было реализовать алгоритм заполнения полей таким образом, чтобы он не зависел от набора свойств модели. Для этого наименования свойств объектов были сделаны полностью совпадающими с тэгами соответствующих полей в шаблоне. Далее при заполнении контента шаблона подготовленный объект передается в метод, где с помощью рефлексии выявляются все его свойства, и на основе имени свойства и его значения, полученного из объекта, модель контента заполняется данными (рис. 5).
internal static Content FillT'extContent(this Content content, TextFieldsModel model) {
yar infos - typeof(TextFieldsModel).GetProperties(BindingFlags.Instance | BindingFlags.Public);
-ore□сh (var propertyInfo in infos)
{
var value = propertyInfo .GetValue(iriodel) To5tring() j
if (value != null)
сontenrt.Fields.Add(new F ie ldCointe nt ( propertyInfd.Name, value));
>
return content;
Рис. 5.Расширяющий метод для заполнения модели контента шаблона
текстовыми данными
293
Клиентская часть приложения представляет собой SPA (Singlepa-geapplication) и состоит из двух отдельных представлений - первое является пользовательским интерфейсом для авторизации и активации пользовательских аккаунтов (рис. 6), а второе - интерфейс рабочей области. Рабочая область включает в себя 3 раздела: раздел создания КП;
раздел управления организациями и их прайс-листами; раздел управления пользователями.
Для пользователей, не имеющих прав администратора, второй раздел доступен только в режиме просмотра, а третий раздел будет полностью недоступен. Интерфейс рабочей области в разделе создания КП приведен на рис.7.
Сервис генерации коммерческих предложений
Авторизация
Рис. 6. Страница авторизации
Рис. 7. Страница рабочей области
294
Весь пользовательский интерфейс реализован с использованием библиотеки ReactJS. ReactJS - это JavaScript библиотека для создания пользовательских интерфейсов от компании Facebook[4]. Главной особенностью данной библиотеки является быстрый рендеринг графического интерфейса. Высокая скорость рендеринга достигается за счет использования Virtual DOM (DocumentObjectModel), т.е. вместо того, чтобы взаимодействовать с DOM напрямую, React работает с его легковесной копией. При изменении состояния приложения в первую очередь изменяетсяVirtual DOM, и только после этого изменения вносятся в реальный DOM, причем обновляются только те его узлы, в которых были зарегистрированы изменения.
Еще одной особенностью ReactJS является то, что основной структурной единицей интерфейса является компонент - JavaScript функция, содержащая в себе определенную бизнес-логику и JSX разметку. JSX -собственный синтаксис ReactJS, упрощающий работу с программным интерфейсом компонентов и сочетающий в себе JavaScript и HTML[5].
Для управления состоянием приложения использовалась библиотека Redux. Данная библиотека предоставляет удобный интерфейс для управления состоянием приложения, а также эффективно используется в связке с ReactJS.
Использование данной библиотеки подразумевает построение определенной архитектуры приложения. Поскольку Redux является одной из имплементаций паттерна Flux, архитектура приложения по большей части соответствует принципам данного паттерна.
Архитектура клиентской части построена в соответствии с паттерном Flux, основная идея которого заключается в том, что поток данных в приложении должен быть однонаправленным. При таком подходе приложение разделяется на следующие части:
Action (Действие);
Dispatcher (Диспетчер);
Store (Хранилище);
View (Представление).
Action - объект, который описывает определенное действие системы и сам по себе ничего не делает. Другими словами, Action - глагол системы и в большинстве случаев это просто объект, который хранит в себе строку, содержащую наименование действия. Однако Action также может нести в себе определенные данные, называемые Payload.
Dispatcher в архитектуре Flux отвечает за распределение действий между частями Store. По своей сути Dispatcher - это регистр функций обратного вызова (callbacks), которые выполняются в ответ на определенные действия. В Flux-приложении может быть только один Dispatcher.
Store содержит состояние приложения, а также всю логику изменения этого состояния. Приложение может иметь несколько хранилищ, для нескольких независимых частей, каждое из которых будет иметь собственное состояние. Общая схема изменения состояния изображена на рис. 8.
Action Store Store
Payload -► Current state -► New state
Рис. 8. Схема изменения состояния Store
View отвечает за отображение данных приложения для пользователя, а также предоставляет пользователю интерфейс взаимодействия с системой, т.е. выполняет те же действия, что и представление в архитектуре MVC[6].
Также нужно отметить тот факт, что действия могут возникать не только в результате взаимодействия пользователя с интерфейсом. При определенных условиях хранилище может само создавать действия, чтобы изменить свое состояние. Общая схема взаимодействия вышеописанных частей приложения представлена на рис.9.
Рис. 9. Схема взаимодействия частей приложения
Основные отличия подхода к построению приложений Redux от подхода Flux состоят в том, что Redux не имеет Диспетчера и поддержки множества хранилищ. Вместо этого есть только одно хранилище с одной корневой функцией-редьюсером. И по мере масштабирования приложения, вместо добавления хранилищ, корневой редьюсер разделяется на более мелкие редьюсеры, которые независимо друг от друга обслуживают разные части дерева состояния[7]. Такой подход к построению архитектуры позволяет создавать достаточно гибкие и масштабируемые приложения.
Список литературы
https://docs. microsoft.com/ en-us/aspnet/core/security/authentication/identity (дата обращения: 07.04.2017).
2. Template Engine .Docx - оффициальная страница [Электронный ресурс]. URL: https://github.com/UNIT6-open/TemplateEngine.Docx (дата обращения: 07.04.2017).
3. Overview of Content Controls [Электронныйресурс]. URL: https://msdn.microsoft.com/en-us/library/bb157891.aspx (дата обращения: 07.04.2017).
4. XB Software Блог - «Почему стоит использовать React JS при разработке приложений» [Электронный ресурс]. URL: https://xbsoftware .ru/blog/pochemu-stoit-ispolzovat-react-js-razrabotke-prilozhenij (дата обращения: 07.04.2017).
5. Хортон А., Вайс Р. Разработка веб-приложений в ReactJS. М.:ДМК, 2016. 26 с.
6. BoduchAdam. FluxArchitecture. Packt Publishing. 2016. С. 12-16.
7. Redux-in-russian [Электронныйресурс]. URL: https://github.com/ rajdee/redux-in-russian (дата обращения: 07.04.2017).
Карышев Андрей Анатольевич, канд. техн. наук, доц., [email protected], Россия, Калуга, Калужский филиал Московского государственного технического университета им. Н.Э. Баумана,
Афанасьев Владислав Романович, студент, [email protected],Россия, Калуга, Калужский филиал Московского государственного технического университета им. Н. Э. Баумана
DEVELOPMENT OF WEB-SERVICE FOR AUTOMATED DOCUMENT GENERATION
BASED ON DOCX TEMPLA TES
A.A. Karyshev, V.R. Afanasiev
The task of developing a web-service for automating the process of generating Microsoft Word documents based on templates is considered. This task is being solved in the framework of developing a system for automated generation of commercial offers. The paper considers the key features of both the server and client parts of the system being designed. To create the server part the ASP.NET Core framework and the ASP.NET Core Identity authorization mechanism were used. To work with the templates of Microsoft Word documents, the TemplateEngine.Docx library was used. The client part of the system is implemented using ReactJS and Redux libraries. The practical result of the work is a web-service, which allows you to generate template Microsoft Word documents in automated mode. In addition, the system implements the administration tools of the system data and the mechanism of user authentication.
Key words: web, docx, ASP .NET, Template, React, Redux.
Karyshev Andrey Anatolievich, candidate of technical sciences, docent, a_karyshev@mail. ru, Russia, Kaluga, The Moscow Bauman State Technical University (the Kaluga Branch),
Afanasiev Vladislav Romanovich, student, ya. vladicl@ya. ru, Russia, Kaluga, The Moscow Bauman State Technical University (the Kaluga Branch)
297