You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Docx修改w:cs字体名及字体编码转Unicode技术问询

关于Hacked Font转Unicode字体的Python Docx问题解答

1. 哪些Unicode范围属于「复杂脚本」?是否有相关文档?

复杂脚本指需要上下文字形变换、连写组合、双向排版、元音附标组合等特殊排版处理的书写系统,典型覆盖范围包括:

  • 东南亚脚本:缅甸语(U+1000-U+109F)、泰语(U+0E00-U+0E7F)、高棉语(U+1780-U+17FF)
  • 中东/中亚脚本:阿拉伯语(U+0600-U+06FF)、希伯来语(U+0590-U+05FF)
  • 南亚脚本:天城文(印地语等,U+0900-U+097F)、泰米尔文(U+0B80-U+0BFF)、孟加拉文(U+0980-U+09FF)
  • 其他:蒙古文(U+1800-U+18AF)、藏文(U+0F00-U+0FFF)等

相关标准依据:

  • Unicode核心标准的「Chapter 2: Scripts」章节,明确各脚本分类与特性
  • Unicode字符数据库(UCD)的Script属性,可通过字符属性判断所属脚本类型
  • OpenType规范中的script tags定义,对应各复杂脚本的排版规则

2. Python Docx能否修改或移除w:cs值?

Python-docx高层API未直接提供修改w:cs(复杂脚本字体)的方法,但可通过操作底层XML元素实现需求:

修改w:cs值

from docx import Document

doc = Document("input.docx")
unicode_font = "Myanmar Unicode Font"

for para in doc.paragraphs:
    for run in para.runs:
        # 获取run的字体设置XML节点
        r_fonts = run._element.rPr.rFonts
        # 存在w:cs则修改值,不存在则创建节点
        cs_elem = r_fonts.find("{http://schemas.openxmlformats.org/wordprocessingml/2006/main}cs")
        if cs_elem:
            cs_elem.val = unicode_font
        else:
            new_cs = r_fonts.add_child(r_fonts._element_factory("cs"))
            new_cs.val = unicode_font

doc.save("output.docx")

移除w:cs值

from docx import Document

doc = Document("input.docx")

for para in doc.paragraphs:
    for run in para.runs:
        try:
            r_fonts = run._element.rPr.rFonts
            cs_elem = r_fonts.find("{http://schemas.openxmlformats.org/wordprocessingml/2006/main}cs")
            if cs_elem:
                r_fonts.remove(cs_elem)
        except AttributeError:
            # 无rPr或rFonts节点时跳过
            continue

doc.save("output.docx")

3. 如何通过Python Docx更新fonts.xml和style.xml,使新Unicode字体出现在Word字体列表中?

Python-docx无高层API处理字体注册,但可通过操作文档XML部件完成:

1. 更新fonts.xml(注册新字体)

from docx import Document

doc = Document("input.docx")
unicode_font = "Myanmar Unicode Font"

# 获取fonts.xml部件
fonts_part = doc.part.fonts_part
fonts_root = fonts_part._element

# 添加新字体定义节点
font_node = fonts_root.add_child(fonts_root._element_factory("font"))
name_node = font_node.add_child(fonts_root._element_factory("name"))
name_node.val = unicode_font

# 保存修改
fonts_part._element = fonts_root
doc.save("output.docx")

2. 更新style.xml(替换样式中的旧字体)

from docx import Document

doc = Document("input.docx")
unicode_font = "Myanmar Unicode Font"

# 获取styles.xml部件
styles_part = doc.part.styles_part
styles_root = styles_part._element

# 遍历所有样式中的字体设置节点
for r_fonts in styles_root.findall(".//{http://schemas.openxmlformats.org/wordprocessingml/2006/main}rFonts"):
    # 批量修改ascii、hAnsi、cs字体值
    for tag in ["ascii", "hAnsi", "cs"]:
        elem = r_fonts.find(f"{{http://schemas.openxmlformats.org/wordprocessingml/2006/main}}{tag}")
        if elem:
            elem.val = unicode_font

# 保存修改
styles_part._element = styles_root
doc.save("output.docx")

注意:Word存在字体列表缓存,修改后可能需要重启Word才能看到新字体显示在列表中。


内容的提问来源于stack exchange,提问作者Sven Oly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 03:47:19