Создание модуля генерации документов только на первый взгляд может показаться делом простым. На самом деле, чтобы создать такой модуль, надо решить несколько проблем, без решения которых его реализация будет неполноценной. Функционал генератора документов должен уметь решать проблемы, идущие в виде требований из реальной жизни. Рассмотрим одну из множества проблем.

Требованиe: пользователи\бизнес желают иметь библиотеку пунктов (параграфов), которые вставляются в документы, генерируемые по различным шаблонам. Изменение пункта в библиотеке должно приводить к изменению этого пункта в документах, которые генерируются по этим шаблонам. Изменять пункты хотел бы сам бизнес, без участия ИТ. Составление шаблонов (по которым генерируются документы) с учетом вставки в разные их места пунктов из библиотеки сокращает размер шаблонов, они становятся полиморфными, и, соответственно, уменьшается количество шаблонов и упрощается их сопровождение.

Начальные данные: для удобства работы с пунктами библиотека может состоять, например, из фрагментов документа, создаваемых в MS Word. Т.е. их создание и редактирование производится в MS Word. Библиотечные пункты хранятся, например, в базе данных и\или в файловой папке. Какие конкретно пункты будут вставлены в документ при генерации определяется во время исполнения приложения, которое использует модуль генератора.

Первая задача, которую надо решить, это задача сопряжения отступов текста, указанных в шаблоне, и добавляемых пунктов из библиотеки, сопряжение размеров шрифта и т.п. Данная задача частично решается правилами составления пунктов, выбранным заранее шрифтом и его размером. Отступы же генератор должен определить сам, исходя из контекста того места в шаблоне, куда вставляется пункт. К счастью, такой контекст определить не сложно, поэтому эта задача здесь просто обозначена.

Вторая задача более сложная. Рассмотрим пример пункта и на его основе перечислим проблемы:

[1.2] Библиотечный пункт является примером, составленным г-ном [Ивановым] для демонстрации проблем, описанных в пунктах [2.3] и [3.1] ["Краткого описания"][данного изложения]

В приведенном примере фрагменты текста, помещенные в [...] скобки, должны задаваться параметрически. Т.е. данный библиотечный пункт при вставке в реальный документ мог бы выглядеть так:

3.1 Библиотечный пункт является примером, составленным г-ном Горбунковым С.С. для демонстрации проблем, описанных в пунктах 4.1 и 4.6 "Краткого описания"

Если приложение в момент исполнения может знать о Горбункове С.С. и о том, описание это или изложение, то о том, какой именно номер пункта в шаблоне, 1.2 или 3.1, приложение не знает, да и не должно. Библиотечных пунктов может быть несколько, вставляться они могут в разные места разных шаблонов, нумерация разделов в них не совпадает, да и ссылаться пункты могут на другие пункты, номера которых не должны быть известны приложению. Приложение должно поручить задачи расчета номеров пунктов самому генератору. Шаблоны совместно с генератором должны обеспечивать нумерацию своих и библиотечных пунктов сами, впрочем, как и определение номеров ссылок на пункты.

Например, в одном шаблоне конкретный библиотечный пункт может ссылаться на пункты 4.1 и 4.6, в другом (или в этом же самом) только на пункт 2.5.1. Кроме того, если нумерация пунктов выполняется внутри одного документа, то ссылки могут ссылаться на пункты в другом документе, как, например, «Краткое описание» может быть не генерируемым в данный момент документом, а уже существующим. Все это говорит о том, что библиотечный пункт должен быть параметризован. Если генератор не может выполнять такие операции, то вносить правки в документ придется человеку вручную, а человек может ошибаться.

Например, вид разметки библиотечного пункта может быть такой:

[Счетчик:X] Библиотечный пункт является примером, составленным г-ном [Наименование автора] для демонстрации проблем, описанных в пунктах [Глобальная ссылка:A][ и [Глобальная ссылка:B]] [[Альтернатива:1="Краткого описания"]|[Альтернатива:2=данного изложения]]

Итак, если модуль генератора знает, каково значение счетчика:X до вставки библиотечного пункта, знает значение поля [Наименование автора], имеет информацию о документе «Краткое описание» и может найти в нем конкретные значения глобальных счетчиков (доступных из других документов) с именами A и B этого документа, и если он знает альернативу 1 или 2, то окончательное значение библиотечного пункта вычисляется генератором по входным параметрам и данный пункт можно использовать в разных шаблонах без проблем.

Остается только добавить, что модифицировать такой библиотечный пункт в MS Word могут не только сотрудники ИТ, но и обученные сотрудники подразделений организаций. Что радует.
Поделиться с друзьями
-->

Комментарии (5)


  1. bopoh13
    25.07.2017 16:11

    Справку только пишите к своим шаблонам. Тостер: Универсальный документ


  1. telhin
    25.07.2017 16:13

    Мне кажется, для обозначенных проблем должен неплохо подходить Латех, но у него один большой недостаток: он не MS Word.


    Из текста не понятно реализована ли данная система или это просто рассуждение о проблематике.


    Осознание того, что система сделана в MS Word и вероятно под капотом крутится нечто непонятное из макросов python и visual basic вгоняет в тоску мысли о поддержке данной системы. Индивидуально для себя в принципе можно побаловаться.


    Разработка качественного плагина с поддержкой, расширяемым функционалом и каким-нибудь более приличным дизайном не рентабельна (если вы не собираетесь сделать стартап по этой тематике, а потом продавать плагин по всему миру за 5 баксов/месяц).


    1. SirEdvin
      25.07.2017 16:39

      Зависит от задачи. Если вам нужно сделать документ для печати, то MS Word вам совсем не нужен, pdf хватит. А тут уже полное раздолье, отчеты в latex, pentaho report или чем угодно.


    1. wert_lex
      26.07.2017 13:51

      У латеха есть еще одна проблема, сформулировать её можно так: если у вас есть проблема и вы решили использовать латех, у вас уже две проблемы.


      Латех сам по себе весьма неплох, и позволяет сделать с документом практически всё, что угодно, но сам по себе достаточно сложен, и с автоматизацией тоже не всё так гладко, хотя и решаемо.


  1. intsurfer
    25.07.2017 17:12
    +1

    Ворд для таких задач не нужен, особенно в небольших компаниях — либреофис прекрасно подходит для генерации документов на основе шаблона.