Doc-to-Markdown (Word → Markdown)
Convert Microsoft Word .doc / .docx into:
- a clean Markdown file (
.md) - plus an optional images folder (
*_images/) with relative image links
This is designed to keep Markdown small (good for humans + LLMs) while preserving diagrams.
Quickstart (copy/paste)
# 1) Convert a single file (.docx or .doc)
python3 convert_word_to_markdown.py "path/to/document.docx"
# 2) Embedded mode (single self-contained .md, very large)
python3 convert_word_to_markdown.py --embedded "path/to/document.docx"
# 3) If anything fails, run a dependency check
python3 convert_word_to_markdown.py --checkBatch convert (current folder)
for f in *.doc *.docx; do
[ -e "$f" ] || continue
python3 convert_word_to_markdown.py "$f"
doneOutputs
Default (external images):
document.docx
document.md
document_images/
image1.png
image2.png
...Embedded mode:
document.docx
document.md # contains base64 imagesRequirements
- Recommended (most reliable): install
markitdowninto a local virtualenv in this repo
- bash setup_venv.sh - (manual) python3.11 -m venv.venv + .venv/bin/python -m pip install 'markitdown[all]'
- Alternative: install
markitdownglobally
- python3 -m pip install 'markitdown[all]' (requires Python 3.10+ and markitdown on PATH)
- Fallback:
uv(providesuvx) so the scripts can runmarkitdownwithout pip installs
- macOS: brew install uv
- For
.doc(legacy) support: LibreOffice (brew install --cask libreoffice)
Environment Overrides (for reliability)
MARKITDOWN_UVX_PYTHON=3.11(default) — change the Python version used byuvxMARKITDOWN_UVX_OFFLINE=0— allowuvxto use network (default: offline)MARKITDOWN_CMD="... markitdown"— full command override (advanced)UV_CACHE_DIR=/tmp/uv-cache— use this ifuvxcan’t write to its cache directory (default:./.uv-cache/)
Common Failure Modes
.docconversion fails:
- LibreOffice GUI running → quit LibreOffice (or killall soffice) and retry - If you see Abort trap: 6 / exit 134 in a sandboxed tool runner → pre-convert .doc to .docx outside the sandbox, then convert the .docx
- WMF/EMF diagrams don’t display: in sandboxed environments the WMF/EMF → PNG step may be skipped; convert those images to PNG outside the sandbox if needed
markitdown not found: create./.venv/(recommended) or installmarkitdowngloballyFailed to initialize cache at ~/.cache/uv: setUV_CACHE_DIR=/tmp/uv-cacheand retry
Notes
convert_word_to_markdown.pyis the entrypoint (handles both.docand.docx).convert_with_images.pyis an internal helper and only supports.docx.