docx
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 conte
By k-dense-ai · 1,564 installs
npx skills add k-dense-ai/scientific-agent-skills --skill docx
Source repository · Upstream listing
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:
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 .
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:
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)
This skill is created and maintained by [Anthropic](https://github.com/anthropics/skills/tree/main/skills/docx). Vendored here unmodified except for frontmatter metadata; see LICENSE.txt for terms.