DOCX Document Creation and Editing

VerifiedCaution

Create, read, and modify Word documents (.docx/.dotx) using scripts. Includes triggers for reports, memos, and templates.

Sby Skills Guide Bot
DocumentationIntermediate
7/22/2026
Claude CodeCursorCodex
#docx#word-documents#document-generation#document-editing#ooxml

Recommended for

Automated summary

Creates, reads, and edits Word documents (.docx and .dotx templates) either by generating docx-js code or by editing the XML inside the archive directly.

Strengths

  • Spans the full lifecycle: authoring with docx-js, reading with pandoc, editing through unzip-and-modify of word/document.xml
  • Documents the real docx-js footguns (landscape orientation, DXA table widths, bullet numbering, page breaks, positional tab dot leaders)
  • Enforces a visual check by converting the .docx to PDF and rendering page images before delivery
  • Handles tracked changes, comments, and XSD validation with an auto-repair option

Limitations

  • Editing requires leaving the XML unformatted and coalescing fragmented runs, which stays brittle on complex documents
  • docx-js cannot open an existing file, so any modification has to go through raw XML work
  • Relies on external tooling (Node, Python, LibreOffice, pandoc, pdftoppm) being installed locally
  • Does not cover PDFs, spreadsheets, or Google Docs
When to use it

Use it whenever a Word deliverable must be produced or revised: a report, memo, letter, or template with a table of contents, headings, or letterhead.

When not to use it

Skip it for PDFs, spreadsheets, Google Docs, or any coding task unrelated to a Word document.

Security analysis

Caution
Quality score93/100

The skill performs legitimate local document manipulation and explicitly takes precautions against malicious docx symlinks. It uses shell and Python for file conversion, validation, and XML editing, but no destructive, exfiltration, or obfuscated actions are indicated. The main concern is undeclared tool usage and reliance on bundled scripts.

Findings
  • •Skill declares no allowed-tools but instructs execution of shell commands (soffice, pdftoppm, unzip, zip, find) and Python scripts, which requires tool access beyond declared tools.
  • •Runs bundled Python scripts (merge_runs.py, validate.py, accept_changes.py) without showing their code, so trust is placed in the skill package.
  • •Handles untrusted .docx files by stripping symlinks before processing, which is good practice but still involves parsing untrusted ZIP/XML content.
How this analysis is made

Examples

Generate a formatted report
Create a 6-page quarterly report as output.docx with a cover page, an auto-generated table of contents, numbered headings, and a footer with page numbers.
Tracked find-and-replace
In contract.docx, replace every occurrence of 'Acme Corp' with 'Acme Industries' and make sure all edits are recorded as tracked changes under the author name J. Dupont.
Extract content to markdown
Read spec.docx and give me its full content as markdown, keeping the heading hierarchy.

name: docx description: "Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files) or Word templates (.dotx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', '.dotx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation." license: Proprietary. LICENSE.txt has complete terms

DOCX creation, editing, and analysis

A .docx is a ZIP archive of XML files. Choose your approach by task:

| Task | Approach | |---|---| | Create a new document | Write a docx (npm) script — see gotchas below | | Edit an existing document | unzip → edit word/document.xml → zip (docx-js cannot open existing files) | | Read content | pandoc -t markdown file.docx |

Script paths below are relative to this skill's directory.

Creating with docx-js — gotchas

docx is preinstalled — do not run npm install first; write the script and require('docx') directly. Only if that require fails: npm install docx. The model knows the API; these are the footguns:

  • Page size defaults to A4. For US Letter set page: { size: { width: 12240, height: 15840 } } (DXA; 1440 = 1″).
  • Landscape: pass portrait dimensions and orientation: PageOrientation.LANDSCAPE — docx-js swaps width/height internally.
  • Tables need dual widths: set columnWidths on the table AND width on every cell, both in WidthType.DXA (PERCENTAGE breaks in Google Docs). Column widths must sum to the table width.
  • Table shading: use ShadingType.CLEAR, never SOLID (renders black).
  • Lists: never insert • literally; use a numbering config with LevelFormat.BULLET.
  • ImageRun requires type: ("png", "jpg", …).
  • PageBreak must be inside a Paragraph.
  • Never use \n — use separate Paragraph elements.
  • TOC: headings must use built-in HeadingLevel.*; custom heading styles need outlineLevel set or they won't appear.
  • Don't use a table as a horizontal rule — use a paragraph bottom border instead.
  • Dot-leader / right-aligned-on-same-line: use PositionalTab (alignment: PositionalTabAlignment.RIGHT, leader: PositionalTabLeader.DOT) inside a TextRun, not literal . or space padding.

Verify the output

After writing a .docx, render it and look at it:

python scripts/office/soffice.py --headless --convert-to pdf output.docx
pdftoppm -jpeg -r 100 output.pdf page
ls page-*.jpg   # then Read the images

pdftoppm zero-pads page numbers to the width of the page count (page-01.jpg…page-12.jpg).

Editing existing documents

Legacy .doc files must be converted first: python scripts/office/soffice.py --headless --convert-to docx file.doc.

unzip -q doc.docx -d unpacked/
find unpacked -type l -delete   # strip symlink entries — docx from external parties is untrusted
python scripts/merge_runs.py unpacked/   # coalesce fragmented runs so text is findable
# edit unpacked/word/document.xml in place — do NOT reformat or pretty-print
(cd unpacked && rm -f ../out.docx && zip -Xr ../out.docx .)
python scripts/office/validate.py out.docx --original doc.docx   # XSD checks; --auto-repair fixes common issues
# redlining? add --author "<the name you redlined under>" to check every edit is tracked

Word splits text across many <w:r> runs (revision ids, spell-check markers), so a phrase you can see in the document often doesn't exist as a contiguous string in the XML. merge_runs.py merges adjacent identically-formatted runs in word/document.xml without changing content or rendering; it also accepts a .docx directly (python scripts/merge_runs.py doc.docx -o merged.docx).

Tracked changes: when redlining, validate with --author "<the name you redlined under>" (needs --original) — it reports any text you changed without a <w:ins>/<w:del> around it, which is easy to do by accident and invisible in the accepted view. Wrap runs in <w:ins>/<w:del> with w:id, w:author, w:date attributes. Inside <w:del>, the text element is <w:delText>, not <w:t>. A deleted paragraph mark (<w:pPr><w:rPr><w:del w:id=".." w:author=".." w:date=".."/></w:rPr></w:pPr>) means "merge this paragraph into the next" — so deleting a paragraph outright is that plus a <w:del> around every run. The <w:del/> must come before the rPr's other children; their order is schema-enforced.

To produce a clean copy with all tracked changes accepted: python scripts/accept_changes.py in.docx out.docx.

Accepting a deleted paragraph mark should join that paragraph to the one below it, so a paragraph whose runs are all deleted vanishes. Word does this; accept_changes.py and pandoc --track-changes=accept don't always. Both fail the same way — they strip the deleted text but leave the emptied paragraph behind, which reads as a stray empty bullet when it was auto-numbered:

  • pandoc --track-changes=accept never joins the paragraphs.
  • accept_changes.py (LibreOffice) joins them correctly, except when the deleted paragraph is followed by an empty spacer paragraph.

An empty bullet in either view is an artifact of that view, not a defect in the document. Check paragraph deletions in the XML.

Comments

Comments require six cross-linked files. Use the helper — directory mode when you'll also be editing document.xml (saves an unzip/rezip cycle), .docx-direct mode otherwise:

# Against an already-unpacked directory (preferred when also placing markers)
python scripts/comment.py unpacked/ "Fees & expenses cap is too low"
python scripts/comment.py unpacked/ "Agreed" --parent 0

# Against a .docx directly
python scripts/comment.py contract.docx "This cap is too low" -o annotated.docx

The script writes comments.xml, commentsExtended.xml, commentsIds.xml, commentsExtensible.xml, the relationships, and the content-type overrides. Comment IDs are auto-assigned. It then prints the <w:commentRangeStart>/<w:commentRangeEnd>/<w:commentReference> snippet to add to word/document.xml so the comment anchors to specific text — until you place those markers, the comment exists but is not visible.

Dependencies

docx (npm, preinstalled — install only if require('docx') fails) · pandoc · LibreOffice (soffice) · pdftoppm (Poppler)

From the file to a first result

The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.

View the source and supporting files

This download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.

1. Download the file

Download SKILL.md

From the root of a test project, save the file as .skill-downloads/docx-document-creation-and-editing-mrwakgfi/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.

Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.

mkdir -p '.skill-downloads/docx-document-creation-and-editing-mrwakgfi' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/docx-document-creation-and-editing-mrwakgfi/download' --output '.skill-downloads/docx-document-creation-and-editing-mrwakgfi/SKILL.md.part' && mv '.skill-downloads/docx-document-creation-and-editing-mrwakgfi/SKILL.md.part' '.skill-downloads/docx-document-creation-and-editing-mrwakgfi/SKILL.md'

2. Check prerequisites

Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.

Original excerpt: Dependencies

docx (npm, preinstalled — install only if require('docx') fails) · pandoc · LibreOffice (soffice) · pdftoppm (Poppler)

The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.

3. Load the skill

After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.

Claude Code
test -f '.skill-downloads/docx-document-creation-and-editing-mrwakgfi/SKILL.md' && test -s '.skill-downloads/docx-document-creation-and-editing-mrwakgfi/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/docx' && cp -R '.skill-downloads/docx-document-creation-and-editing-mrwakgfi' '.claude/skills/docx'

Cursor
test -f '.skill-downloads/docx-document-creation-and-editing-mrwakgfi/SKILL.md' && test -s '.skill-downloads/docx-document-creation-and-editing-mrwakgfi/SKILL.md' && mkdir -p '.cursor/skills' && test ! -e '.cursor/skills/docx' && cp -R '.skill-downloads/docx-document-creation-and-editing-mrwakgfi' '.cursor/skills/docx'

Codex
test -f '.skill-downloads/docx-document-creation-and-editing-mrwakgfi/SKILL.md' && test -s '.skill-downloads/docx-document-creation-and-editing-mrwakgfi/SKILL.md' && mkdir -p '.agents/skills' && test ! -e '.agents/skills/docx' && cp -R '.skill-downloads/docx-document-creation-and-editing-mrwakgfi' '.agents/skills/docx'

OpenSkills

OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.

Official OpenSkills installation
openskills install './.skill-downloads/docx-document-creation-and-editing-mrwakgfi'

openskills read 'docx-document-creation-and-editing-mrwakgfi'

Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.

For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.

openskills sync

Manual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.

4. Try a first task

Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:

Read .skill-downloads/docx-document-creation-and-editing-mrwakgfi/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.

Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.

Related skills