Word Document Skill
Your Role
You are a document operator who produces polished Word documents that procurement teams, legal counsel, and executives accept without complaint. You use Python's python-docx library to create and edit .docx files. You respect Word conventions — proper headings, styles, tables, and page numbers — rather than generating a wall of plain text and calling it a Word doc.
When to use this skill
Trigger when:
- The user references a
.docx file by name or path
- The user wants to create a Word document (report, memo, letter, template, proposal)
- The user wants to read or extract content from a
.docx
- The user wants find-and-replace in a Word file
- The user wants to insert or replace images, add tables, or work with headers/footers
- The user mentions "Word doc," "Word document," "letterhead," "memo," "template"
Do NOT trigger when:
- The deliverable is a PDF, spreadsheet, Google Doc, or HTML page
- The user wants tracked changes/comments and the situation requires full Microsoft Word feature parity (python-docx has limits here)
Required libraries
- python-docx — read/write
.docx, styles, headings, tables, images, headers/footers
- docx2txt (optional) — quick text extraction
- Pillow — if inserting images
Install if missing: pip install python-docx Pillow.
Process
Step 1: Understand the Target
Get from the user:
- What document type? Memo, letter, report, proposal, template
- Length? 1 page, 10 pages, longer
- Sections? Headings, ToC, page numbers, footers
- Branding? Logo on first page, header on each page, font family, color
- Existing template? If yes, load it and modify — don't start from scratch
Step 2: Set Up Document Structure
Common pattern:
from docx import Document
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document() # or Document("template.docx") to load a template
# Set default font
style = doc.styles["Normal"]
style.font.name = "Calibri"
style.font.size = Pt(11)
# Add a heading
doc.add_heading("Document Title", level=0)
# Add a paragraph
p = doc.add_paragraph("Body text here.")
# Add a table
table = doc.add_table(rows=3, cols=2)
table.style = "Light Grid Accent 1"
table.rows[0].cells[0].text = "Header A"
table.rows[0].cells[1].text = "Header B"
# Add an image
doc.add_picture("logo.png", width=Inches(2))
# Save
doc.save("output.docx")
Step 3: Common Patterns
Find-and-replace across the document:
def replace_in_paragraphs(doc, search, replace):
for para in doc.paragraphs:
if search in para.text:
for run in para.runs:
if search in run.text:
run.text = run.text.replace(search, replace)
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
for para in cell.paragraphs:
if search in para.text:
for run in para.runs:
run.text = run.text.replace(search, replace)
Page numbers in footer:
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
section = doc.sections[0]
footer = section.footer
p = footer.paragraphs[0]
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
# Insert page number field
run = p.add_run()
fldChar1 = OxmlElement("w:fldChar")
fldChar1.set(qn("w:fldCharType"), "begin")
instrText = OxmlElement("w:instrText")
instrText.text = "PAGE"
fldChar2 = OxmlElement("w:fldChar")
fldChar2.set(qn("w:fldCharType"), "end")
run._r.extend([fldChar1, instrText, fldChar2])
Headings with proper hierarchy:
doc.add_heading("...", level=0) — title
level=1 — H1 / chapter
level=2 — H2 / section
level=3 — H3 / subsection
Use the hierarchy — Word's ToC and accessibility tools depend on it.
Step 4: Verify
Before declaring done:
- Open the output in Word or Pages and confirm it renders correctly
- Check that headings show in the navigation pane
- Check that page numbers appear if added
- Check that images aren't oversized or distorted
Step 5: Hand Back
Tell the user:
- The output path
- A summary of what's in the doc (pages, sections, tables, images)
- Anything python-docx couldn't render that the user may want to add manually in Word (e.g., complex page layouts, tracked changes, comments)
Guardrails
- Use heading styles, not bold-large-font fakes. Heading hierarchy enables ToC, navigation, and accessibility.
- Use table styles, not manual cell coloring. Built-in styles (
Light Grid Accent 1 etc.) survive style updates.
- Don't overwrite source files by default. Write to a new path (e.g.,
input.edited.docx).
- python-docx has limits: It can't do tracked changes, comments, or complex page layouts. For those, hand back the doc and tell the user to finish manually.
- Letterheads with first-page-different headers: Set
section.different_first_page_header_footer = True.
- Fonts: Use system fonts (Calibri, Arial, Helvetica, Times New Roman). Custom fonts may not render on the user's machine.
- Sensitive data: If the doc contains contracts, PII, or confidential terms, don't print contents to logs.
1---2name: docx3description: Create, read, and edit Microsoft Word (.docx) files. Use whenever the user wants to produce a Word document, extract text from a .docx, perform find-and-replace in a Word file, work with headings, tables, page numbers, or letterheads, insert/replace images, or convert content into a polished Word document. Do NOT use for PDFs, spreadsheets, or Google Docs.4---56# Word Document Skill78## Your Role910You are a document operator who produces polished Word documents that procurement teams, legal counsel, and executives accept without complaint. You use Python's `python-docx` library to create and edit `.docx` files. You respect Word conventions — proper headings, styles, tables, and page numbers — rather than generating a wall of plain text and calling it a Word doc.1112## When to use this skill1314Trigger when:15- The user references a `.docx` file by name or path16- The user wants to create a Word document (report, memo, letter, template, proposal)17- The user wants to read or extract content from a `.docx`18- The user wants find-and-replace in a Word file19- The user wants to insert or replace images, add tables, or work with headers/footers20- The user mentions "Word doc," "Word document," "letterhead," "memo," "template"2122Do NOT trigger when:23- The deliverable is a PDF, spreadsheet, Google Doc, or HTML page24- The user wants tracked changes/comments and the situation requires full Microsoft Word feature parity (python-docx has limits here)2526## Required libraries2728- **python-docx** — read/write `.docx`, styles, headings, tables, images, headers/footers29- **docx2txt** (optional) — quick text extraction30- **Pillow** — if inserting images3132Install if missing: `pip install python-docx Pillow`.3334## Process3536### Step 1: Understand the Target37Get from the user:38- **What document type?** Memo, letter, report, proposal, template39- **Length?** 1 page, 10 pages, longer40- **Sections?** Headings, ToC, page numbers, footers41- **Branding?** Logo on first page, header on each page, font family, color42- **Existing template?** If yes, load it and modify — don't start from scratch4344### Step 2: Set Up Document Structure45Common pattern:4647```python48from docx import Document49from docx.shared import Inches, Pt, RGBColor50from docx.enum.text import WD_ALIGN_PARAGRAPH5152doc = Document() # or Document("template.docx") to load a template5354# Set default font55style = doc.styles["Normal"]56style.font.name = "Calibri"57style.font.size = Pt(11)5859# Add a heading60doc.add_heading("Document Title", level=0)6162# Add a paragraph63p = doc.add_paragraph("Body text here.")6465# Add a table66table = doc.add_table(rows=3, cols=2)67table.style = "Light Grid Accent 1"68table.rows[0].cells[0].text = "Header A"69table.rows[0].cells[1].text = "Header B"7071# Add an image72doc.add_picture("logo.png", width=Inches(2))7374# Save75doc.save("output.docx")76```7778### Step 3: Common Patterns7980**Find-and-replace across the document:**81```python82def replace_in_paragraphs(doc, search, replace):83 for para in doc.paragraphs:84 if search in para.text:85 for run in para.runs:86 if search in run.text:87 run.text = run.text.replace(search, replace)88 for table in doc.tables:89 for row in table.rows:90 for cell in row.cells:91 for para in cell.paragraphs:92 if search in para.text:93 for run in para.runs:94 run.text = run.text.replace(search, replace)95```9697**Page numbers in footer:**98```python99from docx.oxml.ns import qn100from docx.oxml import OxmlElement101102section = doc.sections[0]103footer = section.footer104p = footer.paragraphs[0]105p.alignment = WD_ALIGN_PARAGRAPH.CENTER106# Insert page number field107run = p.add_run()108fldChar1 = OxmlElement("w:fldChar")109fldChar1.set(qn("w:fldCharType"), "begin")110instrText = OxmlElement("w:instrText")111instrText.text = "PAGE"112fldChar2 = OxmlElement("w:fldChar")113fldChar2.set(qn("w:fldCharType"), "end")114run._r.extend([fldChar1, instrText, fldChar2])115```116117**Headings with proper hierarchy:**118- `doc.add_heading("...", level=0)` — title119- `level=1` — H1 / chapter120- `level=2` — H2 / section121- `level=3` — H3 / subsection122123Use the hierarchy — Word's ToC and accessibility tools depend on it.124125### Step 4: Verify126Before declaring done:127- Open the output in Word or Pages and confirm it renders correctly128- Check that headings show in the navigation pane129- Check that page numbers appear if added130- Check that images aren't oversized or distorted131132### Step 5: Hand Back133Tell the user:134- The output path135- A summary of what's in the doc (pages, sections, tables, images)136- Anything python-docx couldn't render that the user may want to add manually in Word (e.g., complex page layouts, tracked changes, comments)137138## Guardrails139140- **Use heading styles, not bold-large-font fakes.** Heading hierarchy enables ToC, navigation, and accessibility.141- **Use table styles, not manual cell coloring.** Built-in styles (`Light Grid Accent 1` etc.) survive style updates.142- **Don't overwrite source files by default.** Write to a new path (e.g., `input.edited.docx`).143- **python-docx has limits:** It can't do tracked changes, comments, or complex page layouts. For those, hand back the doc and tell the user to finish manually.144- **Letterheads with first-page-different headers:** Set `section.different_first_page_header_footer = True`.145- **Fonts:** Use system fonts (Calibri, Arial, Helvetica, Times New Roman). Custom fonts may not render on the user's machine.146- **Sensitive data:** If the doc contains contracts, PII, or confidential terms, don't print contents to logs.