Генерация документов — взгляд изнутри

в 12:37, , рубрики: генерация документа, Читальный зал, метки:

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

Требовани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 могут не только сотрудники ИТ, но и обученные сотрудники подразделений организаций. Что радует.

Автор: PennyLane

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js