Docx
Создание, чтение, правка, заполнение шаблонов и рецензирование Word .docx.
Метаданные навыка
| Источник | Встроенный (установлен по умолчанию) |
| Путь | skills/productivity/docx |
| Версия | 1.1.0 |
| Автор | Nous Research |
| Лицензия | MIT |
| Платформы | linux, macos, windows |
| Теги | word, docx, documents, office, templates, revisions, comments |
| Связанные навыки | pdf, xlsx, powerpoint |
Справочник: полный SKILL.md
Ниже — полное определение навыка, которое Hermes Agent загружает при его активации. Именно этот текст агент получает как инструкцию в момент работы навыка.
Навык Docx
Создание, чтение, правка и заполнение шаблонов Microsoft Word .docx через
python-docx — компактными скриптами командной строки. Навык работает с
текстом, стилями, списками, таблицами, изображениями, колонтитулами,
шаблонизацией через {{token}}, отслеживаемыми правками (список/принять/
отклонить), комментариями (список/добавить/удалить), полями оглавления и
номеров страниц, а также проверкой целостности пакета. Сам документы не
рендерит (для PDF нужен LibreOffice — см. «Конвертация в PDF») и не
редактирует старые .doc.
Когда использовать
- Пользователь просит создать документ Word: отчёт, письмо, договор.
- Нужно получить текст, структуру, стили или встроенные изображения из
.docx. - Нужно изменить существующий
.docx: заменить текст, отредактировать ячейки таблицы, вставить или удалить абзацы, применить стиль, объединить раздробленные прогоны. - Есть шаблон
.docxс{{плейсхолдерами}}, который нужно заполнить данными. - В документе есть отслеживаемые правки, которые нужно просмотреть, принять или отклонить.
- Нужно прочитать комментарии рецензентов либо добавить/удалить комментарий.
.docxне открывается или ведёт себя странно, и нужно разобраться, не повреждён ли файл.- Документу нужно оглавление или колонтитул вида «Страница X из Y».
- Не для: старых
.doc,.odtи WYSIWYG-вёрстки.
Что должно быть установлено
- Python 3.10+ с установленным
python-docx:pip install python-docx(имя модуля при импорте —docx; lxml ставится вместе с ним). - Добавление комментариев (
add) использует нативный API в python-docx= 1.2 и XML-фолбэк в более старых версиях — переключение происходит автоматически.
- Для блоков с изображениями: файлы картинок (PNG/JPEG) должны существовать локально.
Как запускать
Все вспомогательные скрипты лежат в scripts/ рядом с этим файлом.
Запускай их инструментом terminal; каждый поддерживает --help и
печатает JSON в stdout.
python scripts/docx_create.py spec.json out.docx
python scripts/docx_read.py out.docx --text
python scripts/docx_edit.py replace out.docx --find old --replace new
python scripts/docx_template.py tpl.docx values.json filled.docx
python scripts/docx_revisions.py list out.docx
python scripts/docx_comments.py list out.docx
python scripts/docx_validate.py out.docx
Краткая шпаргалка
| Задача | Команда |
|---|---|
| Создать по JSON-спецификации | docx_create.py spec.json out.docx |
| Весь текст (тело + таблицы + колонтитулы) | docx_read.py f.docx --text |
| Структура заголовков + форма таблиц | docx_read.py f.docx --structure |
| Реально используемые стили | docx_read.py f.docx --styles |
| Извлечь встроенные изображения | docx_read.py f.docx --images outdir/ |
| Обнаружить отслеживаемые правки/комментарии | docx_read.py f.docx --revisions |
| Поиск и замена (форматирование сохраняется) | docx_edit.py replace f.docx --find A --replace B -o out.docx |
| Задать ячейку таблицы | docx_edit.py set-cell f.docx --table 0 --row 1 --col 2 --text X |
| Вставить абзац перед индексом N | docx_edit.py insert f.docx --index N --text X --style Normal |
| Удалить абзац N | docx_edit.py delete f.docx --index N |
| Применить стиль к абзацу N | docx_edit.py style f.docx --index N --style "Heading 1" |
| Объединить соседние прогоны с одинаковым форматированием | docx_edit.py normalize f.docx -o out.docx |
| Вставить поле оглавления перед абзацем N | docx_edit.py toc f.docx --index N -o out.docx |
| Колонтитул «Страница X из Y» | docx_edit.py page-numbers f.docx |
Заполнить {{токены}} | docx_template.py tpl.docx values.json out.docx --strict |
| Список правок (id/автор/дата/текст) | docx_revisions.py list f.docx |
| Принять/отклонить все правки | docx_revisions.py accept-all f.docx -o out.docx (или reject-all) |
| Принять/отклонить одну правку | docx_revisions.py accept f.docx --id 3 -o out.docx |
| Список комментариев (+привязанный текст) | docx_comments.py list f.docx |
| Добавить комментарий к фрагменту текста | docx_comments.py add f.docx --target "phrase" --text "note" --author You |
| Удалить комментарий по id | docx_comments.py delete f.docx --id 0 |
| Проверить целостность пакета | docx_validate.py f.docx (код выхода 1 при ошибках) |
Порядок действий
- Создание. Напиши JSON-спецификацию через
write_file, затем запустиscripts/docx_create.py. Спецификация поддерживает:page(размер и поля в мм), строкиheader/footer,footer_page_numbers(добавляет колонтитул с полем «Страница X из Y»),styles(пользовательские стили абзацев — шрифт, размер, bold/italic, hex-цветcolor) иblocks—heading(уровень 1–9),paragraph(либоtext, либо списокruns, где у каждого прогона можно задатьbold/italic/underline),bullet_list,numbered_list,table(строкаheaderвыводится жирным,rows, опциональный встроенный стиль таблицыstyle, напримерTable Grid),image(path, опциональноwidth_mm),toc(поле оглавления) иpage_break. Полный формат спецификации описан в началеscripts/docx_create.py. - Чтение. Используй
scripts/docx_read.pyровно с одним флагом режима.--textвозвращает абзацы тела, текст всех ячеек таблиц и текст колонтитулов в виде JSON.--structureвозвращает структуру заголовков и количество абзацев/таблиц/секций.--images DIRкопирует из пакета все файлы изword/media/. - Правка. Используй
scripts/docx_edit.py. Командаreplaceпроходит по телу документа, таблицам (включая вложенные), колонтитулам и сохраняет форматирование прогонов; добавь--body-only, чтобы пропустить колонтитулы. Передай-o out.docx, чтобы сохранить оригинал; без этого флага правка идёт на месте. Индексы абзацев дляinsert/delete/style/tocсоответствуют порядку тела документа из--structure/--text. Запускайnormalizeпервым делом на документах, которые прошли через тяжёлое редактирование в Word — эта команда объединяет соседние прогоны с одинаковым форматированием, чтобы последующий поиск и замена срабатывал надёжно. - Просмотр правок.
docx_revisions.py listпоказывает каждыйw:insиw:del(id, автор, дата, затронутый текст) — в теле документа, таблицах, колонтитулах, где угодно.accept-all/reject-allразрешают их разом;accept/reject --id Nработает с одной правкой. Accept оставляет вставки и убирает удалённый текст; reject делает наоборот. - Комментарии.
docx_comments.py listвозвращает id, автора, дату, текст каждого комментария и текст документа, к которому он привязан.add --target "фраза"привязывает новый комментарий к первому вхождению этой фразы (прогоны при необходимости разбиваются; форматирование сохраняется).delete --id Nудаляет комментарий и его маркеры, не трогая текст документа. - Шаблон. Размести в документе токены вида
{{name}}. Запустиscripts/docx_template.pyс JSON-объектом значений. Флаг--strictзавершает работу с ошибкой, если остались незаполненные токены; в любом случае JSON-вывод содержит счётчикfilledи списокunfilled_tokens. - Проверка (обязательна): перечитай результат через
--textили--structure, а для всего, что получено хирургией над правками или комментариями, запустиdocx_validate.py.
Конвертация в PDF
Отдельный скрипт не нужен. Если установлен LibreOffice, конвертируй без графического интерфейса:
soffice --headless --convert-to pdf --outdir outdir/ file.docx
Сначала проверь доступность (command -v soffice || command -v libreoffice). Если ни того, ни другого нет, скажи пользователю, что
конвертация в PDF недоступна в этом окружении, вместо того чтобы
изобретать обходной путь — python-docx не умеет рендерить PDF, а для
точной передачи вёрстки нужен настоящий рендерер.
Грабли
- Токены дробятся на прогоны. Word часто разбивает текст на
несколько прогонов. Хелперы замены схлопывают совпавшие прогоны
(замена наследует форматирование первого прогона); если сначала
запустить
docx_edit.py normalize, фрагментация для всех последующих правок снижается. - Полнота обработки правок.
docx_revisions.pyразрешает вставки и удаления на уровне прогонов (подавляющее большинство случаев). Правки на уровне маркера абзаца и строки таблицы, записи об изменении форматирования и перемещения--revisionsтолько обнаруживает, но не разрешает автоматически — см.references/revisions-and-comments.mdи передавай такие случаи в Word. - Ветвление комментариев. Ответы и статус «решено» хранятся в
commentsExtended.xml, который навык не трогает; комментарии, которые он добавляет, — обычные комментарии верхнего уровня, без ветвления. - Результаты полей вычисляет Word.
toc,page-numbersи опции спецификацииtoc/footer_page_numbersзаписывают коды полей. Реальные записи и номера подставляет Word/LibreOffice при открытии файла (Word может предложить обновить поля); python-docx их не вычисляет, поэтому до этого момента виден текст-заполнитель. - Проверка — это health-check, а не валидация схемы.
docx_validate.pyпроверяет zip-архив, обязательные части, относительные ссылки, магические байты изображений и используемые стили. Это НЕ XSD-валидация — файл может пройти проверку и всё равно содержать XML, который не понравится Word. - Имя стиля должно существовать. Применение стиля, которого нет в
документе, вызывает
KeyError. Встроенные стили вродеHeading 1,List Bullet,List Number,Table Gridесть в шаблоне по умолчанию; пользовательские стили нужно сперва объявить в спецификации создания. - Нумерованные списки не всегда начинаются заново.
List Numberопирается на нумерацию Word по умолчанию; отдельные списки в одном документе могут продолжать нумерацию, а не начинать её заново. Предупреждай пользователей, которым нужна точная нумерация нескольких списков. - Запись в ячейку сбрасывает форматирование.
set-cellиспользуетcell.text = ..., что сбрасывает прогоны в ячейке к обычному форматированию. - Кодировка. Все файлы спецификаций и значений JSON читаются явно как UTF-8; не полагайся на локаль по умолчанию, если пишешь собственный связующий код.
- Не распаковывай
.docxи не редактируй XML напрямую. Правь через скрипты (или python-docx); текстовая замена «в лоб» вdocument.xmlлегко ломает файл.patch/write_fileиспользуй только для JSON-входных данных, но не для самого.docx.
Проверка
- После создания, правки или заполнения шаблона запусти
docx_read.py out.docx --textи проверь, что ожидаемые строки появились (а старые исчезли). - После accept/reject
docx_revisions.py listдолжен вернуть[](или только те id, что оставлены намеренно); после хирургии над комментариямиdocx_comments.py listдолжен отражать изменение, а вывод--text— остаться прежним. docx_validate.py out.docxзавершается с кодом 0 и"ok": trueна здоровом пакете — запускай его после любой манипуляции с правками, комментариями или полями.- Для шаблонов запускай с
--strictлибо проверяй, чтоunfilled_tokens == []. - Проверка структуры:
--structureдолжен показывать ожидаемую структуру заголовков и форму таблиц;--stylesподтверждает, что пользовательские стили применились.