Рецензирование DOCX на C#
В этом году я учувствовал в конкурсе по реализации сервиса, который должен проверять формат оформления документов и вносить изменения в режиме правки. Существующие библиотеки либо не решали эту задачу вовсе, либо оказались платными. Было принято решение погрузиться в формат документа MS Word (Office Open XML) и написать свою библиотеку на .net Framework.
Как устроен DOCX
.docx файл – это zip архив. Он содержит в себе разметку и содержание документа в виде xml и других файлов. Его можно распаковать с помощью архиватора:
Document.xml – файл, который содержит в себе разметку параграфов и таблиц документ, за исключением колонтитулов и сносок. Эти блоки вынесены в отдельные файлы.
Содержимое файла:
Мы можем изменить document.xml и\или другие файлы, запаковать все в zip архив, переименовать его в .docx и открыть с помощью MS Word. Если правила разметки не нарушены MS Word сможет его отобразить. На этом принципе основана работа библиотеки TDV.Docx.
Библиотека не охватывает все возможности изменения документа, а лишь основную часть. Добавление параграфов, таблиц, изображений, колонтитулы и рецензирование.
Правки документа
Первым делом нужно подключить библиотеку:
Открытие и сохранение документа:
Далее предполагается, что doc — экземпляр DocxDocument.
Тело документа содержит в себе последовательность параграфов и таблиц.Все эти классы унаследованы от базового Node. Перебирая ноды и ориентируясь на их содержимое можно эффективно осуществлять навигацию по документу.
Каждый параграф содержит параметры стиля. Если параграф содержит ссылку на стиль, сначала применяются параметры стиля, затем параметры параграфа.Например, если в стиле указано выравнивание по центру, а в свойствах параграфа справа в итоге будет выравнивание по правому краю.Аналогично устроены все параметры.
Свойства параграфа содержат в себе свойства Run (w:rPr). Каждый Run так же содержит раздел свойств. Свойства Run более приоритетны чем свойства родительского параграфа.
Получить/установить параметры параграфа несложно:
Класс PStyle содержит в себе все свойства параграфа.
Аналогичным образом устроены стили Run.
Сравнение в режиме правки (рецензирование)
Для редактирования документа в режиме правки придуманы отдельные методы. Их название начинается с «Correct..» или «Compare..».
Исходный документ выглядит так:
Изменение текста параграфа:
Результат:
Изменение стиля параграфа:
Результат:
Описывать весь функционал здесь я не буду, в репозитории есть инструкция с примерами. Библиотека так же позволяет осуществлять рецензирование стилей Run, таблиц, колонтитулов, сносок, вставка и удаление параграфов, работу с изображениями. Подробную информацию можно найти в репозитории на GitHub.
Комментарий недоступен
Нет, скорее наоборот :)
ЗЫ: исправим в следующем релизе