
本文介绍如何借助 pygments 实现 xml(及其他语言)代码的语法高亮,并将其高质量嵌入 word 文档(.docx),突破 python-docx 原生不支持富文本着色的限制。
在 Python 中生成带语法高亮的 .docx 文件,核心难点在于:python-docx 本身不支持按词法(如标签、属性、字符串、注释)逐项设置不同字体颜色或样式——它仅允许对整个段落、运行(run)甚至单个字符应用统一格式,无法自动识别 XML 结构并差异化着色。
因此,正确路径不是手动解析 XML 并“猜”哪些该标红/蓝/绿,而是借助成熟的语法高亮引擎:Pygments。
✅ 推荐方案:用 Pygments 渲染为 HTML → 提取样式化文本 → 用 python-docx 模拟还原
Pygments 是 Python 生态中最权威的通用语法高亮库,内置 XmlLexer,能精准识别
本文档主要讲述的是maven使用方法;Maven是基于项目对象模型的(pom),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。Maven将你的注意力从昨夜基层转移到项目管理层。Maven项目已经能够知道 如何构建和捆绑代码,运行测试,生成文档并宿主项目网页。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
? 示例:将 XML 高亮后插入 Word
from docx import Document
from docx.shared import RGBColor
from lxml import etree
from pygments import highlight
from pygments.lexers import XmlLexer
from pygments.formatters import HtmlFormatter
from bs4 import BeautifulSoup, Tag
def xml_to_highlighted_runs(doc, xml_path, style_name="Code"):
"""将 XML 文件高亮后,以带样式的 runs 插入 doc 的新段落"""
# 1. 解析并美化 XML
tree = etree.parse(xml_path)
xml_str = etree.tostring(tree, pretty_print=True, encoding="unicode")
# 2. 用 Pygments 生成带样式的 HTML(无 head/body,仅 code 标签)
html = highlight(
xml_str,
XmlLexer(),
HtmlFormatter(
full=False, # 不生成完整 HTML 页面
noclasses=True, # 使用内联 style,避免 CSS 依赖
style="vs" # 可选 'default', 'vs', 'emacs', 'monokai' 等
)
)
# 3. 解析 HTML,提取 token + style
soup = BeautifulSoup(html, "html.parser")
code_tag = soup.find("code")
if not code_tag:
raise ValueError("Pygments HTML output missing tag")
# 4. 遍历 HTML 中的子元素(text 或纯文本)
p = doc.add_paragraph()
for elem in code_tag.children:
if isinstance(elem, Tag) and elem.name == "span" and elem.get("style"):
style = elem["style"]
text = elem.get_text()
run = p.add_run(text)
# 解析 style="color:#0000FF; font-weight:bold;" → 设置颜色/粗体等
if "color:" in style:
hex_color = style.split("color:")[1].split(";")[0].strip("# ")
try:
r, g, b = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
run.font.color.rgb = RGBColor(r, g, b)
except (ValueError, TypeError):
pass # 忽略无效颜色
if "font-weight:bold" in style:
run.bold = True
if "font-style:italic" in style:
run.italic = True
elif elem.strip(): # 纯文本节点(如换行符、空格需保留)
p.add_run(elem.strip())
# ✅ 使用示例
doc = Document()
xml_to_highlighted_runs(doc, "example.xml")
doc.save("highlighted_xml.docx")? 依赖安装: pip install python-docx pygments beautifulsoup4 lxml
⚠️ 注意事项与最佳实践
- 字体兼容性:Word 中若未安装高亮主题所用字体(如 Consolas),会回退为默认字体。建议在 HtmlFormatter(style=...) 中指定 font_family="Consolas, 'Courier New', monospace"(需配合自定义 CSS,当前示例用内联 style,故需额外处理)。
-
换行与缩进:etree.tostring(..., pretty_print=True) 保证结构清晰;Pygments 默认保留空白,但 Word 中
不被识别,因此应确保 HTML 输出使用 包裹每行,或手动按 \n 分行处理。 - 性能优化:批量处理多个 XML 文件时,可复用 Document 对象,避免重复初始化;对超大 XML,建议分块高亮或启用 Pygments 的 full=False + nowrap=True 减少 HTML 开销。
-
替代方案权衡:
- ❌ 直接写 OpenXML(.docx 底层):技术门槛高,易出错,不推荐新手;
- ⚠️ 导出 PDF 再转 DOCX:失真风险高,且破坏可编辑性;
- ✅ 当前方案平衡了可靠性、可维护性与专业度,是生产环境首选。
通过 Pygments + python-docx 协同,你不仅能渲染 XML,还可轻松扩展至 Python、JSON、HTML、SQL 等任意 Pygments 支持的语言——只需更换 XmlLexer() 为 PythonLexer() 或 JsonLexer(),即刻获得全语言高亮能力。
立即学习“Python免费学习笔记(深入)”;









