Обзор подходов к редактированию docx как xml
Работа с файлами Word без COM (Component Object Model), т. е. без необходимости иметь установленное приложение MS-Word на сервере или рабочем месте пользователя, вызывает постоянный интерес у разработчиков. Об этом свидетельствуют систематически публикуемые на Инфостарте материалы с тем или иным подходом к обработке файлов docx. Статья представляет собой обзор работ на данную тематику, опубликованных разными авторами. Указаны особенности, преимущества и недостатки каждого подхода.
- Описание
- Подробнее
Описание
Оглавление:
Использование именованных полей (свойств документа)
Об устройстве docx как XML
Кратко повторю основные постулаты об устройстве файлов docx. Любой файл docx является архивом zip, достаточно изменить расширение файла, чтобы в этом убедиться. В архиве содержится несколько папок и файлов. Чаще всего разработчиков интересует файл word\document.xml, в котором записано основное текстовое содержимое документа. Картинки, содержимое колонтитулов и примечания записаны в других файлах. На самом деле, стандарт предполагает, что основное содержимое документа не обязательно располагается в файле word\document.xml. Следуя стандарту, нужно сначала прочитать из файла [Content_Types].xml, который всегда располагается в корне zip-архива, элемент "Override" с атрибутом "ContentType" равным "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" и из атрибута "PartName" этого элемента прочитать путь к файлу с основным содержимым документа. Однако, во всех существующих версиях Ворда это всегда будет файл word\document.xml, поэтому большинство авторов рассматриваемых здесь работ пропускают этап с определением расположения требуемой части документа и сразу обращаются к файлу по фиксированному расположению.
Азы работы с содержимым файлов docx изложены в статье [1] и книге [2], электронный вариант которой легко гуглится. Ответы на любые вопросы, традиционно, содержаться в стандарте [3], доступном без ограничений на официальном сайте.
Значительная часть подходов к редактированию docx сводится к размещению в тексте документа специальных текстовых фрагментов, которые затем будут использоваться для определения точек внесения правок в документ. В самом простом случае эти текстовые фрагменты заменяются на новый текст, например "ПодписантФИО" заменяется на "Пупкин В.И.". Однако, текстовые фрагменты можно использовать не только для простой замены текста, они могут указывать место для размещения картинки в тексте, указывать начало или конец большой области текста, которую требуется удалить или переместить в другое место документа, могут указывать строку таблицы, которую нужно продублировать и заполнить значениями и т.д. Общепринятого термина для таких текстовых фрагментов не существует, далее я буду называть текстовые фрагменты, размещенные в документе для целей его автоматического редактирования якорями. Подход с использованием якорей для автоматического редактирования текстовых документов не нов и применялся еще в эпоху COM[4].
XML как текст, наивный поиск
Наиболее ранняя статья по данной теме найденная на Инфостарте [5] опирается на самый простой подход к редактированию документа. Суть подхода в том, что любой файл XML это в первую очередь текст. И в этом тексте присутствуют все якоря, поэтому можно средствами работы с текстовыми файлами просто заменить текст якорей на требуемые значения. Подход вполне рабочий и для каких-то простых задач может подойти. Сразу очевидны и недостатки такого подхода. Поскольку чтения и разбора тегов XML не происходит, в документ невозможно внесение каких-либо более-менее сложных изменений — ни изменить шрифт, цвет, заливку, ни обработать таблицы. По сути, возможна только простая замена одних текстовых строк на другие.
Однако, даже в рамках такого простого подхода возникают нюансы, которые требуется обсудить подробнее. Для этого погрузимся в детали записи документа в файл docx. Совсем упрощено структура файла, в котором записан текст "Hello world!", будет иметь вид:

