Skip to main content

python-docx-ng

python-docx-ng is a Python library for reading, creating, and updating Microsoft Word 2007+ (.docx) files.

It is a downstream superset of python-docx by scanny: everything upstream does, plus features upstream has not adopted. As of 2.0.0 this project tracks upstream v1.2.0 directly, so it builds on upstream's typed and tested core rather than a 2021 snapshot of it.

Installation

pip install python-docx-ng

Note: the importable package is docx, not python_docx_ng — use import docx. python-docx-ng and python-docx therefore cannot be installed side by side.

Python 3.9 through 3.14. The only runtime dependencies are lxml and typing_extensions; lxml is floored at 6.1.0, the first release fixing CVE-2026-41066.

Example

>>> from docx import Document

>>> document = Document()
>>> document.add_paragraph("It was a dark and stormy night.")
<docx.text.paragraph.Paragraph object at 0x10f19e760>
>>> document.save("dark-and-stormy.docx")

>>> document = Document("dark-and-stormy.docx")
>>> document.paragraphs[0].text
'It was a dark and stormy night.'

Documentation

https://toxicphreak.github.io/python-docx-ng/

The upstream python-docx documentation also covers the shared core.

For language models

The site publishes llms.txt and llms-full.txt. Any tool that reads the format can consume them — for example mcpdoc, which serves them to an editor over MCP:

uvx --from mcpdoc mcpdoc --urls python-docx-ng:https://toxicphreak.github.io/python-docx-ng/llms.txt

What this adds over python-docx

Everything upstream v1.2.0 does, plus:

Editing and review

  • Tracked changes — read revisions, and accept or reject them individually or in bulk
  • Comments, footnotes, and cross-run search and replace that survives Word's run splitting
  • A deletion API — .delete() on paragraphs, runs, tables, rows and columns

Content people ask for

  • Fields and a table of contents — Paragraph.add_field(), with builders for PAGE, TOC, REF, SEQ and the rest
  • List numbering — read a paragraph's number, apply a list, restart it
  • Bookmarks, Paragraph.add_hyperlink(), and captions via SEQ
  • Watermarks, text and image, written into the header where Word expects them
  • Floating (anchored) images with text wrapping, alongside inline ones
  • Legacy form fields — read and fill text inputs, check boxes and drop-downs
  • AltChunk — embed HTML, RTF or another .docx for Word to import on open

Formatting

  • Table and cell borders — Table.borders["top"].line = WD_LINE_STYLE.SINGLE
  • Paragraph and run shading, including the pattern and its colour
  • Multi-column section layout, and row dont_split
  • Outline level — drives the outline shown in navigation panes and PDF bookmarks
  • Font scaling, theme typefaces, East Asian and complex-script typefaces
  • Copying a style between documents, with its basedOn/next/link closure and numbering

Files and formats

  • .docm (macro-enabled) and .dotx/.dotm (template) support
  • SVG, EMF, WMF and WebP image support
  • Custom and extended document properties (docProps/custom.xml, docProps/app.xml)
  • Reproducible documents — the same input produces byte-identical output
  • Accepts pathlib.Path anywhere a path is taken

Accessibility

  • Alt text on pictures, inline shapes and tables

Robustness

  • Tolerates oversized attribute values the default lxml parser rejects
  • Corrupt, truncated and password-protected files raise something that says which
  • Custom namespaces in xpath() calls

Some things are deliberately not here yet — reading ISO Strict documents, endnotes, equations, embedded OLE objects and charts among them. See the issue tracker for what is planned, and HISTORY.rst for the full changelog.

Upgrading from 0.9.x

2.0.0 rebases onto upstream v1.2.0 and contains breaking changes. Several 0.9.x additions were dropped in favour of upstream implementations of the same features, which are better tested and differently shaped — notably comments, hyperlinks, and table cell access. Read the migration guide before upgrading.

Development

Requires uv.

uv sync              # create the environment
uv run pytest        # unit tests
make accept          # acceptance tests (behave)
uv run pyright       # type check
uv run ruff check .  # lint

License

MIT — see LICENSE. Originally developed by Steve Canny as python-docx.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

python_docx_ng-2.0.0.tar.gz (6.0 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

python_docx_ng-2.0.0-py3-none-any.whl (350.4 kB view details)

Uploaded Python 3

File details

Details for the file python_docx_ng-2.0.0.tar.gz.

File metadata

  • Download URL: python_docx_ng-2.0.0.tar.gz
  • Upload date:
  • Size: 6.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for python_docx_ng-2.0.0.tar.gz
Algorithm Hash digest
SHA256 8cb69c7159740e8c0e7bea313f3e1d697ec2d864fc60039652a456b27b3a3360
MD5 ded6d8613afebc513bf2e2e6488bb439
BLAKE2b-256 d7509f572d38d092e75dfafa3b911442e61a718b547902aae78bfd135c16d104

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_docx_ng-2.0.0.tar.gz:

Publisher: python-publish.yml on toxicphreAK/python-docx-ng

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_docx_ng-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: python_docx_ng-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 350.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for python_docx_ng-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 330376bf3242af57317ad73b2151d17eec185cbdd5a7c48ee4aaece6ac9f408e
MD5 8320866a08ade670350cea7697bd262d
BLAKE2b-256 a98de47b17bad75d9acd190a5e48d48825fb1db602ac7d006a59309d40921060

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_docx_ng-2.0.0-py3-none-any.whl:

Publisher: python-publish.yml on toxicphreAK/python-docx-ng

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

2.1.0

2 files

This release

2.0.0 This release

2 files

0.9.7

2 files

0.9.6

2 files

0.9.5

2 files

0.9.4

2 files

0.9.3

2 files

0.9.2

2 files

0.9.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page